我正在用OpenGL和C++編寫一個簡單的2D框架,現在遇到了與透明紋理和混合有關的問題。我已經將我的問題減少到了以下。OpenGL背景清晰的顏色滲入透明紋理
我有兩個紋理:地磚和魚骨。後者包含透明像素。我把我的OpenGL鮮明的色彩,以「綠色透明」,使深度測試和混合是這樣的:
glClearColor(0, 1, 0, 0)
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
有兩個調用glDrawElements()
我畫魚,然後在地板上。魚具有較高的Z值,因此應放置在地磚前面。 This is the result。
很顯然,我不希望這樣的魚周圍有綠色的盒子。我認爲會發生什麼情況是,魚的像素與繪製時幀緩衝區的顏色渲染緩衝區中的任何內容混合,並且恰好是純綠色(由於glClearColor
和glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
)。對於魚紋理中的每個透明像素,我都希望這種混合能夠解析爲透明(因爲我已經設置了透明的透明顏色),但正如你所看到的那樣,這不是發生了什麼。
如果我先畫地板,然後是魚,它的作品as expected。
我的片段着色器是死的簡單:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
gl_FragColor = texture2D(Texture, TexCoordOut);
}
難道我真的要管理繪製順序手動(用Z排序座標)或者是有辦法解決這個問題? OpenGL深度緩衝系統不是專爲解決這個問題而設計的嗎?
我正在通過Xcode在iOS模擬器上測試我的程序。
有些方法可以在不進行排序的情況下進行透明化(例如http://www.eng.utah.edu/~cs5610/lectures/OrderIndependentTransparency.pdf),但我認爲它們對於這裏描述的情況是過度的,所以我認爲你的答案是好的。 – GuyRT