为什么alpha混合渐变纹理会在OpenGL ES 2.0中产生意外结果?

时间:2012-10-16 02:39:41

标签: ios opengl-es opengl-es-2.0

我有一个径向渐变纹理(RGBA),从中心的黑色完全不透明的颜色到边缘的完全透明的颜色:

ball.png

我使用最新的OpenGL模板设置了一个iOS项目,该模板使用了GLKit。我添加了纹理功能,并在setupGL方法中设置了以下代码:

glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

当我在白色背景上的正投影中重叠其中两个纹理(每个纹理都有一个单独的z)时,我希望这样:

right.png

但我得到了这个:

wrong.png

我的问题很简单:为什么? OpenGL ES 2.0的混合可以达不到这种效果吗? (我之前在OpenGL ES 1.1中已经开始工作)我有什么常见的东西我不见了?它可能是我纹理的预乘alpha问题吗?如果是这样,我的PNG或我加载它的方式会有些奇怪吗?我正在使用GLKTextureLoader加载纹理。

我很可能错了,但我明白它不能成为着色器问题,因为alpha混合在它到达片段着色器之前就已经发生了。我的着色器只是直接传递信息。 (也许这是一个问题?)

顶点着色器:

attribute vec4 position;
attribute vec2 texCoordIn;

varying vec2 texCoordOut;

uniform mat4 modelViewProjectionMatrix;

void main()
{
    gl_Position = modelViewProjectionMatrix * position;
    texCoordOut = texCoordIn;
}

Fragment Shader:

varying lowp vec2 texCoordOut;
uniform sampler2D texture;

void main()
{
    gl_FragColor = texture2D(texture, texCoordOut);
}

我也尝试过如下设置glBendFunc,但是得到了相同的结果:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

欢迎任何提示或常见的挂断。谢谢!

2 个答案:

答案 0 :(得分:2)

如果glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)产生相同的结果,那么纹理的均匀alpha值为1.0。因此,您将得到相当于添加剂混合的内容,给出您显示的结果。如果出现任何问题,你将通过alpha预乘,然后抛弃alpha通道。

所以要检查的显而易见的事情是(i)磁盘上的文件; (ii)纹理加载代码。如果您没有要求GLKTextureLoaderApplyPremultiplication(并且这不应该影响您的Alpha通道;可能是您直接从磁盘加载?)然后怀疑会落在(i)上,尽管您的图像是直接的上面列出的内容似乎正确。

在片段着色器之后发生混合。为了进一步调试问题,您可以尝试丢弃其余信息,例如,将alpha通道中的值作为alpha = 1.0的红色通道传递。

答案 1 :(得分:1)

嗯,我是个白痴。实际发生的是我的顶点的一个简单问题。我使用单个glDrawArrays调用一次绘制所有纹理,但我忘了在矩形之间添加额外的顶点来创建退化三角形。所以基本上第三个球在中心被压扁了。但它看起来像阿尔法混合问题!

大假人,就在这里。