編輯+更好的解決方案:OpenGL Alpha混合問題,混合忽略(也許)?
如果有人遇到我遇到的問題,有兩種解決方案。一個是接受的解決方案,但只適用於你正在做的事情如何我是。讓我來解釋我在做什麼:
1)渲染明星背景篩選
2)渲染船,那麼粒子對FBO
3)渲染FBO篩選
這個問題,因此解決這個問題首先發生,因爲我將FBO與明星背景混合在一起。
真正的解決方案,據說也稍微快一點,就是簡單地將星型背景呈現給FBO,然後將FBO呈現爲禁用混合的屏幕。使用這種方法,我不需要用glBlendFuncSeparate一塌糊塗......
1)渲染明星,然後船,然後顆粒FBO
2)渲染FBO篩選與混合禁用
----------原始問題:----------
從我所瞭解的問題來看,混合被忽略了。具有alpha透明度的粒子紋理完全覆蓋下面的像素。
我正在創建一個自上而下的遊戲。相機略微傾斜,以便有一定的深度感。我使我的船,那麼撕心裂肺它們上面的顆粒...
開始OpenGL上下文
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glCullFace(GL_BACK);
在渲染循環後,我這樣做:
glBindFramebuffer(GL_FRAMEBUFFER,ook->fbo);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
entitymgr_render(ook); //Render entities. Always 1.0 alpha textures.
glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE);
//glBlendFunc(GL_SRC_ALPHA,GL_ONE); //This would enable additive blending for non-premult
particlemgr_render(ook); //Render particles. Likely always <1.0 alpha textures
//glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glBindFramebuffer(GL_FRAMEBUFFER,0);
如果我運行用上面的代碼,我得到這樣的結果...
Particle tex:
從OGL探查(蘋果機工具)截圖:所述FBO的
截圖而不呈現任何顆粒:
的FBO的屏幕截圖的一些顆粒呈現在頂部:
如您所見,粒子儘管具有alpha透明度,但不會與下面呈現的船舶混合。相反,它只是完全覆蓋像素。
最終筆記,設置着色器中的像素透明度正確混合 - 船在下面顯示。這裏是我的着色器:
#version 150
uniform sampler2D s_tex1;
uniform float v4_color;
in vec4 vertex;
in vec3 normal;
in vec2 texcoord;
out vec4 frag_color;
void main()
{
frag_color=texture(s_tex1,texcoord)*v4_color;
if(frag_color.a==0.0) discard;
}
讓我知道是否有任何我可以提供。
我接受了另一個答案,在這之後發佈了其他答案,因爲他/她更好地描述了問題以及glBlendFuncSeparate在此處做了什麼。這仍然是正確的答案。 – teh1