2012-01-04 53 views
2

在OpenGL中模擬透明度時,我遇到了一個問題。 下面是這種情況:透明對象內部的OpenGL alpha混合

我有一個爲球體代表的船舶。 現在我想談談在船上增加一個盾牌。我也選擇了一個球體,但是半徑更大,並設置了α因子0.5(不透明度)。然而,盾牌不會出現,顏色也不會混合(就好像它不在那裏)。

相機位於第一個球體的中心。我認爲問題在於我在這個領域內,所以opengl會忽略它(不是繪製它)。

的代碼看起來是這樣的:

//ship colors setup with alpha 1.0f 
glutSolidSphere(1, 100, 100); original sphere (ship) 
//shield colors setup with alpha 0.5f 
glutSolidSphere(3, 100, 100); //the shield whose colors should blend with the rest of the scene 

我雖然在船的前方平行六面來模擬盾。 然而,這不是我想要的......

編輯:我發現了錯誤。我將gluPerspective()的參數設置得太高,所以即使我正確設置了alpha值,相機始終處於對象的前面,因此無法看到它。

回答

0

似乎在這裏工作:

#include <GL/glut.h> 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(0, 0, -5); 

    glDisable(GL_BLEND); 
    glColor4ub(255,0,0,255); 
    glutSolidCube(1.0); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
    glColor4ub(0,255,0,64); 
    glutSolidSphere(1.5, 100, 100); 

    glFlush(); 
    glutSwapBuffers(); 
} 

void reshape(int w, int h) 
{ 
    glViewport(0, 0, w, h); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(60, (double)w/(double)h, 0.01, 100); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE); 

    glutInitWindowSize(800,600); 
    glutCreateWindow("Blending"); 

    glutDisplayFunc(display); 
    glutReshapeFunc(reshape); 
    glutMainLoop(); 
    return EXIT_SUCCESS; 
} 
+0

很好的相機是不是範圍之外,這是正確的在船的中心。但是,似乎如果我移動相機上的中心工作過你的例子中的立方體。你能解釋一下當物體內發生了什麼嗎? – 2012-01-04 17:37:44

+0

那麼,假設'glEnable(GL_DEPTH_TEST)',並且如果你在內部(=第一個繪製的)球體看着你的深度緩衝區將填充一個(近)Z值。試圖進一步繪製第二個球體會導致第二個球體中的每個像素的深度測試失敗,因爲它們將比內球體「更遠」。我的例子工作,因爲我不啓用'GL_DEPTH_TEST'並且它默認關閉。 – genpfault 2012-01-04 20:02:21