ios - 为什么 alpha 混合渐变纹理会在 OpenGL ES 2.0 中产生意想不到的结果?

标签 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的blending达不到这个效果吗? (我之前已经在 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);

欢迎任何提示或常见问题。谢谢!

最佳答案

如果 glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 产生相同的结果,那么您的纹理具有统一的 alpha 1.0。因此,您得到的相当于加法混合,给出了您显示的结果。如果出现任何问题,您正在预乘 alpha,然后丢弃 alpha channel 。

所以很明显要检查的是 (i) 磁盘上的文件; (ii) 您的纹理加载代码。如果您不要求 GLKTextureLoaderApplyPremultiplication(而且这应该不会影响您的 alpha channel ;大概您是直接从磁盘加载?)那么怀疑会落在 (i) 上,尽管图像您' 直接包含在上面似乎可以正确运行。

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

关于ios - 为什么 alpha 混合渐变纹理会在 OpenGL ES 2.0 中产生意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906784/

相关文章:

ios - 更新数据源时,坐标轴、标签和标题被隐藏或重叠/遮挡

android - 是否可以使用 OpenGL ES 2.0 扭曲底层图像?

android - 我应该单独存储变换矩阵吗?

ios - Swift 4 和 iOS 11 中的快速点击手势

ios - 使用 Cocoapods 更新 AWSS3

iphone - 为什么我的 OpenGL ES View 在 iOS 4.3 上有时是空白的?

iPhone 绘画应用程序(基于 glPaint)。与白色背景混合

c - OpenGL ES 2.0 : Object flattens as it rotates

opengl-es - 没有属性的顶点着色器

ios - indexpath 处行的高度不适用于自定义 uitableviewcell