我想编写一个片段着色器来渲染一个带有闪电的对象,但不使用 gl_Normal;所以我必须自己计算法线。
我想我可以使用函数 dFdx 和 dFdy 来找到两个切向量,然后用它们的向量乘积得到法线。
但我不知道将哪个参数发送给这些函数。
最佳答案
如果你这样做,你只会得到面法线。如果你在做多面渲染,那就没问题了。并且“发送给这些函数的参数”将是片段的位置,无论您在哪个空间进行照明。因此显然您的顶点着色器需要计算它并将其传递给片段着色器。
对于本文的其余部分,我将假设您没有进行分面渲染。您想要平滑的法线来近似平滑的表面。
这种法线的全部意义在于它们代表了多边形网格近似的实际表面。所以如果你有一个球体,无论你有多少个顶点,每个顶点位置的法线应该总是直接指向远离球体的中心。
你不能把这样的法线变成存在;您必须根据实际表面或通过启发式方法计算它们。启发式方法需要查看当前三角形周围的三角形。片段着色器无权访问该信息。
每个人都使用顶点法线;这是标准做法。甚至还有特殊的顶点属性格式来最小化这种法线的大小(GL_INT_2_10_10_10_REV
是最突出的)。所以就做对了。
关于opengl - 在没有glNormal的片段着色器中计算法线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13118953/