Opengl 变换矩阵与法向量相乘时的奇怪行为

Opengl 变换矩阵与法向量相乘时的奇怪行为,opengl,shader,fragment-shader,vertex-shader,glsles,Opengl,Shader,Fragment Shader,Vertex Shader,Glsles,我试图在我的3d引擎中应用每像素的照明,但我在理解我的几何体可能有什么问题时遇到了一些困难。我是OpenGL的初学者,所以请容忍我的问题,如果我的问题听起来很愚蠢,我会尽可能地解释 我的顶点着色器: #version 400 core layout(location = 0) in vec3 position; in vec2 textureCoordinates; in vec3 normal; out vec2 passTextureCoordinates; out vec3 norma

我试图在我的3d引擎中应用每像素的照明,但我在理解我的几何体可能有什么问题时遇到了一些困难。我是OpenGL的初学者,所以请容忍我的问题,如果我的问题听起来很愚蠢,我会尽可能地解释

我的顶点着色器:

#version 400 core

layout(location = 0) in vec3 position;
in vec2 textureCoordinates;
in vec3 normal;

out vec2 passTextureCoordinates;
out vec3 normalVectorFromVertex;
out vec3 vectorFromVertexToLightSource;
out vec3 vectorFromVertexToCamera;

uniform mat4 transformation;
uniform mat4 projection;
uniform mat4 view;
uniform vec3 lightPosition;

void main(void) {
    vec4 mainPosition = transformation * vec4(position, 1.0);

    gl_Position = projection * view * mainPosition;
    passTextureCoordinates = textureCoordinates;

    normalVectorFromVertex = (transformation * vec4(normal, 1.0)).xyz;
    vectorFromVertexToLightSource = lightPosition - mainPosition.xyz;
}
我的片段着色器:

#version 400 core

in vec2 passTextureCoordinates;
in vec3 normalVectorFromVertex;
in vec3 vectorFromVertexToLightSource;

layout(location = 0) out vec4 out_Color;

uniform sampler2D textureSampler;
uniform vec3 lightColor;

void main(void) {
    vec3 versor1 = normalize(normalVectorFromVertex);
    vec3 versor2 = normalize(vectorFromVertexToLightSource);

    float dotProduct = dot(versor1, versor2);
    float lighting = max(dotProduct, 0.0);
    vec3 finalLight = lighting * lightColor;

    out_Color = vec4(finalLight, 1.0) * texture(textureSampler, passTextureCoordinates);
}
问题是:每当我将法线向量的变换矩阵与齐次坐标0.0相乘时,就像这样:
transformation*vec4(normal,0.0)
,我得到的向量就会变得一团糟,以至于每当管道进入片段着色器,从顶点到光源的向量和法线之间的点积可能输出=π/2,因此所有像素都输出rgb(0,0,0,1)。但由于我无法从几何角度理解的最奇怪的原因,如果我计算
transformation*vec4(normal,1.0)
,灯光似乎工作得很好,除了极端怪异的行为,比如对距离的“反应”。我的意思是,使用这个非常简单的照明技术,顶点亮度与距离完全无关,因为它意味着向量长度的计算,但我在应用点积之前对它们进行了规格化,所以我不希望这样

对我来说,一件明显错误的事情是,我的变换矩阵在乘以法向量之前应用了平移分量,这将“移动并指向”平移方向上的法向量,这是错误的。我仍然不确定我是否应该得到这个结果。任何见解都将不胜感激

每当我用齐次坐标0.0乘以法向量的变换矩阵时,像这样:transformation*vec4(normal,0.0),我得到的向量就会变得一团糟

如果变换矩阵中存在非均匀缩放,会怎么样

想象一个平坦的正方形表面,所有法线都指向上。现在您可以缩放该曲面以在水平方向拉伸:法线会发生什么情况

如果不将变换矩阵调整为不包含缩放部分,法线将发生倾斜。毕竟,在考虑法线时,您只关心对象的方向,并且对象的比例与曲面指向的位置无关

或者考虑一个圆圈:

在变换法线时,需要应用模型视图矩阵的逆转置以避免缩放法线。另一个讨论它,以及这个

有关变换法线的其他资源:


检查此项变换法线:法线向量是否反转?它们是否指向对象而不是对象之外?试试
transformation*vec4(-normal,0.0)
这太奇怪了。不幸的是,这没什么区别。可悲的是,当我的问题根本不是重复的时候,人们如此迅速地结束了我的问题,就像重复一样。这就是我所想的。如果我可以验证着色器逻辑实际上是正确的,我就可以开始查找这个bug。谢谢,只是更新一下。在您的回复之后,我很快就发现了我的错误,这是关于渲染过程中的VAO属性指针属性。有趣的是,我确信这是关于我的几何体的着色器代码。非常感谢您的帮助。感谢您的澄清,但我使用的是一个简单的正交矩阵,所以在这种情况下应该可以工作。