2017-05-06 86 views
0

我創建了一個3D場景,我添加了一個光源和一個3D盒子,這個盒子應該被光源照亮。 Ambient和Diffuse兩種顏色看起來都能正常工作,但鏡面顏色似乎沒有正確計算。用光源移動相機前面時,不會出現鏡面「點」。但是,當我將相機移向立方體頂部並查看原點(0,0,0)時,可以在立方體的照亮側看到微弱的鏡面「點」。高光照明不工作

我的問題是:我做錯了什麼?

以下代碼中的所有內容都發生在modelMatrix中,並且_nav成員管理相機移動。

下面的代碼:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
gluLookAt(_nav->getCamPosx(), _nav->getCamPosy(), _nav->getCamPosz(), 
      _nav->getCamViewx(), _nav->getCamViewy(), _nav->getCamViewz(), 
      _nav->getCamUpx(), _nav->getCamUpy(), _nav->getCamUpz()); 

glEnable(GL_LIGHTING); 
glEnable(GL_LIGHT0); 

GLfloat qaAmbientLight[] = {0.2f, 0.2f, 0.2f, 1.0f}; 
GLfloat qaDiffuseLight[] = {0.8f, 0.8f, 0.8f, 1.0f}; 
GLfloat qaSpecularLight[] = {1.0f, 0.0f, 0.0f, 1.0f}; //red for testing 
glLightfv(GL_LIGHT0, GL_AMBIENT, qaAmbientLight); 
glLightfv(GL_LIGHT0, GL_DIFFUSE, qaDiffuseLight); 
glLightfv(GL_LIGHT0, GL_SPECULAR, qaSpecularLight); 

// Set the light position 
GLfloat qaLightPosition[] = {0.5f, 0.5f, 1.2f, 1.0f}; 
glLightfv(GL_LIGHT0, GL_POSITION, qaLightPosition); 

GLfloat cyan[] = {0.f, .8f, .8f, 1.f}; 
GLfloat white[] = {0.8f, 0.8f, 0.8f, 1.0f}; 
//GLfloat dark[] = {0.0, 0.0, 0.0, 1.0}; 
glMaterialfv(GL_FRONT, GL_AMBIENT, cyan); 
glMaterialfv(GL_FRONT, GL_DIFFUSE, cyan); 
glMaterialfv(GL_FRONT, GL_SPECULAR, white); 
GLfloat shininess[] = {80}; 
glMaterialfv(GL_FRONT, GL_SHININESS, shininess); 

glBegin(GL_QUADS); 

    glNormal3f(0.0f, -1.0f, 0.0f); 
    glVertex3f(0.1f, 0.0f, 0.1f); 
    glVertex3f(1.0f, 0.0f, 0.1f); 
    glVertex3f(1.0f, 0.0f, 1.0f); 
    glVertex3f(0.1f, 0.0f, 1.0f); 

    glNormal3f(0.0f, 0.0f, -1.0f); 
    glVertex3f(0.1f, 0.0f, 0.1f); 
    glVertex3f(1.0f, 0.0f, 0.1f); 
    glVertex3f(1.0f, 1.0f, 0.1f); 
    glVertex3f(0.1f, 1.0f, 0.1f); 

    glNormal3f(-1.0f, 0.0f, 0.0f); 
    glVertex3f(0.1f, 0.0f, 0.1f); 
    glVertex3f(0.1f, 0.0f, 1.0f); 
    glVertex3f(0.1f, 1.0f, 1.0f); 
    glVertex3f(0.1f, 1.0f, 0.1f); 

    //face that gets illuminated 
    glNormal3f(0.0f, 0.0f, 1.0f); 
    glVertex3f(1.0f, 0.0f, 1.0f); 
    glVertex3f(0.1f, 0.0f, 1.0f); 
    glVertex3f(0.1f, 1.0f, 1.0f); 
    glVertex3f(1.0f, 1.0f, 1.0f); 

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

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

glEnd(); 

面對立方體側帶光源:

Facing cube side with light source

立方體的

頂視圖,該微弱的紅色是鏡面 '點':

Top view of the cube, the faint red is the specular 'dot'

回答

0

在固定函數中,只在頂點計算OpenGL光照,然後將結果顏色插入到面上。爲了讓鏡面反射出現,你需要足夠多的頂點,以便有足夠的空間採樣。

顯然,細分網格並不是非常有效,只是爲了照明目的提供足夠的採樣點。所以多年來開發了許多每像素照明技術。使用着色器實現非常簡單(https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/lighting.php)。