1

在 OpenGL 2.1 中,我将位置和法线向量传递给我的顶点着色器。然后顶点着色器将 a 设置varying为法线向量,因此理论上它是线性插值每个三角形的法线。(我认为这是 Phong 着色的基础。)

在片段着色器中,我使用带有朗伯定律的法线来计算漫反射。这按预期工作,除了顶点之间的插值看起来很有趣。具体来说,我看到了星爆效应,其中沿着顶点之间的边缘有明显的“热点”。

这是一个示例,不是来自我自己的渲染,而是展示了完全相同的效果(请参阅页面中间的金色球体): http: //pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php ?n=CPSC453W11.Lab12

维基百科说这是 Gauaud 阴影的问题。但据我了解,通过对法线进行插值并按片段运行我的光照计算,我使用的是 Phong 模型,而不是 Gouraud。是对的吗?

如果我要使用更精细的网格,我认为这些星暴会不那么明显。但是增加更多的三角形是解决这个问题的唯一方法吗?我认为有一种方法可以在没有星爆效果的情况下获得平滑插值。(我当然在其他地方的粗糙网格上看到过非常平滑的阴影,例如在 3d Studio Max 中。但也许他们正在做一些比仅仅插入法线更复杂的事情。)

4

2 回答 2

6

这不是完全相同的效果。你所看到的只是两件事之一。

  1. 在片段着色器中使用法线之前未对法线进行归一化的结果。

  2. 由三角形边缘的线性渐变碰撞产生的视觉错觉。真的。

    本页底部的“梯度问题”部分(注意:为了充分披露,这是我的教程)详细解释了这一现象。使用插值法线的简单 Lambert 漫反射有效地在三角形上创建或多或少的线性光。具有不同法线集的三角形将具有不同的梯度。它将是 C0 连续的(沿边缘的颜色相同),但不是 C1 连续的(沿两个渐变的颜色以不同的速率变化)。

    人类的视觉会捕捉到这样的梯度差异,并使它们脱颖而出。因此,我们将它们视为硬边,而实际上它们并非如此。

    这里唯一真正的解决方案是进一步细分网格或使用从更精细的网格版本创建的法线贴图而不是插值法线。

于 2011-12-31T21:25:25.237 回答
2

您没有显示您的代码,因此无法判断,但最可能的问题是片段着色器中的非规范化法线。在您的顶点着色器中计算的法线被插值,这导致向量不是单位长度 - 因此您需要在计算片段照明之前在片段着色器中重新标准化它们。

于 2011-12-31T21:21:43.547 回答