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