2011-03-01 176 views
6

我有時會在渲染幀期間禁用通過glDepthMask(GL_FALSE)進行深度緩衝區寫入。這對一些GPU(比如摩托羅拉Droid的PowerVR)來說非常合適,但是對於採用Adreno GPU的HTC EVO,我最終得到的幀緩衝區是完整的垃圾(我看到了我渲染的網格的痕跡,但是整個屏幕大部分都是垃圾)。glDepthMask(GL_FALSE)在某些GPU上渲染幀緩衝區

如果我強制glDepthMask在整個時間都是真的,一切正常。

我需要glDepthMask在alpha渲染的部分過程中關閉。什麼會導致framebuffer通過轉向深度註銷而被破壞?

+0

那麼你的問題是什麼? – 2011-03-01 23:46:26

+1

Ehm ...當我禁用glDepthMask時,爲什麼framebuffer會被丟棄? – EboMike 2011-03-01 23:46:59

+0

剛剛發生在我們身上的每個Adreno GPU上,我們都可以掌握(Nexus One,HTC Incredible 2和XPeria Play)。我們的解決方案是在每幀開始時執行glClear(GL_DEPTH_BUFFER_BIT)。 有趣的是我們甚至沒有深度緩衝區! Android非常可愛... – hasvn 2012-07-23 15:42:30

回答

6

問題是glDepthMask在致電glClearDepth時需要爲真。這顯然只適用於Adreno GPU,而不適用於PowerVR GPU。

+2

我有同樣的問題;但我從來沒有實際調用glClearDepth()。相反,我只是確信glDepthMask在每一幀結束時都是真實的,並且場景不再被破壞。這看起來像是Android或GPU驅動程序中的錯誤;它發生在我的3個不同的Android設備上。 – 2011-10-01 04:17:55

1

不知道這是否有幫助,但我想知道是否仍需要清除深度緩衝區 - 特別是在禁用glDepthMask之前。我相信glDepthMask只啓用/禁用寫入,而不是深度測試。也許GL實現仍在測試先前渲染過程中的舊深度緩衝區信息,因此只能繪製到屏幕的一部分。然後它看起來被毀壞了。一些實現可能會清除深度緩衝區,其他可能不會?如果這個建議完全忽略了這個標記,那就感覺不去理會。

無論如何,希望能有所幫助。

+0

是的,我在渲染幀之前將其清除。我將所有內容都設置爲1.0,開始渲染啓用深度寫入的不透明對象,然後執行禁用了深度寫入的alpha混合對象。幾乎所有的時間都在進行深度測試。 – EboMike 2011-03-02 05:38:55

0

iPhone4/iOS模擬器。如果我在glClear之前沒有將glDepthMask設置爲true,我會渲染渲染。我花了兩天的時間解決了這個問題,將幀緩衝區轉儲到磁盤上,調查整個幀的軌跡,進入代碼...... 這是唯一有效的工作。

NEVERMIND。我真笨。我正在執行深度掩碼= false的glClear(COLOR | DEPTH),所以深度緩衝區根本沒有被清除。 我的第一個回覆是由一整天的調試引起的:/