0

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

这是顶点着色器:

#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分量变为红色,使狼变红。diffuseReflection1.0

有没有人看到我在这里做错了什么明显的事情?

4

1 回答 1

2

正如评论中所建议的,尝试逐步调试。我看到你的着色器可能有很多错误。也许您的 normalMatrix 没有正确传递?也许您的 in_Normal 未映射到适当的输入?也许当您将 lightSources.direction 转换为 vec3 时,编译器正在做一些时髦的事情?也许你的着色器甚至根本没有运行,但你认为它是?也许你有几何或镶嵌单元,但它没有正确传递?

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

要调试它,您需要将其分解。正如评论中所建议的,尝试渲染法线。然后,您应该尝试渲染光线方向。然后渲染你的 n dot l 术语。然后乘以您的材料参数,然后乘以您的纹理。一路走来,您会发现问题所在。作为附加提示,将您的透明颜色更改为黑色以外的颜色,以便任何黑色渲染的对象脱颖而出。

值得注意的是,上述建议——分解它——适用于所有调试,而不仅仅是着色器。如我所见,您还没有在这里这样做。

于 2013-02-25T07:05:52.213 回答