2011-01-12 105 views
1

我試圖顯示「透明」表面(不封閉卷)與正面和背面都可見(不撲捉)。OpenGL alpha混合問題與背面可見

例如,顯示在兩側應用透明度的圓錐體或圓柱體。 有一些可見的工件,其中一部分表面似乎不正確地處理alpha值。

這個問題似乎是我(opengl)試圖將alpha從表面的正面應用到表面的背面。 (當表面的內部/外部都可見時)。

void init() 
{ 
    glMatrixMode(GL_PROJECTION); 
    gluPerspective(/* field of view in degree */ 40.0, 
     /* aspect ratio */ 1.0, 
     /* Z near */ 1.0, /* Z far */ 10.0); 
    glMatrixMode(GL_MODELVIEW); 
    gluLookAt(0.0, 0.0, 5.0, /* eye is at (0,0,5) */ 
     0.0, 0.0, 0.0,  /* center is at (0,0,0) */ 
     0.0, 1.0, 0.);  /* up is in positive Y direction */ 
    glTranslatef(0.0, 0.6, -1.0); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glLightfv(GL_LIGHT0, GL_AMBIENT, light0_ambient); 
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light0_diffuse); 
    glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse); 
    glLightfv(GL_LIGHT1, GL_POSITION, light1_position); 
    glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse); 
    glLightfv(GL_LIGHT2, GL_POSITION, light2_position); 

    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    //glEnable(GL_CULL_FACE); 
    glFrontFace(GL_CW); 

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

} 
void draw() 
{ 
    static GLfloat amb[] = {0.4f, 0.4f, 0.4f, 0.0f}; 
    static GLfloat dif[] = {1.0f, 1.0f, 1.0f, 0.0f}; 
    static GLfloat back_amb[] = {0.4f, 0.4f, 0.4f, 1.0f}; 
    static GLfloat back_dif[] = {1.0f, 1.0f, 1.0f, 1.0f}; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LIGHT1); 
    glDisable(GL_LIGHT2); 
    amb[3] = dif[3] = 0.5f;// cos(s)/2.0f + 0.5f; 
    glMaterialfv(GL_FRONT, GL_AMBIENT, amb); 
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dif); 
    glMaterialfv(GL_BACK, GL_AMBIENT, back_amb); 
    glMaterialfv(GL_BACK, GL_DIFFUSE, back_dif); 
    glPushMatrix(); 
    glTranslatef(-0.3f, -0.3f, 0.0f); 
    glRotatef(angle1, 1.0f, 5.0f, 0.0f); 
    glutSolidCone(1.0, 1.0, 50, 2); 
    glPopMatrix(); 

    ///... 
    SwapBuffers(wglGetCurrentDC()); // glutSwapBuffers(); 

} 

該代碼是基於:http://www.sgi.com/products/software/opengl/examples/glut/examples/source/blender.c

tinyurled鏈接到2張圖片的flickr表示問題(但是從生產出來的代碼,而不是上面的代碼,但兩者具有相同的類型的問題): http://flic.kr/p/99soxyhttp://flic.kr/p/99pg18

謝謝。 最大。

回答

5

您的問題可能是兩個問題的混合。

  • 爲您深度測試開啓,並且所有多邊形寫深度緩衝區,如果他們最近的多邊形後得出較遠的多邊形不能有助於像素的顏色。您應該嘗試禁用深度測試。

  • alphablending是一個非交換操作,所以三角形繪製的順序很重要,並且會改變結果。要獲得一致的結果,您必須按照一致的順序繪製三角形。在你的代碼中,這個順序可能會有所不同,具體取決於視點。由於您的物體是凸面的,因此您可以在兩次通過時繪製物體,這兩個通道都啓用了剔除功能,第一次繪製背面三角形(距離相機最遠),然後是面向前方的三角形(最近)

更一般地說,任意幾何圖形的正確混合是一個難題,如果你想進一步研究,你可能想看看Order Independent Transparency算法(深度剝離,...)。

+0

謝謝。似乎是在我們的軟件上這麼做的漫長過程。 – Max 2011-03-16 12:51:08