iPhone OpenGL ES Alpha混合。我的边缘是黑色。

7
我正在开发iPhone游戏。我有以下源图像以将其绘制到背景中。源图像的alpha值为0x00,边缘周围有渐变色,而背景的alpha值为0xff。但是当我将源图像绘制到背景中时,出现了黑色,就像您可以看到的结果图像一样。我正在使用OpenGL ES glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)方法。我已更改了所有可能的参数,但每次它都没有移动。
为什么源图像的边缘有黑色?问题出在哪里?难道不是每个iPhone游戏都使用渐变吗?
我需要使源图像没有渐变吗?
有谁知道解决方案?
源图像: alt text 结果图像: alt text
3个回答

14

你的图像是否有预乘Alpha通道? 那么你应该使用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

这里有一些关于它的解释。

注意: 我在做了一些研究后改写了答案。rotoglup提到的文章对于正在发生的事情有一些见解,比我最初的公式更合理。我还尝试看看其他人在他们的代码中使用了什么,看起来这个公式是最常用的。令人惊讶的是,在3D图形中如此基础的东西——透明度混合可以如此具有争议,每个人似乎都要重新发明轮子并提出自己的解决方案。


同意,这看起来像是 alpha 的典型双精度浮点数乘法。 - v01d
难道不应该是 ONE,ONE_MINUS_SRC_ALPHA 吗? - rotoglup
1
这里有一篇文章,可以作为另一个解释的来源:http://home.comcast.net/~tom_forsyth/blog.wiki.html#%5B%5BPremultiplied%20alpha%5D%5D - rotoglup
@rotoglup:也许你是对的。我想我以前用过这个,但现在没有代码可以检查了。 - detunized

0

这种情况可能发生的一种方式是您没有正确设置缩小和放大过滤器的glTexParameteri,以及您的夹紧方法。请参见Adam Redwood的评论此处。请注意,2的幂纹理、纹理边界等问题也可能会产生影响。

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

0

只需检查您正在绘制的视图是否不透明。将opaque属性设置为false。


这是OpenGL,不是UIKit。 - v01d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接