要在iOS上使用的OpenGL ES 1.1 alpha混合配置



如果您想实现与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);

相关内容

  • 没有找到相关文章

最新更新