Opengl es 曲面法线OpenGL

Opengl es 曲面法线OpenGL,opengl-es,Opengl Es,所以,我仍然在开发OpenGLES2.0地形渲染程序。 我在山脊顶端画了一幅奇怪的画。我猜这是因为没有应用曲面法线 所以,我计算了法线。 我知道在OpenGL的其他版本中,您可以只激活普通数组,它将用于剔除。 要在OpenGL ES中使用法线,我可以只激活法线,还是必须在着色器中使用照明算法 谢谢OpenGL不使用法线进行剔除。它根据投影三角形的顶点是顺时针还是逆时针排列进行剔除。具体决定基于(i)您所说的通过glFrontFace面向前方的方式;(ii)您要求通过glCullFace剔除哪个正

所以,我仍然在开发OpenGLES2.0地形渲染程序。 我在山脊顶端画了一幅奇怪的画。我猜这是因为没有应用曲面法线

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


谢谢

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

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

如果未启用消隐功能,则更可能看到深度缓冲区在山脊处发生冲突,因为背面朝向摄影机的面和正面朝向摄影机的面具有非常相似的深度,接近山脊,且精度有限,无法正确区分

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


要在ES 2.x中实现照明,需要在着色器中实现。因此,由于法线没有用于任何其他目的,因此没有正式的方法将法线指定为任何特殊的东西。它们只是另一个顶点属性,你可以随心所欲地使用它们。

你能提供任何屏幕截图吗?因此,计算机图形学更像是一个利基。然而,一张图片可能会告诉经验丰富的开发人员一千多个单词。我使用的是ES 2.0。我确实启用了剔除功能,并且我的缠绕顺序很好。有趣的是,在1.0中,照明是从法线计算的。我听说过一些关于Z打斗的事情,这可能是个问题。。。。在这种情况下,后续问题将是投影矩阵是否尽可能最大限度地使用可用深度范围,如果您正在绘制地形,则投影矩阵是否以足够规则的模式排列(例如,它是一个高度贴图),以便在没有深度缓冲的情况下正确渲染。如果是这样的话,那么最明智的做法可能是使用正确的值初始化深度缓冲区,然后使用轻微的偏移进行前后渲染。因此,在存在歧义的情况下,front仍然会过度渲染,但启动有望放弃大部分昂贵的碎片计算。(在真实绘制过程中禁用深度写入,因此您可以像往常一样渲染非地形对象)我的地形以足够规则的模式排列,因为它们是高度地图文件中以米为单位的z值。您所说的“使用正确的值初始化深度缓冲区,然后以略微偏移的方式渲染回前端”是什么意思?另一方面:在构建投影矩阵时,对近剪裁平面和远剪裁平面进行更精确的计算是否会提高深度缓冲区的精度?如果在没有深度缓冲区的情况下从前到后进行渲染,您将获得正确的视图,但对于许多从未见过的碎片,您将花费大量精力在碎片着色上。如果您首先使用一个非常简单的着色器(并且
glColorMask
设置为禁用东西)进行绘制,那么您将把正确的值放入深度缓冲区。如果随后在启用深度测试、法线着色器和轻微的
glPolygonOffset
的情况下向后绘制到前面,则将获得正确的绘制顺序,大多数不可见片段将在不进行处理的情况下被丢弃。