2010-09-13 101 views
7

我怎樣才能做一個Z緩衝區與OpenGL的預備。前Z緩衝區通過OpenGL?

心中已經試過這樣:

glcolormask(0,0,0,0); //disable color buffer 

//draw scene 

glcolormask(1,1,1,1); //reenable color buffer 

//draw scene 

//flip buffers 

但它不工作。這樣做後我什麼也沒有看到。有什麼更好的方法來做到這一點?

感謝

+0

你是想用只固定管線做到這一點?使用着色器可能會更容易一些。 – 2010-09-13 17:57:29

回答

13
// clear everything 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

// z-prepass 
glEnable(GL_DEPTH_TEST); // We want depth test ! 
glDepthFunc(GL_LESS);  // We want to get the nearest pixels 
glcolormask(0,0,0,0);  // Disable color, it's useless, we only want depth. 
glDepthMask(GL_TRUE);  // Ask z writing 

draw() 

// real render 
glEnable(GL_DEPTH_TEST); // We still want depth test 
glDepthFunc(GL_LEQUAL); // EQUAL should work, too. (Only draw pixels if they are the closest ones) 
glcolormask(1,1,1,1);  // We want color this time 
glDepthMask(GL_FALSE); // Writing the z component is useless now, we already have it 

draw(); 
0

如果我得到你的權利,你試圖通過禁用OpenGL的執行,以確定剔除深度測試。你在這裏使用顏色功能,這對我沒有意義。我認爲您正在嘗試執行以下操作:

glDisable(GL_DEPTH_TEST); // disable z-buffer 

// draw scene 

glEnable(GL_DEPTH_TEST); // enable z-buffer 

// draw scene 

// flip buffers 

不要忘記在每次傳遞開始時清除深度緩衝區。

+0

基本上,我正在嘗試做一個Z預備嘗試避免繪製某些東西。 – jmasterx 2010-09-13 17:55:18

+0

其實這與他所問的完全相反。 Z準備用於*只測試深度而不計算任何照明。這個想法是,您可以使用便宜的深度測試儘早拒絕大量遮擋物體,並且僅爲可見的幾何體節省昂貴的照明計算。 – 2010-09-13 17:56:47

+0

那麼我該怎麼做呢:p – jmasterx 2010-09-13 17:59:44

3

你正在用glColorMask做正確的事情。

但是,如果您沒有看到任何內容,可能是因爲您使用了錯誤的深度測試功能。 您需要GL_LEQUAL,而不是GL_LESS(這恰好是默認設置)。

glDepthFunc(GL_LEQUAL);