我正在为我的应用程序中的一些基本照明工作,并且无法使用简单的灯光(到目前为止......)。
这是顶点着色器:
#version 150 core
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;
uniform mat4 modelMatrix;
uniform mat4 pvmMatrix;
uniform mat3 normalMatrix;
in vec3 in_Position;
in vec2 in_Texture;
in vec3 in_Normal;
out vec2 textureCoord;
out vec4 pass_Color;
uniform LightSources {
vec4 ambient = vec4(0.5, 0.5, 0.5, 1.0);
vec4 diffuse = vec4(0.5, 0.5, 0.5, 1.0);
vec4 specular = vec4(0.5, 0.5, 0.5, 1.0);
vec4 position = vec4(1.5, 7, 0.5, 1.0);
vec4 direction = vec4(0.0, -1.0, 0.0, 1.0);
} lightSources;
struct Material {
vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
};
Material mymaterial = Material(
vec4(1.0, 0.8, 0.8, 1.0),
vec4(1.0, 0.8, 0.8, 1.0),
vec4(1.0, 0.8, 0.8, 1.0),
0.995
);
void main() {
gl_Position = pvmMatrix * vec4(in_Position, 1.0);
textureCoord = in_Texture;
vec3 normalDirection = normalize(normalMatrix * in_Normal);
vec3 lightDirection = normalize(vec3(lightSources.direction));
vec3 diffuseReflection = vec3(lightSources.diffuse) * vec3(mymaterial.diffuse) * max(0.0, dot(normalDirection, lightDirection));
/*
float bug = 0.0;
bvec3 result = equal( diffuseReflection, vec3(0.0, 0.0, 0.0) );
if(result[0] && result[1] && result[2]) bug = 1.0;
diffuseReflection.x += bug;
*/
pass_Color = vec4(diffuseReflection, 1.0);
}
这是片段着色器:
#version 150 core
uniform sampler2D texture;
in vec4 pass_Color;
in vec2 textureCoord;
void main() {
vec4 out_Color = texture2D(texture, textureCoord);
gl_FragColor = pass_Color;
//gl_FragColor = out_Color;
}
我正在将纹理狼渲染到屏幕上作为测试。如果我将片段着色器更改为使用out_Color
,我会看到狼正确渲染。如果我使用pass_Color
,我在屏幕上看不到任何内容。
当我在片段着色器中使用out_Color
时,这就是屏幕的样子:
我知道diffuseReflection
向量已满0,通过在顶点着色器中取消注释此代码:
...
/*
float bug = 0.0;
bvec3 result = equal( diffuseReflection, vec3(0.0, 0.0, 0.0) );
if(result[0] && result[1] && result[2]) bug = 1.0;
diffuseReflection.x += bug;
*/
...
这会生成x
向量diffuseReflection
的{{1}}分量,这会使狼变红。
有人看到任何明显我在这里做错了吗?
答案 0 :(得分:2)
正如评论中所建议的那样,尝试逐步调试。我看到你的着色器可能有多种错误。也许你的normalMatrix没有正确传递?也许你的in_Normal没有映射到适当的输入?也许当你将lightSources.direction转换为vec3时,编译器会做一些时髦的事情吗?也许你的着色器根本没有运行,但你认为它是?也许你有几何或曲面细分单元并且没有正确传递?
没有人真正有机会正确回答这个问题。至于我,它看起来很好 - 但同样,上述任何因素都可能发生 - 可能更多。
要调试它,您需要将其分解。正如评论中所建议的那样,尝试渲染法线。然后,您应该尝试渲染光线方向。然后渲染你的n点l项。然后乘以材质参数,再乘以纹理。在某个地方,你会找出问题所在。作为额外的提示,将您的清晰颜色更改为黑色以外的其他颜色,以便任何黑色渲染的对象突出。
值得注意的是,上述建议 - 将其分解 - 适用于调试的所有内容,而不仅仅是着色器。在我看来,你还没有这样做过。