2012-03-08 21 views
2

私はOpenGLで少し3Dシーンをやろうとしていて、少し光り輝いています。私のシーンにはうまくいきますが(特別なものではありませんが)、イムは照明効果を加えようとしています。しかし、私は表彰台に素材を追加することができます(それはテクスチャではありません)、それは私に光を与え、テクスチャ加工されたものは何も材料に適用されないので、ライトを持つ点を無視します。コードの一部を引用します。openglで作業中

// Setup GL_LIGHT0 
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);  // Setup ambient light 
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);  // Setup diffuse light 
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular); // Setup specular light 

glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, ca); 
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, la); 
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, qa); 

glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 180.0f); 
glLightf(GL_LIGHT0, GL_SPOT_EXPONENT, 0.0); 

// Setup GL_LIGHT1 
glLightfv(GL_LIGHT1, GL_AMBIENT, lightAmbient);  // Setup ambient light 
glLightfv(GL_LIGHT1, GL_DIFFUSE, lightDiffuse);  // Setup diffuse light 
glLightfv(GL_LIGHT1, GL_SPECULAR, lightSpecular); // Setup specular light 

glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, ca); 
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, la); 
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, qa); 

glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 180.0f); 
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 0.0); 
// Setup GL_LIGHT2 
glLightfv(GL_LIGHT2, GL_AMBIENT, lightAmbient);  // Setup ambient light 
glLightfv(GL_LIGHT2, GL_DIFFUSE, lightDiffuse);  // Setup diffuse light 
glLightfv(GL_LIGHT2, GL_SPECULAR, lightSpecular); // Setup specular light 

glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, ca); 
glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, la); 
glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, qa); 

glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 180.0f); 
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 0.0); 
// Setup GL_LIGHT3 
glLightfv(GL_LIGHT3, GL_AMBIENT, lightAmbient);  // Setup ambient light 
glLightfv(GL_LIGHT3, GL_DIFFUSE, lightDiffuse);  // Setup diffuse light 
glLightfv(GL_LIGHT3, GL_SPECULAR, lightSpecular); // Setup specular light 

glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, ca); 
glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, la); 
glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, qa); 

glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 180.0f); 
glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 0.0); 

// OpenGL provides a global ambient light component - we don't want this so set to zero 
GLfloat global_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f }; 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient); 

私の部屋+ 3dオブジェクトをレンダリングする。

glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHT1); 
    glEnable(GL_LIGHT2); 
    glEnable(GL_LIGHT3); 

    // Define position and direction 
    // NOTE: Placing these commands AFTER the above viewing (camera) transformations means the light position and direction appear to have a set point/direction in the 3D environment. If these commands are placed BEFORE the above viewing transformations, then the light appears to move with the camera (as if it is attached to the camera!) 
    glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection); 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); 

    glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, lightDirection1); 
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition1); 

    glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, lightDirection2); 
    glLightfv(GL_LIGHT2, GL_POSITION, lightPosition2); 

    glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, lightDirection3); 
    glLightfv(GL_LIGHT3, GL_POSITION, lightPosition3); 


    // setup materials for objects to draw 
    glMaterialfv(GL_FRONT, GL_AMBIENT, ambientMaterial); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, specularMaterial); 


    // 2. Draw scene 
    glPushMatrix(); 
     drawRoom(); 
     glTranslatef(0.0,-0.75,0.0); 
     glRotatef(90.0, 1.0,0.0, 0.0); 
     glRotatef(-spin, 0.0,0.0, 1.0); 
     glColor3f(1.0, 1.0, 1.0); 
     drawPodium(); 
    glPopMatrix(); 

    // Save transformations prior to rendering scene 
    glPushMatrix(); 

     glColor3f(0.0, 0.0, 1.0); 

     // Setup texture state 
     glEnable(GL_TEXTURE_2D); 
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

     glRotatef(spin, 0.0,1.0, 0.0); 
     // Render model 

     glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuseMaterial2); 

     glTranslatef(0.0,0.8,0.0); 
     glRotatef(1.0,1.0,0.0,0.0); 
     myModel->renderTexturedModel(); 

     // Reset texture state 
     glDisable(GL_TEXTURE_2D); 

    // restore transformations after rendering scene 
    glPopMatrix(); 

そして、すべて0.0に向けて見下ろすヘリコプター上記正方形の私の4ライトが付いている現在の結果は、次のとおりです。

My scene

あなたは彼らが白い点線を作ることができればライトが探している方向。表彰台の表面が照らされ、表彰台の側面が回転すると点灯します。しかし、部屋やヘリコプターの残りの部分は光に反応せず、照明のように動作しないので、なぜ私はそれが表彰台以外のすべてがテクスチャされていると思う理由を有効にします。

答えて

6

あなたは照明がテクスチャオブジェクト

のために働く方法を指定するためのセットアップglTexEnvに必要

参照:私はテクスチャマッピングの電源を入れたときに

21.030なぜ仕事を点灯しないのですか? http://www.opengl.org/resources/faq/technical/texture.htm

以上の直接あなたの問題を解決するため、ライン

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

は行動を引き起こすものです。 faqで説明しているように、GL_REPLACEを指定すると、プリミティブライティングカラーがテクスチャカラーに置き換えられ、ライティング計算が上書きされます。 GL_MODULATEがデフォルトの動作であるため、この行を完全に削除することができます。

+0

私はあなたの言ったことを見て、ラインを取り除きましたが、それはまだ同じです:( –

+0

myModel-> renderTexturedModel();で何が起こるか? –

+0

これはコメント付きの関数です。 「Tは、実際にハードコードを参照してください //テクスチャが接続されている場合、テクスチャモデルをレンダリングこれは、テクスチャ状態を想定して、セットアップ \t //これはglEnableです(GL_TEXTURE_2D)とglTexEnvf(GL_TEXTURE_ENV、GL_TEXTURE_ENV_MODE、)が含まれてきました;。。 \t無効renderTexturedModel( )const; –

0

上記の方法が有効かどうかわかりません。私も同じ問題がありました。私の問題は、オブジェクトの法線を指定していないことでした。

//法線を指定する glNormal3f();

うまくいけば、これは誰でも問題を解決します(私はインターネット上で他の方法を試しましたが、何も働かず、この方法だけが有効でした)。

関連する問題