【问题标题】:GLSL normal matrix not working properlyGLSL 法线矩阵无法正常工作
【发布时间】:2014-11-21 00:58:54
【问题描述】:

直截了当:当我使用我的模型矩阵来转换顶点的法线时,我得到了正确的光照结果,但是当我使用法线矩阵时,我得到了错误的结果(即旋转的立方体在错误的面上被点亮)。

这是我计算法线矩阵的方法(使用 jbullet):

modelMat.transpose();
modelMat.invert();

这是我的 GLSL: 顶点着色器:

#version 330

uniform mat4 ProjectionMatrix;
uniform mat4 ViewMatrix;
uniform mat4 ModelMatrix;
uniform mat4 NormalMatrix;

layout(location = 0) in vec4 inPosition;
layout(location = 1) in vec4 inColor;
layout(location = 2) in vec3 inNormal;

out vec4 vColor;
out vec3 vNormal;
out vec3 vWorldPos;

void main() {
    gl_Position = ProjectionMatrix * ViewMatrix * ModelMatrix * inPosition;
    vColor = inColor;
    vNormal = normalize((NormalMatrix * vec4(inNormal, 0.0))).xyz;
    vWorldPos = (ModelMatrix * inPosition).xyz;}

片段着色器:

#version 330

uniform float AmbientIntensity; // Color
uniform vec3 DirectionalLight; // Normal
uniform vec3 DirectionalLightColor; // Color

uniform vec3 EyeWorldPos;
uniform float SpecularIntensity;
uniform float SpecularPower;

in vec4 vColor;
in vec3 vNormal;
in vec3 vWorldPos;

out vec4 pixel;

void main() {
    vec4 ambientColor = vec4(DirectionalLightColor * AmbientIntensity, 1.0);
    float diffuseFactor = dot(normalize(vNormal), -DirectionalLight);

    vec4 specularColor = vec4(0.0, 0.0, 0.0, 0.0);

    if (diffuseFactor > 0.0) {
        vec3 vertexToEye = normalize(EyeWorldPos - vWorldPos);
        vec3 lightReflect = normalize(reflect(DirectionalLight, vNormal));
        float specularFactor = pow(dot(vertexToEye, lightReflect), SpecularPower);

        if (specularFactor > 0)
            specularColor = vec4(DirectionalLightColor, 1.0f) * SpecularIntensity * specularFactor;
    }
    else
        diffuseFactor = max(0.0, diffuseFactor);


    vec4 diffuseColor = vec4(DirectionalLightColor * diffuseFactor, 1.0);

    pixel = vColor * (ambientColor + diffuseColor + specularColor);}

【问题讨论】:

  • 确保从模型矩阵中删除翻译,可以将其截断为mat4(mat3(modelMatrix))
  • 你的意思是普通矩阵? vNormal = normalize((mat4(mat3(NormalMatrix)) * vec4(inNormal, 0.0))).xyz;
  • 是的,从模型中删除普通矩阵的翻译
  • 仍然没有改变 :(
  • 嗯,转置前请确保将其截断

标签: opengl matrix glsl normals


【解决方案1】:

我找到了! OpenGL 使用列主矩阵,而 jbullet 使用行主矩阵。这就是给出错误结果的原因。

【讨论】:

  • 啊,这就解释了。 :)
猜你喜欢
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2015-12-14
相关资源
最近更新 更多