在opengl2.1中,我将位置和法向量传递给我的顶点着色器。顶点着色器然后将varying
设置为法向量,所以理论上它是在每个三角形上线性插值法线。(我理解这是Phong shading的基础。)
在片段着色器中,我使用法线和兰伯特定律来计算漫反射。这和预期的一样,除了顶点之间的插值看起来很滑稽。具体来说,我看到了星爆效应,其中在顶点之间的边缘有明显的"热点"。
这里有一个例子,不是来自我自己的渲染,但展示了完全相同的效果(见页面中间的金色球体):http://pages.cpsc.ucalgary.ca/slongay/pmwiki-2.2.1/pmwiki.php ? n = CPSC453W11.Lab12维基百科说这是高洛阴影的问题。但据我所知,通过插值法线和运行每个片段的照明计算,我使用的是Phong模型,而不是Gouraud。对吗?
如果我使用更精细的网格,我认为这些恒星爆发将不那么明显。但是增加更多的三角形是解决这个问题的唯一方法吗?我认为有一种方法可以在没有星爆效应的情况下获得平滑的插值。(我当然在其他地方看到过粗糙网格上的完美平滑阴影,比如在3d Studio Max中。但也许他们正在做一些更复杂的事情,而不仅仅是插入法线。
这不是完全的相同的效果。你所看到的是两件事中的一件。
-
在你的片段着色器中使用法线之前没有规范化的结果。
-
由三角形边缘的线性梯度碰撞产生的光学错觉。真的。
本页面底部的"渐变问题"部分(注意:为了充分披露,这是我的教程)详细解释了这一现象。使用插值法线的简单朗伯漫反射有效地在三角形上产生或多或少的线性光。一个有不同法线的三角形会有不同的梯度。它将是C0连续(沿边缘的颜色是相同的),但不是C1连续(沿两个梯度的颜色以不同的速率变化)。
人类的视觉可以识别出这样的梯度差异,并使它们脱颖而出。因此,我们认为他们是硬边,而事实上他们不是。
这里唯一真正的解决方案是进一步镶嵌网格或使用从网格的更精细版本创建的法线贴图,而不是插值法线。
你没有显示你的代码,所以它不可能告诉,但最有可能的问题将是你的片段着色器的非规范化法线。在你的顶点着色器中计算的法线是插值的,这导致向量不是单位长度——所以你需要在计算片段照明之前在片段着色器中重新规范化它们。