曲面法线OpenGL

时间:2014-11-13 21:16:09

标签: opengl-es

所以,我正在开发一个OpenGL ES 2.0地形渲染程序。 我在山脊上发生了奇怪的绘画。我猜这是由于没有应用表面法线。

所以,我计算了法线。 我知道在其他版本的OpenGL中你可以激活普通数组,它将用于剔除。 要在OpenGL ES中使用法线,我可以激活法线,还是必须在着色器中使用光照算法?

由于

1 个答案:

答案 0 :(得分:0)

OpenGL不使用法线进行剔除。它根据投影三角形的顶点是顺时针还是逆时针排列来进行剔除。具体决定是基于(i)您所说的被认为是面向前方的glFrontFace; (ii)您要求通过glCullFace剔除哪个正面和/或背面三角形; (iii)是否通过glEnable / glDisable启用了剔除。

ES 1.x和2.x中的剔除是相同的。它是一个固定的硬件功能。它是可编程管道的外部(实际上,在ES 2.x可编程管道中很难再现,因为没有着色器,每个三角形的监督)。

如果你没有启用剔除,那么你更有可能在山脊上看到深度缓冲战斗,因为背对着镜头的脸和带镜头前部的脸具有非常相似的深度脊和精度有限会使它们无法正确区分。

ES 1.x中的照明是根据法线计算的。每顶点光照在硬脊上会产生奇怪的问题,因为顶点处的法线通常是在该顶点处连接的面的平均值,因此例如形状类似于\/\/\/\/\的固定网格在每个顶点处以完全相同的法线结束。但是,如果你不使用1.x那么那就不会发生什么。

要在ES 2.x中实现照明,您需要在着色器中执行此操作。因此,以及没有被用于任何其他目的的法线,没有正式的方法将法线指定为任何特殊的东西。它们只是另一个顶点属性,您可以根据需要使用它们。