1

この質問がすでに多く寄せられていることは知っていますが、まだ正しく答えることができません。

そのため、頂点シェーダーでは、ライトの位置と目の位置を取得する必要があります。これが私のコードです:

void main(void)
{
    vec3    p = vec3      ( gl_ModelViewMatrix * gl_Vertex );

    l = normalize (vec3 (gl_LightSource[0].position));
    v = normalize ( vec3 ( eyePos )  - p );
    n = normalize ( gl_NormalMatrix * gl_Normal );

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

その結果、カメラの動きに合わせて光が移動します。ここで正確に何をする必要がありますか?おそらく非openglマトリックスを使用しません。

適切なカメラ制御を備えた glsl 照明の例はありますか?

* アップデート *

Kos のおかげで、「ライトがカメラとともに移動する」問題を解決できましたが、別の問題があります。

私は持っている

glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
ctLight -> enable();

glPushMatrix();
    glTranslatef(0, 0, 0);
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(2.0);
glPopMatrix();

glPushMatrix();
    glTranslatef(0, 0, 8);
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(2.0);
glPopMatrix();

ctLight -> disable();
glDisable(GL_LIGHT0);

これで、2 番目のティーポットが (0, 0, 0) のティーポットと同じように点灯します。これを修正するにはどうすればよいですか?

次の場合の頂点シェーダー コード:

void main(void)
{
    vec3    p = vec3 ( gl_ModelViewMatrix * gl_Vertex );            // transformed point to world space

    l = normalize ( vec3 (gl_LightSource[0].position) );
    v = normalize ( - p );  

    h = normalize ( l + v );
    n = normalize ( gl_NormalMatrix * gl_Normal );                  // transformed n

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
4

1 に答える 1

3

OpenGL の「古い」照明機能についてはあまり覚えていませんが、あなたの問題は で無効な値を持っていると思いますgl_LightSource[0].position

ライトの位置 ( ) はどのように指定しますglLightParameterfv(GL_LIGHT_POSITION, ...);か? 最も重要なのは、指定したときのモデル ビュー マトリックスの状態はどのようなものかということです。

モデル ビュー マトリックスが単位である場合は、目の空間でライトの位置を指定します。これにより、ライトがカメラと共に移動する印象が得られます (カメラは常に (0,0,0) にあり、それが世界であることを思い出してください)。動く)。

正しい結果を得るには、ワールド空間でライトを指定する必要があると思います。つまり、モデルビューマトリックスでカメラ変換を実行した後、他の操作を実行する前です。

仕様の時点で、ライトの位置はモデル ビュー マトリックスで乗算されるため、シェーダーは常に eye space の値を取得します。これは便利です。ライティングの計算は目で行われるため、これ以上変更する必要はありません。スペース。これはまた、あなたの計算にちょうどあるeyePosべきであることを意味します。(0,0,0)vnormalize(-p)

また、最良の結果を得るには、これらの計算を頂点シェーダーではなくフラグメント シェーダーで行います。:)

それが役立つことを願っています。

于 2010-12-07T11:42:59.733 に答える