Iphone OpenGL纹理混合问题

Iphone OpenGL纹理混合问题,iphone,ipad,opengl-es,Iphone,Ipad,Opengl Es,我正在使用OpenGL ES为iPad创建一个2d应用程序,在绘制透明图像时遇到了一些问题 我使用的是完全透明的png-24图像。我还改变了一些纹理的颜色,它们是白色的,有些区域是透明的或半透明的。一切正常 但是,当我尝试设置其中一种纹理的alpha值时,效果并不理想。颜色太饱和了,如果alpha值=0,我会在浅灰色背景上留下一个白色而不是透明的图像。当这样的透明图像覆盖在暗图像上时,暗图像变成与透明图像的颜色相似的颜色 我尝试了glTexEnvi和glBlendFunc的许多参数组合,但都没有

我正在使用OpenGL ES为iPad创建一个2d应用程序,在绘制透明图像时遇到了一些问题

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

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

我尝试了
glTexEnvi
glBlendFunc
的许多参数组合,但都没有成功

我对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); glTexEnvi(GL_纹理环境、GL_纹理环境模式、GL_调制); glClearColor(1.0f、1.0f、1.0f、1.0f); glDisable(GLU深度测试); glEnableClientState(GL_顶点_数组); glEnableClientState(GL_颜色_阵列); glEnable(GL_纹理_2D); glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA); glEnableClientState(GL_纹理_坐标_阵列); glEnable(GL_混合物);
听起来像是你告诉OpenGL你的纹理有预乘alpha,但实际上没有

您对
glBlendFunc
使用哪些参数


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

然后使用
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)
glBlendFunc(GL_SRC_ALPHA,GL_ONE)如果要添加混合

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ALPHA);
这是无效的,您正在检查总账错误吗?检查glTexEnv手册页以查看有效值:

GL_ALPHA不是纹理函数,有效的纹理函数有GL_添加、GL_调制、GL_贴花、GL_混合、GL_替换和GL_组合


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

感谢大家的输入。我想我找到了解决办法

问题是纹理具有预乘alpha,但纹理应用到的多边形没有预乘alpha。使用
glBlendFunc(GL_ONE,GL_ONE减去SRC_ALPHA)
glTexEnvi(GL_纹理环境、GL_纹理环境模式、GL_调制)我所要做的就是手动将多边形的R、G和B颜色值乘以alpha值,这样所有内容基本上都使用预乘alpha并一致渲染

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


wooo

混合函数设置为
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去_SRC_ALPHA)。我也在我的问题中添加了OpenGl初始化代码。显然,混合函数实际上被设置为
glBlendFunc(GL_ONE,GL_ONE,减去SRC_ALPHA)我代码中的其他地方。将其更改为
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)修复了设置透明颜色的问题,但它破坏了半透明纹理和纹理边缘的渲染,使其变成可怕的灰色。@Anthony:您的纹理中很可能混合了预乘和未乘alpha。”。您可以保持一致,也可以切换
glBlendFunc
。我认为alpha预乘可能是问题所在,尽管所有图像的问题都是一致的。alpha预乘法是图像中烘焙出来的还是编译过程中发生的?如何禁用它?thanks@Anthony:它在图像中存在(或不存在),但它决不是永久固定的,您可以在加载时轻松更改它。PNG的alpha通道工作正常。问题是当我更改纹理映射到的顶点的颜色时。使用任何不透明颜色都可以,但透明颜色会导致这些问题。这有意义吗?或者我解释得不对吗?您是否通过
glTexEnv
设置了任何内容?我将纹理环境函数更改为
glTexEnv(GL\u texture\u ENV,GL\u texture\u ENV\u MODE,GL\u MODULATE)。你说得对,但这并不能解决我的问题。如果我使用
glBlendFunc(GL\u ONE,GL\u ONE\u减去SRC\u ALPHA)我遇到了在透明多边形上渲染纹理的问题,正如我所描述的那样,渲染得很奇怪。如果我使用
glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA)这些透明胶片渲染正确,但纹理中的半透明像素显示为灰色。你对此有什么想法吗?谢谢。@Anthony您确定帧缓冲区中有alpha通道吗?这是一个常见的错误。