OpenGL纹理混合问题
我正在为使用OpenGL ES的iPad创建一个2D应用程序,并在绘制透明图像时遇到了一些问题。
我使用完全透明的png-24图像。 我也在改变一些纹理的颜色,这些纹理是白色的,有些区域是透明或半透明的。 这一切都很好。
但是,当我尝试设置其中一个纹理的Alpha值时,它的工作不正确。 颜色太饱和了,如果alpha值= 0,我会在浅灰色背景上留下白色而不是透明图像。 当这样的透明图像超过暗图像时,暗图像变成与透明图像的颜色类似的颜色。
我尝试了glTexEnvi
和glBlendFunc
的许多参数组合,但glTexEnvi
没有成功。
我对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);
听起来像你告诉OpenGL你的纹理已经预乘alpha,但实际上并没有。
你为glBlendFunc
使用了什么参数?
预倍乘α的更多解释
感谢大家的意见。 我想我找到了一个解决方案。
问题在于纹理已经预乘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
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_MODULATE替换该GL_ALPHA,以便可以使用顶点颜色(glColor)控制纹理alpha。 该模式将纹理与顶点颜色相乘。
链接地址: http://www.djcxy.com/p/5815.html