0

如果您想实现类似于 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);
4

1 回答 1

0

你应该使用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);
于 2013-12-10T09:11:52.797 回答