在没有glNormal的情况下计算片段着色器中的法线

时间:2012-10-29 09:35:43

标签: opengl shader fragment

我想编写一个片段着色器来渲染带有闪电的对象,但不使用gl_Normal;所以我必须自己计算正常值。

我想我可以使用函数dFdx和dFdy来找到两个切向量,然后用它们的矢量积得到正常值。

但我不知道要向这些函数发送哪个参数。

1 个答案:

答案 0 :(得分:4)

  

我想我可以使用函数dFdx和dFdy来找到两个切向量,然后用它们的矢量积得到正常值。

如果你这样做,你只能得到面部正常。如果你正在做分面渲染,那就没事了。并且“发送到这些函数的参数”将是片段的位置,无论你在哪个空间进行照明。显然你的顶点着色器需要计算并将它传递给片段着色器。

对于本文的其余部分,我假设您进行分面渲染。您希望平滑法线接近光滑表面。

此类法线的重点在于它们代表实际表面,您的多边形网格近似。因此,如果你有一个球体,无论你有多少个顶点,每个顶点位置的法线都应该总是直接指向球体的中心。

你不能将这样的法术变成魔法;你必须根据实际表面或通过启发式计算它们。启发式方法需要查看当前三角形周围的三角形。片段着色器无法访问该信息。

每个人都使用顶点法线;这是标准做法。甚至还有特殊的顶点属性格式来最小化这些法线的大小(GL_INT_2_10_10_10_REV是最突出的)。所以就这么做吧。

相关问题