2011-11-25 68 views
4

我在使用OpenGL啓用照明時能夠看到創建的對象時遇到問題。我有一個從3D Max導入的對象,即照明可以正常工作,但場景的其餘部分不能。我知道我需要指定法線,但這似乎沒有幫助。雖然如果我在我的display()函數中創建了一個簡單的多邊形,但是其他多邊形已在類的方法中創建並在display()函數中調用,但沒有顯示出來OpenGL照明的問題

這是我的照明代碼

glewInit(); 

glClearColor(0.0,0.0,0.0,0.0); 
glClear(GL_COLOR_BUFFER_BIT) 

glShadeModel(GL_SMOOTH); 

//light position and colour 
GLfloat light_position[] = { 0.0, 0.0, 20.0,0.0 }; 
GLfloat white_light[] = {0.8,0.8,0.8,0.0}; 
GLfloat diff_light[] = {1.0,1.0,1.0,0.0}; 
GLfloat spec_light[] = {1.0,1.0,1.0,0.0}; 
glLightfv(GL_LIGHT0, GL_AMBIENT, white_light); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, diff_light); 
glLightfv(GL_LIGHT0, GL_SPECULAR, spec_light); 
glLightfv(GL_LIGHT0, GL_POSITION, light_position); 

//ambient light 
GLfloat ambient[] = {0.3,0.3,0.3}; 
glMaterialfv(GL_FRONT, GL_AMBIENT, ambient); 

//diffuse material component 
GLfloat diff[] = {0.6,0.6,0.6}; 
glMaterialfv(GL_FRONT, GL_DIFFUSE, diff); 

//specular material component 
GLfloat WhiteSpec[] = {1,1,1}; 
glMaterialfv(GL_FRONT, GL_SPECULAR, WhiteSpec); 

GLfloat shininess = 50; 
glMaterialf(GL_FRONT, GL_SHININESS, shininess); 

//ENABLE LIGHTING AND DEPTH TEST 
glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

glEnable(GL_DEPTH_TEST); 

這是我的類方法是創建我的海

glColor3f(0,0,1); 
glPushMatrix(); 

//enable texturing 
glEnable(GL_TEXTURE_2D);  
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glBindTexture(GL_TEXTURE_2D, seaTex); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

for(int i = 0, k = 0; i < (getWidth()/10); i++){ 
    for(int j = 0; j < (getLength()/10); j++){ 
     if(i >= Sea::waveLoc1 && i <= Sea::waveLoc1+Sea::sinArrayLength){ 

      int nextK = k+1; 
      if(nextK == Sea::sinArrayLength){ 
       nextK = 0; 
      } 

      if(i == Sea::waveLoc1+Sea::sinArrayLength){ 
       //front of wave 
       glBegin(GL_POLYGON);  

       glNormal3f(0.0f, 1.0f, 0.0f); 
        glTexCoord2f(0.0, 1.0);glVertex3f(Sea::seaGrid[i][j].x, Sea::sinVals[nextK], Sea::seaGrid[i][j].z); 
        glTexCoord2f(0.0, 0.0);glVertex3f(Sea::seaGrid[i][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i][j+1].z); 
        glTexCoord2f(1.0, 0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x, Sea::seaGrid[i+1][j+1].y , Sea::seaGrid[i+1][j+1].z); 
        glTexCoord2f(1.0, 1.0);glVertex3f(Sea::seaGrid[i+1][j].x, Sea::seaGrid[i+1][j].y, Sea::seaGrid[i+1][j].z); 
       glEnd(); 
      }else{ 
       //rest of wave 
       glBegin(GL_POLYGON);  

       glNormal3f(0.0f, 1.0f, 0.0f); 
        glTexCoord2f(0.0, 1.0);glVertex3f(Sea::seaGrid[i][j].x, Sea::sinVals[k], Sea::seaGrid[i][j].z); 
        glTexCoord2f(0.0, 0.0);glVertex3f(Sea::seaGrid[i][j+1].x, Sea::sinVals[k], Sea::seaGrid[i][j+1].z); 
        glTexCoord2f(1.0, 0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j+1].z); 
        glTexCoord2f(1.0, 1.0);glVertex3f(Sea::seaGrid[i+1][j].x, Sea::sinVals[nextK], Sea::seaGrid[i+1][j].z); 
       glEnd(); 
      } 

     }else{ 
      //draw flat sea 
      glBegin(GL_POLYGON);  

       glNormal3f(0.0f, 1.0f, 0.0f); 

       glTexCoord2f(0.0, 1.0);glVertex3f(Sea::seaGrid[i+1][j].x, Sea::seaGrid[i+1][j].y, Sea::seaGrid[i+1][j].z); 
       glTexCoord2f(0.0, 0.0);glVertex3f(Sea::seaGrid[i+1][j+1].x, Sea::seaGrid[i+1][j+1].y, Sea::seaGrid[i+1][j+1].z); 
       glTexCoord2f(1.0, 0.0);glVertex3f(Sea::seaGrid[i][j+1].x, Sea::seaGrid[i][j+1].y, Sea::seaGrid[i][j+1].z); 
       glTexCoord2f(1.0, 1.0);glVertex3f(Sea::seaGrid[i][j].x, Sea::seaGrid[i][j].y, Sea::seaGrid[i][j].z); 
      glEnd(); 
     } 
    } 

    //increment k if i is in the area of the wave 
    if(k < Sea::sinArrayLength-1 && (i >= Sea::waveLoc1 && i <= Sea::waveLoc1+Sea::sinArrayLength)){ 
     k++; 
    }else if(k == Sea::sinArrayLength){ 
     k = 0; 
    } 
} 

