2013-12-09 85 views
0

如果您想要实现与UIKit类似的具有透明度(如PNG)的纹理混合,那么您如何适当地配置OpenGL ES 1.1?哪些OpenGL ES 1.1 alpha混合配置在iOS上使用?

我发现:

glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
glDisable(GL_ALPHA_TEST); 

但也有:

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE); 

回答

0

您应该使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);。另一个在这种情况下完全不尊重alpha通道,它将简单地总结源和目标颜色。

有一点你应该注意。这对颜色很有用,但你的目的地alpha通道不正确。在大多数情况下,您不使用它,但是如果您希望从alpha通道的缓冲区中提取图像,您将需要它,同样可以使用FBO并重复使用具有透明度的纹理。在这种情况下,您应该使用glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE)分别绘制Alpha通道。这意味着双倍的绘制调用(至少我不能想到没有着色器的更好的解决方案)。提请颜色只有你有设置glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE)并提请阿尔法只使用glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE)

综上所述:

glEnable(GL_BLEND); 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
//draw the scene 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); 
glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE); 
//draw the scene 
glDisable(GL_ALPHA_TEST); 
glDisable(GL_BLEND);