gpt4 book ai didi

c++ - 在顶点着色器中将法线转换为 View 空间

转载 作者:太空狗 更新时间:2023-10-29 20:27:03 25 4
gpt4 key购买 nike

当我们想要在顶点着色器中计算光时,我们需要 View 空间中的法 vector 。一般来说,它看起来如下(来自 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 以及如何用求逆计算来检查它?

最佳答案

您的假设并不完全正确。

Order of OpenGL operations is Scalng, Translating, Rotating.

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

Inversing matrix is undo last transformation.

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

Normal matrix is only rotation component of modelview matrix.

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

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

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

关于c++ - 在顶点着色器中将法线转换为 View 空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17401922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com