4

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

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

但我不知道将哪个参数发送给这些函数。

4

1 回答 1

5

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

如果你这样做,你只会得到面部法线。如果你正在做多面渲染,那很好。并且“发送给这些函数的参数”将是片段的位置,无论您在哪个空间中进行照明。所以显然您的顶点着色器需要计算它并将其传递给片段着色器。

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

这种法线的全部意义在于它们代表了多边形网格所逼近的实际表面。因此,如果您有一个球体,则无论您有多少个顶点,每个顶点位置的法线都应始终直接指向远离球体的中心。

你不能把这样的法线魔法化为存在;您必须根据实际表面或通过启发式计算它们。启发式方法需要查看当前三角形周围的三角形。并且片段着色器无权访问该信息。

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

于 2012-10-29T19:18:32.700 回答