在iOS上使用哪种OpenGL ES 1.1 alpha混合配置?

时间:2013-12-09 17:59:00

标签: ios opengl-es opengl-es-1.1

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

1 个答案:

答案 0 :(得分: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)并绘制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);