在OpenGL 2.1中,我将一个位置和法线向量传递给顶点着色器。然后,顶点着色器将varying设置为法线向量,因此在理论上它会线性插值每个三角形的法线。(我认为这是Phong着色的基础。)
在片段着色器中,我使用带有Lambert定律的法线来计算漫反射。除了顶点之间的插值看起来很滑稽之外,它的工作方式与预期相同。具体地说,我看到了一种星暴效应,在顶点之间的边缘上有明显的“热点”。
下面是一个示例,不是来自我自己的渲染,而是演示了完全相同的效果(请参阅页面下方的金色球体):http://pages.cpsc.ucalgary.ca/~slongay/pmwiki-2.2.1/pmwiki.php?n=CPSC453W11.Lab12
Wikipedia says这是高罗着色的一个问题。但据我所知,通过对法线进行插值并按片段运行光照计算,我使用的是Phong模型,而不是Gouraud。是那么回事吗?
如果我使用更精细的网格,我假设这些星暴将不会那么明显。但是添加更多的三角形是解决这个问题的唯一方法吗?我认为有一种方法可以在没有星暴效应的情况下获得平滑的插值。(我肯定在其他地方的粗糙网格上看到过完美平滑的着色,例如在3d Studio Max中。但也许他们正在做一些比插值法线更复杂的事情。)
发布于 2012-01-01 05:25:25
这并不是完全相同的效果。你看到的是两件事中的一件。
"Gradient Matters" section at the bottom of this page (注意:为了充分披露,这是我的教程)详细解释了这一现象。使用插值法线的简单Lambert漫反射有效地在三角形上创建或多或少的线性灯光。具有不同法线集的三角形将具有不同的渐变。它将是C0连续的(沿边缘的颜色相同),但不是C1连续的(沿两个渐变的颜色以不同的速率变化)。
人类的视觉能够捕捉到像这样的梯度差异,并使它们脱颖而出。因此,我们认为它们是硬边缘,而实际上它们不是。
这里唯一真正的解决方案是进一步细分网格,或者使用从网格的更精细版本创建的法线贴图,而不是插值法线。
发布于 2012-01-01 05:21:44
您不会显示代码,因此无法判断,但最有可能的问题是片段着色器中的未规范化法线。在顶点着色器中计算的法线是插值的,这会导致向量不是单位长度-因此在计算片段照明之前,需要在片段着色器中重新规格化它们。
https://stackoverflow.com/questions/8690605
复制相似问题