glsl light似乎没有工作

时间:2013-02-25 03:30:00

标签: c++ opengl glsl

我正在为我的应用程序中的一些基本照明工作,并且无法使用简单的灯光(到目前为止......)。

这是顶点着色器:

#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时,这就是屏幕的样子: enter image description here

我知道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}}分量,这会使狼变红。

有人看到任何明显我在这里做错了吗?

1 个答案:

答案 0 :(得分:2)

正如评论中所建议的那样,尝试逐步调试。我看到你的着色器可能有多种错误。也许你的normalMatrix没有正确传递?也许你的in_Normal没有映射到适当的输入?也许当你将lightSources.direction转换为vec3时,编译器会做一些时髦的事情吗?也许你的着色器根本没有运行,但你认为它是?也许你有几何或曲面细分单元并且没有正确传递?

没有人真正有机会正确回答这个问题。至于我,它看起来很好 - 但同样,上述任何因素都可能发生 - 可能更多。

要调试它,您需要将其分解。正如评论中所建议的那样,尝试渲染法线。然后,您应该尝试渲染光线方向。然后渲染你的n点l项。然后乘以材质参数,再乘以纹理。在某个地方,你会找出问题所在。作为额外的提示,将您的清晰颜色更改为黑色以外的其他颜色,以便任何黑色渲染的对象突出。

值得注意的是,上述建议 - 将其分解 - 适用于调试的所有内容,而不仅仅是着色器。在我看来,你还没有这样做过。