3

2 つの窓と 1 つのドアを備えた、実際には長方形の部屋を作成しました。私はマテリアル プロパティを使ってマタリアルを照らそうとしています。以下のコードを使用しましたが、機能しません。なぜ?

注: 期待どおり、部屋には光があります

myinit () で

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_COLOR_MATERIAL);
    glEnable(GL_LIGHTING);


    glLightfv(GL_LIGHT1, GL_AMBIENT, light[0]);  
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light[1]);  
    glLightfv(GL_LIGHT1, GL_SPECULAR,light[2]);
    glLightfv(GL_LIGHT1, GL_POSITION,light[3]);  // position of the light
    glEnable(GL_LIGHT1);                     

ドロールームで ()

   glMaterialfv ( GL_FRONT, GL_AMBIENT ,material[0] ) ;
   glMaterialfv ( GL_FRONT, GL_DIFFUSE ,material[1] ) ;
   glMaterialfv ( GL_FRONT, GL_SPECULAR ,material[2] ) ; 
   glBegin (GL_TRIANGLES); 
            glColor3f ( /*...*/ )             
            // ...
   glEnd ( ) ;

メイン () 内

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);  
4

1 に答える 1

3

照明自体を有効にしましたか?ライトを有効にするだけでは十分ではありません。ライト システム全体も有効にする必要があります (デフォルトではオフになっています)。

初期化関数で発生する必要があります。

glEnable(GL_LIGHTING);

また、忘れないでください:

glEnable(GL_COLOR_MATERIAL);

素材の色をご希望の場合。(あなたは今それを持っていますが、それは問題を引き起こす可能性のある別の小さなフラグです)

GL でライティングがどのように機能するかを理解するために理解しなければならないもう 1 つの重要な要素は法線です。ジオメトリにあるすべての頂点について、OpenGL にどの方向を向いているかを伝える必要があります。これにより、ライトの位置に対する方向を計算して、明るさを決定することができます。これは、OpenGL の概念の適切な紹介のように見えます。

最初に OpenGL を使い始めたとき、これらの法線は与えられた三角形から自動的に計算されると思っていました。私は間違っていた。 OpenGL は、モデルの法線を自動的に計算しませんが、理論的には可能ですが (ブロック状の結果ではありますが、より高度な手法ではスムーズになる可能性があります)。

もう 1 つの推奨事項 -ブロック (即時モードとも呼ばれます)などの固定パイプライン機能の使用を避けることをお勧めします。時代遅れで遅いです。この素晴らしいチュートリアル シリーズをチェックして、最新のゲームでも使用されている最新のテクニックを紹介してください。glBegin(...) ... glEnd()

于 2013-01-10T09:44:29.820 に答える