1

使用しているGLSLシェーダーのすべてのライトを目のスペースに入れようとしていますが、何かが足りません。何が欠けているのかわかりません。問題が発生した場合に備えて、これが私のシェーダーコードです...

varying vec3 normal, lightDir;

uniform vec3 lightPos;

//gl_Normal: Object Space
//gl_Vertex: Object Space
//lightDir: Eye Space

void main()
{
    vec4 vert;
    normal = gl_NormalMatrix * gl_Normal;
    vert = gl_ModelViewMatrix * gl_Vertex;
    lightDir = normalize(vec3(vec4(lightPos, 1.0) - vert));

    gl_Position = ftransform();
    gl_FrontColor = gl_Color;
}

そうでなければ、それは私がライトポジションのCPU側を変換している方法であるに違いないので、これが私がしていることです...

eye = inverse(camera->climb(root));
glMultMatrixf(value_ptr(eye));
glUniform3fv(sLight, 1, value_ptr(vec3(eye * light->climb(root) * vec4())));

私のプログラムの他のすべては完璧に機能していますが、ここで見つけられないことがあります。注:camera->climb(root)は、ワールド空間でのカメラのシーンノードの変換を生成します。light->climb(root)は、ワールド空間でのライトのシーンノードの変換を生成します。

編集:私が抱えている正確な症状は、私の光が常に目の空間の原点(カメラと同じ場所)にあるように見えることです。

4

1 に答える 1

2

コメントから回答を移動するには:

ライトのアイスペースの位置を取得するために乗算する原点座標は、vec4(0,0,0,0)ではなくvec4(0,0,0,1)である必要があります。

于 2012-06-25T19:26:58.143 に答える