如果您想实现与UIKit类似的透明纹理(如PNG)的混合,如何适当配置OpenGL ES 1.1?
我发现:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_ALPHA_TEST);
但也有:
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE);
您应该使用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)
,而要只绘制alpha,请使用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);