我一直在和OpenGL合作做一件课程,我的片段着色器有问题。我试图添加一些基本的方向照明到一个纹理网格。我可以得到的纹理看起来很好,没有照明。

然而,当我增加照明,它保持了纹理的覆盖颜色,但删除了纹理的细节在一起。

我不知道是什么原因造成的,我似乎无法在网上找到解决方案。谢谢你的帮助。
顶点着色器
#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);
}发布于 2016-10-27 15:40:27
纹理的颜色还在这里。它看起来像一个像素在你的纹理中被采样。这个问题似乎来自"oTexCoords“值。
你可以尝试:
fragColour = vec4(vec3(result),1.0) * vec4(oTexCoords, 0.0, 1.0);并检查是否在立方体上看到一个红色/绿色梯度。
因此,当您删除照明时,不要在您的着色器中使用照明组件(“结果”值),大多数编译器将删除所有导致计算“结果”的代码。
“结果”将被删除。所以"norm","oNormal","vNormal“都会从你的着色器里消失。
属性位置将发生变化,我的猜测是,您的问题来自您获取程序属性位置和“vertexAttribPointer”位置的方式。
https://stackoverflow.com/questions/40284073
复制相似问题