2013-11-15 50 views
-1

混合在我的程序中的深度和混合使能,所以他們將互相影響得到最終結果,有兩個矩形紅色和藍色,紅色更接近視點。在三維

當紅色首先繪製成爲不透明物體並遮擋藍色,但是當首先繪製藍色時,紅色變爲半透明物體並與藍色混合。

我的解釋是當紅色繪製第一個藍色不會繪製,因爲深度緩衝區,但在第二個狀態藍色將有機會被繪製,並將與紅色混合。

這種解釋提出了一個問題,這是我真正的問題:

爲什麼當藍色的第一引出雖然它是更接近觀察點,而在第一狀態紅不紅透亮透亮成爲?

進入這裏

#include <glew.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 


    void init(void) 
    { 
glClearColor(0.0,0.0,0.0,0.0); 
glClearDepth(1.0); 

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

    glEnable(GL_DEPTH_TEST); 

    } 


void v(void); 

void Red(void) 
    { 

glColor4f(1.0,0.0,0.0,1.0); 
glBegin(GL_POLYGON); 
glVertex3f(0.5,0.5,-0.8); 
glVertex3f(-0.5,0.5,-0.8); 
glVertex3f(-0.5,-0.5,-0.8); 
glVertex3f(0.5,-0.5,-0.8); 
glEnd(); 

glFlush(); 

} 

void Blue(void) 
    { 


glColor4f(0.0,0.0,1.0,0.5); 
glBegin(GL_POLYGON); 
glVertex3f(0.5,0.5,-0.7); 
glVertex3f(-0.5,0.5,-0.7); 
glVertex3f(-0.5,-0.5,-0.7); 
glVertex3f(0.5,-0.5,-0.7); 
glEnd(); 



glFlush(); 
} 


void Display(void) 
{ 
v(); 

Red(); 
Blue(); 
} 


void v() 
{ 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(-1.0,1.0,-1.0,1.0,1.0,-1.0); 

} 

int main(int argc, char** argv) 
    { 

glutInit(&argc, argv); 
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 
glutInitWindowSize (200, 200); 
glutCreateWindow (argv[0]); 
init(); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 


glutDisplayFunc(Display); 
glutMainLoop(); 
return 0; 
} 

回答

2

代碼爲什麼當藍色的第一引出雖然它是更接近觀察點,而在第一狀態紅不紅透亮透亮成爲?

因爲深度測試和混合不混合。深度測試根據其深度值丟棄碎片(例如原始像素)。如果傳入的片段未通過深度測試,則會被丟棄。

但是,無意識混合只是將幀緩衝區像素的顏色與傳入片段結合在一起。如果碎片被丟棄,則什麼都不會發生。

實際上,這意味着,當它們未通過深度測試時,您不能追溯性地混合事物。這意味着,在混合時,只能使用深度測試來獲得不透明的幾何圖形的遮擋。但是,您不會執行深度寫入操作,並且您必須在繪製之前將所有東西都排序靠近。

+0

你主要是那個藍色矩形沒有失敗與紅色矩形的深度測試,因此它已被繪製並與紅色矩形混合? – user1841718

+0

@ user1841718:情況正是如此。但是紅色的長方形沒有通過深度測試,所以沒有畫出任何東西,而是留下了藍色矩形的混合以及任何繪製過的東西。 OpenGL不是一個場景圖,它沒有世界的概念。所有OpenGL知道的是繪製點,線或三角形,一次一個到操作系統提供的畫布。它主要是煙霧和鏡子,深度測試是實現隱藏表面去除的廉價而簡單的方法,其價格無法做到與訂單無關的透明度,而這仍然是一個正在進行的研究課題。 – datenwolf