如果您想实现类似于 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);
如果您想实现类似于 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 并重用具有透明度的纹理也是如此。在这种情况下,您应该使用单独绘制 Alpha 通道glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE)
。这意味着将绘制调用加倍(至少我想不出没有着色器的更好解决方案)。要仅绘制颜色,您必须设置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);