2011-05-12 52 views
1

即時渲染PNG的簡單方塊在opengl ES 2.0,但是當我嘗試和畫一個廣場後面的東西我已經繪製了我的頂部廣場的透明區域呈現與背景相同的顏色。opengl z排序透明

我在每次呈現調用的開始時調用這些函數。

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
glEnable(GL_DEPTH_TEST); 
glEnable (GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

你可以發佈一個截圖嗎? – ChrisF 2011-05-12 21:51:04

回答

5

您的標題基本上就是您的問題的答案!

通常透明度是通過首先渲染場景中的所有不透明對象(讓z緩衝區找出可見的東西),然後渲染所有透明對象。

+0

好的,所以我需要先渲染後面的。沒有其他解決方法。 – user346443 2011-05-12 22:02:20

+1

@ user346443:沒有。這是所有柵格化器的一個基本原理,OpenGL是根據光柵器定義的。順序獨立渲染透明面是一個非常熱門的研究課題,但到目前爲止所有的方法實現了使用多個渲染目標或類似的背對背排序算法。 – datenwolf 2011-05-12 22:21:44

4

德魯霍爾給你一個很好的答案,但另一種選擇是設置glEnable(GL_ALPHA_TEST)glAlphaFunc(GL_GREATER, 0.1f)。這將防止透明像素(在這種情況下,具有alpha < 0.1f的像素)完全不被渲染。這樣他們不會寫入Z緩衝區,其他的東西可以「顯示」。但是,這隻適用於完全透明的對象。它在0.1 alpha邊緣的任何地方都有粗糙的邊緣,並且對於與對象相比像素較大的遠處特徵而言,這看起來很糟糕。

+0

在es 2.0中是否存在GL_ALPHA_TEST和glAlphaFunc?我無法找到他們。 – user346443 2011-05-12 22:08:48

+0

如果你正在編寫自己的着色器,你可以通過丟棄alpha值低於給定值的任何片段來模擬這種效果。 – 2011-05-13 01:46:20

5

想通了。你可以丟棄在片段着色器中

mediump vec4 basecolor = texture2D(sTexture, TexCoord); 

if (basecolor.a == 0.0){ 
    discard; 
} 

gl_FragColor = basecolor; 
+0

是的,這相當於'GL_ALPHA_TEST'在固定功能流水線中做了什麼,除了測試是用'glAlphaFunc'配置的。 – 2011-05-13 01:47:16

+0

我發現這對繪圖樹時的z排序問題非常有用。雖然我的樹被排序回到前面,但有時候兩棵密集的樹靠得很近,以致它們的距離相等,因此一棵樹被拉過另一棵樹,引起一個令人討厭的框。拋出低alpha像素解決了這個問題,但我仍然必須先排序,因爲如果我不這樣做,粗放棄可能看起來不愉快。 – locka 2013-01-24 14:38:43

+2

這是一個更好的答案,海事組織 - 因爲大多數人只是在尋找簡單的透明度。半透明需要其他技術,並且這是很有誤導性的,有多少人告訴你,如果不進行重新排序(或類似深度剝離),您將無法做到透明。 – 2013-05-18 19:17:13