OpenGL纹理混合问题

时间:2011-03-29 01:16:15

标签: iphone ipad opengl-es

我正在使用OpenGL ES为iPad创建一个2D应用程序,并且在绘制透明图像时出现问题。

我正在使用完全透明的png-24图像。我也在改变一些纹理的颜色,这些纹理是白色的,有些区域是透明的或半透明的。一切正常。

但是,当我尝试设置其中一个纹理的alpha值时,它的效果并不正常。颜色太饱和了,如果alpha值= 0,我会在浅灰色背景上留下白色而不是透明的图像。当这样的透明图像在暗图像上时,暗图像变为与透明图像的颜色类似的颜色。

我尝试了glTexEnviglBlendFunc的许多参数组合但没有成功。

我对OpenGL不是很了解,所以如果有人有任何建议,那就太棒了。如果有任何细节可以帮助我,请告诉我。

感谢。


这是OpenGL的初始化

    glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

    glDisable(GL_DEPTH_TEST);

    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_BLEND);

4 个答案:

答案 0 :(得分:4)

听起来你告诉OpenGL你的纹理有预乘alpha,但实际上并没有。

您对glBlendFunc使用了哪些参数?

More explanation of pre-multiplied alpha

答案 1 :(得分:2)

感谢大家的投入。我想我找到了解决方案。

问题在于纹理具有预乘alpha但是应用纹理的多边形没有。在glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);到位的情况下,我所要做的就是手动将多边形的R,G和B颜色值乘以alpha值,以便一切都基本上使用预乘alpha并一致地渲染。

我不确定这是否是最有效的解决方案,但它似乎到目前为止工作得很好,只需在我的图像渲染类中添加几行代码就可以在不透明度时更新颜色值改变了。

的Wooo

答案 2 :(得分:1)

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ALPHA);

这是无效的,你检查GL错误了吗?检查glTexEnv手册页以查看有效值:

http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml

GL_ALPHA不是纹理函数,有效的纹理函数是GL_ADD,GL_MODULATE,GL_DECAL,GL_BLEND,GL_REPLACE和GL_COMBINE。

您可能希望将GL_ALPHA替换为GL_MODULATE,以便可以使用顶点颜色(glColor)控制纹理alpha。此模式将纹理与顶点颜色相乘。

答案 3 :(得分:0)

如果您使用的是24位PNG,则可能无法使用Alpha通道。尝试转换为32位PNG并编辑Alpha通道。或者,您可以自己从24位转换为32位,并从图像数据生成alpha通道(例如:通过色度键控)。

如果您想要添加剂混合,请使用glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);glBlendFunc(GL_SRC_ALPHA, GL_ONE);