【问题标题】:Normal Mapping and Per Vertex Normal法线贴图和每顶点法线
【发布时间】:2011-05-12 23:35:13
【问题描述】:

我是 opengl 编程的新手,我一直在努力为我的 3d 形状进行顶点法线计算,这总是取决于我如何绘制和计算三角形,所以我想知道我是否可以通过使用来避免正常计算法线贴图?

任何帮助和/或参考资料将不胜感激

【问题讨论】:

    标签: opengl-es 3d


    【解决方案1】:

    不,如果使用法线映射,您无法避免正常计算。实际上,您必须为每个顶点计算两个额外的向量,即切线和副法线,以使法线映射起作用。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢!您能否详细说明一下“只有将顶点法线备份到纹理中,您才能摆脱它们”
      • 好的,我会尝试...通常复杂的材质由彩色纹理和法线贴图(也许还有其他,比如高光贴图)组成。这些贴图是在切线空间中创建的——这意味着它们在不知道模型形状的情况下重新使用局部表面坐标。这些贴图中的法线仅添加到插值法线,扰乱它们。如果您希望它们在模型空间中,它们应该包括模型法线并且对于每个模型点都必须是唯一的。
      • @Ricardo, @alxx:将法线烘焙到纹理中比简单的每个顶点法线计算还要复杂。
      • 所以最好调查一下你的法线计算出了什么问题,因为要避免它们要困难得多。 @datenwolf:在同一时间写同样的东西:)
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-03
        • 2011-09-24
        • 2013-09-02
        相关资源
        最近更新 更多