Opengl es 法线映射与逐顶点法线

Opengl es 法线映射与逐顶点法线,opengl-es,3d,Opengl Es,3d,我对opengl编程相当陌生,我一直很难获得3d形状的顶点法线计算,这取决于我如何绘制和计算三角形,所以我想知道是否可以通过使用法线贴图避免法线计算 非常感谢任何帮助和/或参考资料法线贴图允许指定要在像素着色器中使用的每像素法线。但这些每像素法线通常只会扰动插值法线,因此无论如何都需要计算它们。只有将顶点法线备份到纹理中时,才能删除它们。否如果使用法线贴图,则无法避免法线计算。实际上,您必须为每个顶点计算两个额外的向量,切线和副法线,以使法线贴图工作 但是我不认为你有什么问题。计算法线是最简单的

我对opengl编程相当陌生,我一直很难获得3d形状的顶点法线计算,这取决于我如何绘制和计算三角形,所以我想知道是否可以通过使用法线贴图避免法线计算


非常感谢任何帮助和/或参考资料

法线贴图允许指定要在像素着色器中使用的每像素法线。但这些每像素法线通常只会扰动插值法线,因此无论如何都需要计算它们。只有将顶点法线备份到纹理中时,才能删除它们。

否如果使用法线贴图,则无法避免法线计算。实际上,您必须为每个顶点计算两个额外的向量,切线和副法线,以使法线贴图工作

但是我不认为你有什么问题。计算法线是最简单的事情。每面和每顶点法线计算的伪代码:

foreach face in model.faces:
    face.normal = crossproduct(
                       model.vertices[face.vertindex[1]].pos - model.vertices[face.vertindex[0]].pos, 
                       model.vertices[face.vertindex[2]].pos - model.vertices[face.vertindex[0]].pos )
    foreach v in face.vertindex:
        model.vertices[v].in_faces.append(face)

foreach vertex in model.vertices:
    vertex.normal = (0,0,0)
    for face in vertex.in_faces:
        vertex.normal += face.normal
    vertex.normal = vertex.normal / length(vertex.normal)

crossproduct(v0, v1):
    return (
        v0.y * v1.z - v0.z * v1.y,
        v0.z * v1.x - v0.x * v1.z,
        v0.x * v1.y - v0.y * v1.x,
    )

可以:使用对象空间法线贴图


切向空间有很大的好处,但它需要有法线+切线对或四元数。

谢谢!你能详细解释一下吗“只有当顶点法线被备份到纹理中时,你才能去掉它们”好的,我会试试。。。通常,复杂材质由彩色纹理和法线贴图(可能还有其他贴图,如镜面反射贴图)组成。这些贴图在切线空间中创建-这意味着它们位于局部曲面坐标中,不知道模型形状。这些贴图中的法线仅添加到插值法线,从而对其进行扰动。如果你想让它们在模型空间中,它们应该包括模型法线,并且对于每个模型点都必须是唯一的。@Ricardo,@alxx:将法线烘焙到纹理中比简单的逐顶点法线计算更复杂。因此最好调查法线的计算出了什么问题,因为要避免它们要困难得多@datenwolf:在同一时间写同样的东西:)