【问题标题】:Transforming normal to view space in Vertex Shader在顶点着色器中将法线转换为视图空间
【发布时间】:2013-07-01 10:10:44
【问题描述】:

当我们想在顶点着色器中计算光照时,我们需要视图空间中的法线向量。一般来说,它看起来如下(来自 OpenGL Superbible 5th):

// normalMatrix is retrieved from GLMatrixStack modelViewMatrix
vec3 vEyeNormal = normalMatrix * vNormal

我想在不使用 GLT 库的情况下编写程序。在另一个来源 (http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Diffuse_Reflection) 中,我发现了以下公式:

vec3 normalDirection = normalize(m_3x3_inv_transp * v_normal);

变量 m_3x3_inv_transp 计算如下:

glm::mat3 m_3x3_inv_transp = glm::transpose(glm::inverse(glm::mat3(mesh.object2world)));

我意识到:

我的问题是为什么在反转和转置矩阵后我得到 NormalMatrix 以及如何通过反转计算来检查它?

【问题讨论】:

    标签: c++ opengl matrix


    【解决方案1】:

    你的假设并不完全正确。

    OpenGL 操作的顺序是缩放、平移、旋转。

    不,通常你可以有一个任意的世界矩阵。这可以包括任意数量的操作。

    逆矩阵是撤消上一次变换。

    没有。如果你反转一个矩阵,它的整个效果就会被反转。例如。如果您有一个绕 x 轴旋转 45° 并平移 (1,2,3) 的矩阵,则其逆矩阵将导致平移 (-1,-2,-3),然后旋转 -绕 x 轴 45°。

    法线矩阵只是模型视图矩阵的旋转分量。

    没有。如果是这种情况,那么您可以丢弃矩阵的平移(和任何透视)部分。但事实并非如此。

    法线矩阵用于变换法线,使它们仍然与相应的表面正交。对于刚体变换(即旋转和平移),您可以直接使用世界变换。原因之一是您可以通过转置来反转旋转矩阵(因为它是正交的)。然后你有 transpose(transpose(world)) 这是原始矩阵。

    对于一般矩阵,您必须按照您的说明计算矩阵。想象一下 (1, 2) 的缩放比例。如果你变换一个圆,它就会变成一个椭圆。让我们看一下 45° 的法线。该位置的圆的法线为 (1, 1)(未归一化)。如果我们用缩放矩阵变换这个法线,我们得到 (1, 2)。如果您想象变换后的椭圆,您会发现法线不再与曲面正交。因此,您必须使用不同的变换(在本例中为 (1, 0.5) 的缩放比例)来保持正交性。

    【讨论】:

    • 感谢您在我的想法中发现错误以及简单实用的答案。
    【解决方案2】:

    根据《3D 游戏编程和计算机图形学的数学》第 66 页的答案(作者 Eric Lengyel):

    曲面上特定点处的切线T 和法线N 必须垂直,因此:

    N . T = 0
    

    假设我们使用矩阵M 变换表面。变换曲面上该点的切线为:

    T' = MT
    

    我们想要找到一个矩阵G 使得N' = GN 是变换曲面上点的法线。由于变换曲面上点的法线和切线必须仍然垂直,我们有:

    0 = N' . T' = (GN) . (MT) = trans(GN) * MT = trans(N) * trans(G) * MT
    

    现在:

    trans(N) * T = N . T = 0
    

    所以如果满足上述条件:

    trans(G) * M = I
    

    出处:

    G = trans(inv(M))
    

    换句话说,转换法线所需的矩阵是用于转换切线的矩阵的逆矩阵的转置。

    【讨论】:

    • 如果我很好理解切向量 (T) 总是垂直于曲面以将其推广到不同形状的曲面,而矩阵 M 用于变换向量 T、N 和该曲面的顶点?
    • @CppMonster:不,法线向量总是垂直于表面(根据定义)。假设表面是一个多边形网格,那么 M 可以用来变换顶点和切向量,但不能用来变换法向量。要转换法线向量,需要使用 M 的倒数的转置,也就是上面所说的。
    • 我匆忙写错了(显然 N 垂直于表面,它是这个线程的基础)。我想写向量 T 垂直于向量 N 以概括不同形状的表面(如果我对切线有很好的理解)。感谢您提供给我的信息,因为它有用且有价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    相关资源
    最近更新 更多