if(Sea::waveLoc1 < 100 && Sea::waveInc == Sea::waveSpeedLimiter){ 
    Sea::waveLoc1 +=1; 
}else if(Sea::waveLoc1 >= 100){ 
    Sea::waveLoc1 = 0; 
} 

//limits speed of wave 
if(Sea::waveInc < Sea::waveSpeedLimiter){ 
    Sea::waveInc++; 
}else{ 
    Sea::waveInc = 0; 
} 


//disable texturing 
glDisable(GL_BLEND); 
glDisable(GL_TEXTURE_2D); 
glPopMatrix(); 

這然後在我的顯示()函數調用如下

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45.0f,(GLfloat)screenWidth/(GLfloat)screenHeight,0.1f,1000.0f); 

glMatrixMode(GL_MODELVIEW); 

glLoadIdentity(); 

camera.updateCameraPosition(mouse_x,mouse_y,screenWidth,screenHeight); 


sea.buildSeaPlane(); 
scene.buildEdges(); 


glPushMatrix(); 
glColor3f(0,1,0); 
glTranslatef(0, 20, 200); 
model.speedDisplayFaceNormals(); 

glPopMatrix(); 

glPushMatrix(); 

plane.updatePlanePosition(); 

glBegin(GL_POLYGON);  

    glNormal3f(0.0f, 1.0f, 0.0f); 

    glVertex3f(0, 25, 10); 
    glVertex3f(2, 25, 10); 
    glVertex3f(2, 25, 20); 
    glVertex3f(0, 25, 20); 
glEnd(); 


glPopMatrix(); 

glFlush(); 

任何想法,爲什麼我不能看到這些?

UPDATE:

我可以看到我的海我是否禁用紋理。我怎樣才能修復它,所以我可以使用紋理和照明?

更新2:

物是人非紋理到GL_MODULATE但我也不得不刪除混合,使其工作。我需要啓用混合嗎?

回答

2
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); 

說用紋理的結果替換光照計算。如果你想照明來影響紋理,我們GL_MODULATE而不是GL_REPLACE

編輯補充:

你只需要勾兌,如果你希望你的幾何體是半透明的(這是勾兌就是通常)。在你的情況下,在代碼中有一些問題:

  • 你的光線顏色是完全透明的(全都有0作爲第四個組件)。所以你的光線讓一切都看不見。將其更改爲1.
  • 您的材料沒有第四個組件。更糟糕的是,glMaterialfv預計有4個浮標。這甚至可能會導致應用程序崩潰或重新格式化磁盤。添加第四個組件,最好爲1.使其完全不透明。
0

嘗試爲整個場景添加環境光線。喜歡的東西:

GLfloat lightColor[] = {1.0f, 1.0f, 1.0f, 1.0f}; 
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lightColor); 
+0

似乎沒有幫助:( – Chris

0

在你glMaterialfv來電,顏色參數應該有4個值,而不是3一般情況下,第4個值是1.0的alpha。我不確定是否可以將0.0作爲glLightfv的第四個值。

+0

沒有區別:( – Chris