2011-01-22 33 views
7

我正在开发iPhone游戏。我有下面的源图像将其绘制到背景。源图像具有阿尔法0x00和围绕边缘的渐变,并且背景的阿尔法是0xff。当我将源图像绘制到背景时,我会看到“结果”图像的黑色。我正在使用OpenGL ES glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)方法。我已经改变了每一个可能的论点,但每次都没有移动。iPhone开启alpha混合。我在边缘有黑色

为什么我在源图像的边缘有黑色?问题是什么? iphone中的每款游戏都不会使用渐变?

我是否需要用渐变来制作源图像?

有谁知道解决方案?

图片来源:

alt text

结果图像:

alt text

回答

14

贵形象都预乘阿尔法?然后,你应该使用

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

Here是它是什么一些解释。

注:我做了一些研究后重写了答案。文章rotoglup提到了一些有关发生了什么的洞察力,它更有意义,然后我的原始公式。我也试着看看其他人在他们的代码中使用了什么,看起来这个公式是最常用的。真正令人惊讶的是,像alpha混合这样的3D图形中如此基本的东西会如此引起争议,每个人似乎都在重新发明轮子并提出自己的解决方案。

+0

一致认为,这看起来像一个典型的双倍乘alpha。 – v01d 2011-01-23 10:07:26

+0

它不应该是ONE,ONE_MINUS_SRC_ALPHA吗? – rotoglup 2011-01-23 10:57:53

0

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

0

如果您没有正确设置缩放和放大滤镜的正确glTexParameteri以及钳位方法,可能出现这种情况。请参阅Adam Redwood的评论here。注意两个幂次纹理,纹理边界等问题也可能发挥作用。

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);