4

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

球.png

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

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

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

对.png

但相反,我得到了这个:

错误.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;
}

片段着色器:

varying lowp vec2 texCoordOut;
uniform sampler2D texture;

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

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

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

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

4

2 回答 2

2

如果glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)并且glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)产生相同的结果,那么您的纹理具有 1.0 的统一 alpha。因此,您将获得相当于添加剂混合的结果,并给出您显示的结果。如果出现任何情况,您正在预乘 alpha,然后将 alpha 通道扔掉。

因此,要检查的显而易见的事情是(i)磁盘上的文件;(ii) 你的纹理加载代码。如果您不要求GLKTextureLoaderApplyPremultiplication(并且这不应该影响您的 alpha 通道;大概您是直接从磁盘加载?)那么怀疑会落在 (i) 上,尽管您在上面直接包含的图像似乎在起作用正确。

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

于 2012-10-16T02:58:48.927 回答
1

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

大笨蛋,就在这里。

于 2012-10-18T19:41:51.527 回答