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ドットのl項をレンダリングします。次に、マテリアルパラメータを掛けてから、テクスチャを掛けます。途中のどこかで問題を理解します。追加のヒントとして、クリアカラーを黒以外のものに変更して、黒でレンダリングされたオブジェクトが目立つようにします。

上記のアドバイス(分解してください)は、シェーダーだけでなく、デバッグのすべてに適用できることに注意してください。私が見ているように、あなたはここでそうしていません。

于 2013-02-25T07:05:52.213 に答える