-1

私はフォンシェーダーを書き始めました

vert:
varying vec3 normal, eyeVec;
#define MAX_LIGHTS 8
#define NUM_LIGHTS 3
varying vec3 lightDir[MAX_LIGHTS];

void main() {
    gl_Position = ftransform();
    normal = gl_NormalMatrix * gl_Normal;
    vec4 vVertex = gl_ModelViewMatrix * gl_Vertex;
    eyeVec = -vVertex.xyz;
    int i;

    for (i=0; i<NUM_LIGHTS; ++i){
        lightDir[i] = vec3(gl_LightSource[i].position.xyz - vVertex.xyz);
    }
}

でカメラの位置を取得する必要があることはわかっていuniformますが、この値をどこにどのように配置するのでしょうか?

ps。私はopengl 2.0を使用しています

4

1 に答える 1

4

OpenGL にはカメラがないため、カメラ位置を渡す必要はありません。

ライティングの計算は、目/ワールド スペースで実行されます。つまり、「カメラの配置」も実行するモデル ビュー マトリックスとの乗算の後に実行されます。つまり、実際には、適切なものがすでに整っています。を使用するftransform()と、実行することの半分を実行しているため、少し非効率的です (gl_ModelviewMatrix * gl_Vertexを追加することで、これを ftransform にすることができますgl_Position = gl_ProjectionMatrix * eyeVec) 。

そのため、「カメラ」が変換されたときにライトが動いているように見える場合は、ライトの位置を適切に変換していません。変換されたライトの位置を事前に計算するか、シェーダーでも変換します。シェーダーを使用する場合は、選択された規則の問題であり、レイアウトされた制約は少なくなります。

于 2011-05-26T22:06:18.297 に答える