2011-09-25 38 views
2

我想繪製一個簡單的水晶,它的軸上旋轉。我可以通過繪製一個金字塔然後再次繪製它來輕鬆地獲得該形狀,但是我遇到了兩個問題。如何在OpenGL中繪製旋轉棱鏡?

首先,即使我畫出所有顏色相同的顏色,其中兩個面的顏色與其他顏色不同。第二,它在每個金字塔上放置一個「底部」,通過晶體的半透明牆壁可以看到,這會破壞效果。有什麼辦法擺脫它嗎?

下面是我用來設置和繪製GL場景的代碼。當然,還有更多的OpenGL代碼,但這是相關的部分。

procedure Initialize; 
begin 
    glShadeModel(GL_SMOOTH); 
    glClearColor(0.0, 0.0, 0.0, 0.5); 
    glClearDepth(1.0); 
    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LEQUAL); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); 
end; 

procedure Draw; //gets called in a loop 
begin 
    glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(-1.5,-0.5,-6.0); 
    glRotatef(rotation,0.0,1.0,0.0); 
    glBegin(GL_TRIANGLE_FAN); 
    glColor4f(0, 0, 1, 0.2); 
    glVertex3f(0, 3.4, 0); 
    glVertex3f(-1, 0, -1); 
    glVertex3f(-1, 0, 1); 
    glVertex3f(1, 0, 1); 
    glVertex3f(1, 0, -1); 
    glVertex3f(-1, 0, -1); 
    glEnd; 
    glBegin(GL_TRIANGLE_FAN); 
    glVertex3f(0, -3.4, 0); 
    glVertex3f(-1, 0, -1); 
    glVertex3f(-1, 0, 1); 
    glVertex3f(1, 0, 1); 
    glVertex3f(1, 0, -1); 
    glVertex3f(-1, 0, -1); 
    glEnd; 
    rotation := rotation + 0.02; 
end; 

任何人都知道我在做什麼錯,如何解決它?

+0

我認爲你必須定義棱鏡上的每個面。這樣做時,將面的顏色設置爲適當的。請參閱本教程,該教程首先繪製2D形狀,然後在下一頁繪製3D形狀。 http://www.euclideanspace.com/software/games/setup/openglcpp/shapes/index.htm –

回答

6

我想畫一個簡單的水晶

停止。晶體是半透明的,當你開始繪製半透明物體的時候,你基本上可以放棄任何「簡單」效應的概念。渲染一個真正的棱鏡(不同波長折射不同波長的光)是需要某種形式的光線追蹤才能正確的。還有許多光線追蹤器甚至無法正確識別,因爲它們僅追蹤R,G和B波長,而您需要追蹤許多波長以近似棱鏡的折射和光分裂圖案。

你會得到最好的是像OpenGL光柵器的某種程度的fakery。

我無法解釋臉部正在發生什麼,但看到其他多邊形的問題很簡單:您沒有使用backface culling。除非您想查看透明對象的背面,否則您需要確保背面剔除處於活動狀態。

+0

謝謝,這工作。這是一個很棒的教程系列,BTW。感謝您的鏈接。我並沒有試圖製作出真實的真實感水晶或其他任何東西,只是基本的形狀和概念是正確的。 –