Open GL(GLSL) - 定向照明破坏纹理

时间:2016-10-27 12:00:14

标签: opengl glsl

我一直在使用OpenGL进行一项课程作业,我的片段着色器出现了问题。我正在尝试为纹理网格添加一些基本的定向照明。我可以让纹理在没有光线的情况下显得很好。

Mesh without Lighting

然而,当我添加灯光时,它会保留纹理的全部颜色,但会同时删除纹理的细节。

Mesh with Lighting

我不确定是什么导致它,我似乎无法在线找到解决方案。谢谢你的帮助。

顶点着色器

#version 440

uniform mat4 uModel; //Model Location, Rotation, Scale
uniform mat4 uView; //Camera Location, Rotation, Scale
uniform mat4 uProjection; //Projection Matrix

in vec3 vPosition;
in vec3 vNormal;
in vec2 vTexCoords;

out vec3 oNormal;
out vec3 oFragPos;
out vec2 oTexCoords;

void main()
{
    gl_Position = vec4(vPosition, 1) * uModel  * uView * uProjection;
    oFragPos = vec3(vec4(vPosition, 1) * uModel);

    oNormal = normalize(vNormal * mat3(transpose(inverse(uModel))));
    oTexCoords = vTexCoords;
}

片段着色器

#version 440

//Ins
in vec3 oNormal;
in vec3 oFragPos;
in vec2 oTexCoords;

//Outs
out vec4 fragColour;

//Uniforms
uniform sampler2D uTextureSampler;

void main()
{   
    vec3 norm = normalize(oNormal);

    // Phase 1: Directional lighting
    float result = max(dot(norm, -vec3(0,0,1)),0.0);

    fragColour = vec4(vec3(result),1.0) * texture(uTextureSampler, oTexCoords);
}

1 个答案:

答案 0 :(得分:1)

纹理的颜色仍在这里。看起来在纹理中对单个像素进行采样。这个问题似乎来自“oTexCoords”的价值观。

您可以尝试:

fragColour = vec4(vec3(result),1.0) * vec4(oTexCoords, 0.0, 1.0);

并检查是否在立方体上看到红色/绿色渐变。

因此,当您移除光照时,请勿在着色器中使用光照组件(“结果”值),大多数编译器将删除导致计算“结果”的所有代码。

“结果”将被删除。所以“norm”,“oNormal”,“vNormal”都会从你的着色器中消失。

属性位置会发生变化,我的猜测是你的问题来自你获得程序属性位置和'vertexAttribPointer'这些位置的方式。