2012-11-08 54 views
3

我試圖創建一個簡單的細胞着色效果,它涉及到背部和前臉撲殺。但到目前爲止,我的撲殺結果很奇怪。OpenGL的背面剔除曹景偉奇怪的結果

安裝OpenGL的源代碼:

// init matrices 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
gluPerspective(45, 800/600, 0.01f, 150); 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
// enable opengl caps 
glEnable(GL_NORMALIZE); 
glEnable(GL_CULL_FACE); 
// cell shading effects 
glLineWidth(3.5f); 
// setup display list 
pDList = glGenLists(1); 
glNewList(pDList, GL_COMPILE); 
    glBegin(GL_QUADS); 
     // front 
     glNormal3f(0, 0, 1); 
     glVertex3f(-0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -1, -3); 
     glVertex3f(-0.25f, -1, -3); 
     // back 
     glNormal3f(0, 0, -1); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(-0.25f, -1, -3.5f); 
     // top 
     glNormal3f(0, 1, 0); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(-0.25f, -0.5f, -3); 
     // bottom 
     glNormal3f(0, -1, 0); 
     glVertex3f(-0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3); 
     glVertex3f(-0.25f, -1, -3); 
     // right 
     glNormal3f(1, 0, 0); 
     glVertex3f(0.25f, -0.5f, -3); 
     glVertex3f(0.25f, -0.5f, -3.5f); 
     glVertex3f(0.25f, -1, -3.5f); 
     glVertex3f(0.25f, -1, -3); 
     // left 
     glNormal3f(-1, 0, 0); 
     glVertex3f(-0.25f, -0.5f, -3); 
     glVertex3f(-0.25f, -0.5f, -3.5f); 
     glVertex3f(-0.25f, -1, -3.5f); 
     glVertex3f(-0.25f, -1, -3); 
    glEnd(); 
glEndList(); 

渲染代碼:

// clear 
glClear(GL_COLOR_BUFFER_BIT); 
glClearColor(0.75f, 0.75f, 0.75f, 1); 
// reset matrix 
glLoadIdentity(); 
// draw cube 
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 
glCullFace(GL_BACK); 
glColor3i(0, 0, 0); 
glCallList(pDList); 

這是我得到:

enter image description here

出於某種原因,它只能繪製權立方體的一面。奇怪的。 我改變了glCullFace(GL_BACK); glCullFace(GL_FRONT);在我的渲染功能。 我得到這個:

enter image description here

現在,它的繪製每邊?它似乎認爲立方體的右側面向後,前方,立方體的其餘部分朝後。當我禁用剔除功能時,我也會在上圖中看到相同的結果。

其他相關信息,我能想到的是,我使用SDL,而且我敢肯定,這不是顯卡的問題,因爲我已經跑了這兩個不同的計算機,每個產生相同結果。

我剛開始學習如何設置一個原語的法線,所以很可能這是一個很大的n00b錯誤,或者一些愚蠢的錯誤。我想成爲一個百萬富翁,如果我每一次我做過的最輕率的明顯錯誤的時間得到一分錢,並已粘貼了幾個小時。

因此,概括地說,我做了什麼錯誤,以及如何獲得正確的臉邊宰殺或以適當的方式不剔除?

+0

我的OpenGL的初始化代碼是有點生疏,但你不應該某處定義你的頂點(GL_CW,GL_CCW)的順序? – MFH

+0

不太清楚你的意思是什麼,我仍然在學習OpenGL ... – Aaron

+0

顯然謝爾蓋K有相同的想法,但能夠以更好的方式呈現:) – MFH

回答

4

如果從減法向量中查看每個三角形,可以定義指定頂點的順序(稱爲winding):順時針或逆時針。

您必須與其一致並指定CWCCW繞組中的所有頂點才能使剔除工作正確進行。

+0

非常感謝它現在工作正常! – Aaron