法线贴图和每顶点法线

时间:2011-05-12 10:01:30

标签: opengl-es 3d

我对opengl编程比较陌生,我总是很难为我的3d形状进行顶点法线计算,它总是取决于我如何绘制和计算三角形,所以我想知道我是否可以通过使用来避免正常的计算法线贴图?

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

3 个答案:

答案 0 :(得分:3)

如果使用法线贴图,则无法避免正常计算。实际上你要为每个顶点计算两个额外的向量,正切和副正常,以使法线贴图起作用。

但是我没有看到你的问题。计算法线是最简单的事情。每面和每顶点法线计算的伪代码:

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,
    )

答案 1 :(得分:0)

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

答案 2 :(得分:0)

是的,您可以:使用对象空间法线贴图。

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