2010-11-04 39 views
4

有沒有辦法告訴OpenGL不要將完全透明片段的深度寫入深度緩衝區?OpenGL:我能否從深度緩衝區中遮蓋完全透明的碎片?

可以肯定的是,我想渲染的紋理從來都不是半透明的;其alpha值只有1.0或0.0,並且我使用GL_NEAREST過濾器,所以它不會插入任何值。

我認爲當片段的alpha值爲0.0時OpenGL能夠簡單地不寫入深度緩衝區是合理的(這樣我可以以任何順序渲染具有這種紋理的基元) ),但我找不到一種方法讓OpenGL做到這一點。有沒有人知道它是否可行,在那種情況下,它是如何完成的?

回答

6

只是爲了澄清:你想要alpha = 0.0的片段既不能寫入色彩緩衝區也不能寫入深度緩衝區?此外,我假設您目前正在使用混合來遮罩透明像素,否則這應該不成問題。

在這種情況下,你可以簡單地使用丟棄片段在fragmentshader:

if(color.a<=0.0){ 
    discard; 
} 

這將確保在其條件爲真的所有的碎片將根本不會被渲染(而不是用共混幀緩衝器上的零因子)。如果你是(無論什麼原因)編程固定管道,你可以使用阿爾法測試來獲得相同的行爲(我個人建議切換到前向兼容(意義着色器)路徑,但多數民衆贊成在旁邊)。

glEnable(GL_ALPHA_TEST); 
glAlphaFunc(GL_GREATER,0.0f); 

作爲額外的獎勵,因爲這些方法殺死片段,而不是渲染它看不見它可能會更快然後勾兌(雖然我沒有看過成最近,所以它的威力,但一般不應慢,所以它仍然是一個加號)

+0

謝謝!這是我正在尋找的GL_ALPHA_TEST。我很驚訝,我沒有找到它。 :) – Dolda2000 2010-11-04 01:13:42

+0

@ user134252:你是否有任何令人信服的理由使用固定管道?從長遠來看,着色器通常不那麼頭疼。此外,固定管道在較新的opengl版本中已棄用,所以避免它是一個好主意(一些固定管道功能實際上可能未在硬件中實現並迫使軟件退回)。假設你還在學習opengl(如果我錯了,請原諒)如果學習未來的思維方式而不是棄用的方式,是不是更有意義?就像一個建議。 – Grizzly 2010-11-04 01:23:59

+2

首先,我仍然希望保持與某些設備的向後兼容性。但是,即使如此,固定功能管線的優點是可以很容易地組合各種功能(如選擇啓用照明,alpha測試,紋理和相互獨立的功能),而無需實施整個元編程系統用於着色器代碼組合。這很重要,如果你問我。 – Dolda2000 2011-03-31 07:15:40