opengl - 为什么我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?

标签 opengl texture-mapping skybox

我正在关注 this使用环境贴图创建天空盒/立方体贴图的教程。我在理解顶点着色器中的计算时遇到了一些问题:

#version 330 core
layout (location = 0) in vec3 position;
layout (location = 1) in vec3 normal;

out vec3 Normal;
out vec3 Position;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * vec4(position, 1.0f);
    Normal = mat3(transpose(inverse(model))) * normal;
    Position = vec3(model * vec4(position, 1.0f));
}

在这里,作者在将法线传递给片段着色器以计算反射纹理之前计算法线:

Normal = mat3(transpose(inverse(model))) * normal;

我的问题是,这个计算到底做了什么?为什么在与法线相乘之前必须先计算模型矩阵的逆矩阵的转置?

最佳答案

如果不这样做,不均匀的缩放会扭曲法线。我认为这总结了图片,比我可能做的更好:http://www.lighthouse3d.com/tutorials/glsl-12-tutorial/the-normal-matrix/

关于opengl - 为什么我必须计算模型矩阵的逆矩阵的转置才能计算反射纹理的法线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36298416/

相关文章:

unity3d - 如何使用 Unity 5 程序天空盒添加夜空?

java - OPENGL - 保持对象的原始纵横比

c++ - OpenGL .obj 加载程序 : Model only lit correctly with incorrect normal vectors?

c++ - 具有固定功能管道的一维纹理查找表

c++ - 从 glTexStorage3D 切换到 glTexImage3D

c++ - OpenGL,将纹理从图像应用到等值面

c# - 从远程图像编辑立方体贴图天空盒

python - GL_QUAD 绘制三角形

c - glUniformMatrix4fv - 无效操作

java - Libgdx 在 3D 中创建天空/环境