【发布时间】:2013-07-03 20:15:25
【问题描述】:
我正在将一段非常简单的代码从 OpenGLES 1.0 移植到 OpenGLES 2.0。
在原始版本中,我启用了混合
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
我在我的 ES 2.0 实现中使用了相同的代码,因为我需要将新渲染的四边形与渲染缓冲区中的内容混合(我保留了渲染缓冲区,我无法重新渲染场景) .
我正在使用用作 alpha 蒙版的纹理(alpha 值显示从中心到外部的径向渐变,alpha 从 1 到 0),仅包含具有不同 alpha 值的白色像素。我给我的顶点同样的颜色,比如红色,alpha 为 100/255。我的背景是透明的黑色。在此之下,我有一个纯白色的表面(UIView)。我渲染了 4 个四边形。
OpenGLES 1.0 的结果(期望的结果)
我的观察告诉我片段着色器应该是:
gl_FragColor = DestinationColor * texture2D(Texture, TexCoordOut);
(我通过为顶点和纹理尝试不同的值得出了这个结论。这也是我在一些教程中阅读的内容。)
我正在尝试编写一些 OpenGL 2.0 代码(包括顶点 + 片段着色器),它会给我带来与 OpenGLES 1.0 中完全相同的结果,仅此而已。除了在纹理上应用顶点颜色外,我不需要/不想在片段着色器中进行任何类型的混合。使用简单的着色器,这是我得到的结果:
我尝试了几乎所有我能想到的 *、+、mix 组合,但我无法重现相同的结果。这是迄今为止我得到的最接近的,但这绝对不是正确的(这也没有任何意义)
varying lowp vec4 DestinationColor;
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
void main(void) {
lowp vec4 texture0Color = texture2D(Texture, TexCoordOut);
gl_FragColor.rgb = mix(texture0Color.rgb, DestinationColor.rgb, texture0Color.a);
gl_FragColor.a = texture0Color.a * DestinationColor.a;
}
这个着色器给了我以下信息:
【问题讨论】:
-
抱歉,您的问题对我来说有点不清楚。你需要的究竟是什么结果?你也在 ES 2.0 中使用混合吗?
-
如果不清楚,我深表歉意。是的,我以同样的方式在 ES 2.0 中启用了混合。我基本上需要与 ES 1.0 中相同的结果,但无法清楚地描述它。我试图描述我是如何在 ES 1.0 中进行设置的。可能还不够……
-
我觉得这个问题现在应该清楚很多了
标签: ios opengl-es opengl-es-2.0 alphablending opengl-es-1.1