2012-05-21 127 views
1

我目前正試圖進入OpenGL着色和光照以在簡單的GLUT窗口中顯示從Blender導出的3D模型。OpenGL着色不起作用。對象看起來很純色

我試圖顯示典型的glutSolidTeapot來驗證我的OpenGL設置。 隨着茶壺一切看起來非常好,可以在下面的圖片中看到。

enter image description here

如果我現在想換成我自己的攪拌機,出口模式的茶壺,遮光不起作用。該模型(一個汽車輪輞)看起來純色。 模型旋轉時顏色會改變,但始終保持穩定。

enter image description here

是什麼glutSolidTeapot引擎蓋繪製茶壺模式下嗎?

下面是我用建立的OpenGL代碼:

void SetupRC() 
{ 
    glClearColor(0.4, 0.4, 0.4, 1.0); 

    // Enable lighting and the light we have set up 
    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_DEPTH_TEST); 

    //Set lighting parameters 
    glLightfv(GL_LIGHT0,GL_POSITION,light_position); 
    glLightfv(GL_LIGHT0, GL_AMBIENT,light_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); 
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); 

    glEnable(GL_COLOR_MATERIAL); 
    glColorMaterial(GL_FRONT_AND_BACK,GL_DIFFUSE); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    // Enable shading 
    glShadeModel(GL_SMOOTH); 

    // Set up the projection parameters 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    glFrustum(-1.0, 1.0, -1.0, 1.0, 2.0, 20.0); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_AUTO_NORMAL); 
    glEnable(GL_NORMALIZE); 
} 

並重繪幀代碼:

void RenderScene(void) 
{ 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 

    glTranslatef(0.0, 0.0, -2.5f); 

    glRotatef(xRot, 1.0f, 0.0f, 0.0f); 
    glRotatef(yRot, 0.0f, 1.0f, 0.0f); 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // set input data to arrays 
    glVertexPointer(3, GL_FLOAT, 0, BlenderGuru_CarWheelVerts); 

    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); 

    GLfloat ambConst[] = { 0.24725, 0.1995, 0.0745, 1.0}; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambConst); 

    GLfloat diffConst[] = { 0.75164, 0.60648, 0.22648, 1.0 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffConst); 

    GLfloat specConst[] = { 0.628281, 0.555802, 0.366065, 1.0 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specConst); 

    glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 51.2); 

    // draw data 
    glEnableClientState(GL_VERTEX_ARRAY); 
     glDrawArrays(GL_TRIANGLES, 0, BlenderGuru_CarWheelNumVerts); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    glFlush(); 
} 
+1

你的模型完全平坦的可見一面嗎?如果是這樣,AUTO_NORMALS將爲所有頂點生成相同的法線,並且 - 假設定向照明 - 所有三角形的顏色相同。 – Lyth

+0

默認情況下,Blender的導出法線選項是禁用的。啓用它並在繪圖時使用普通指針,一切正常。感謝所有你們! – guitarflow

回答

4

因爲你是從攪拌機出口,導出的數據將最可能也包含法線。如果沒有,請確保爲您的模型生成並導出它們。您需要普通數據才能使照明工作。

致電glEnable(GL_AUTO_NORMAL);不會做你可能認爲它的作用。它將只有

當使用GL_MAP2_VERTEX_3GL_MAP2_VERTEX_4來生成頂點時,生成法向量。

因此,您可以自行導出正常數據並使用它,或者可以根據可用的網格數據計算法線。

+0

如果你看看OP的代碼,你會看到,他根本不提供法線。 – datenwolf

+0

@datenwolf這確實很笨拙,措辭不恰當。謝謝。 – Bart

4

您的代碼缺少加載/設置正常數據。沒有法線,照明不起作用。

+0

感謝您的提示。攪拌器出於某種原因不會導出它們。我會再看一遍 – guitarflow