Android - 与ZOrderOnTop混合的OpenGL-ES-2.0 alpha

时间:2013-12-08 14:17:17

标签: android opengl-es-2.0 alphablending

我的问题如下:我正在显示一个GLOurfaceView,其ZOrderOnTop设置为true,并带有一个简单的黄色背景。

<com.example.MyGLSurfaceView
    android:id="@+id/glid"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFF00" /> <!-- yellow background --!>

在MyGLSurfaceView中,我将视图设置如下:

setEGLContextClientVersion(2);
setEGLConfigChooser(8, 8, 8, 8, 0, 0);
getHolder().setFormat(PixelFormat.TRANSLUCENT);
setPreserveEGL();

setZOrderOnTop(true);
setRenderer(renderer); // variable was initialized

我想要实现的目标是:为彼此设置2个纹理。第一个纹理有1f alpha,第二个是从0f到1f的动画随着时间的推移(在这种情况下为5000 ms)。为了简化示例,我将纹理设置为全白(第1个)和全黑(第2个),文件中的alpha值均为255。

我的onSurfaceCreated方法(来自 GLES20 类的调用使用静态导入):

@Override
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
    glClearColor(1f, 0f, 1f, 1f);// Pink clear color

    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    ...
}

我将清晰的颜色设置为粉红色以进行测试。我也使用顶点和片段着色器,它们也加载到onSurfaceCreated中。在这种情况下,顶点着色器是无关紧要的(我认为)所以这是我的fragment shader

precision mediump float;

uniform sampler2D u_TextureUnit;
uniform float u_alpha;

varying vec2 v_TextureCoordinates;

void main()
{
    gl_FragColor = texture2D(u_TextureUnit, v_TextureCoordinates);
    gl_FragColor[3] *= u_alpha; 
}

我设置了我希望统一的alpha值。对象的绘制:

glClear(GL_COLOR_BUFFER_BIT);
glUniform1f(uAlphaLocation, 0f);
... //drawing white rectangle
glUniform1f(uAlphaLocation, percent);
//percent varies from 0f - 1f based on progress of the animation
... //drawing black rectangle translated right a bit so they overlap

我得到以下输出: 在0f%: enter image description here

动画中期:enter image description here

1f%/动画结束时:enter image description here

您可以在2个矩形的重叠处看到黄色。我想它来自视图的背景,并且与ZOrderOnTop是真的有关。黄色部分的颜色代码为 115,115,66。第二个矩形的右侧部分: 115,49,66

当我使用setZOrderOnTop(false)并删除GLSurfaceView的背景时,它可以正常工作:enter image description here

我正在尝试使用其他混合功能,但它们都没有正常工作。

我想拥有的是GLSurfaceView的背景(显然我会将透明颜色设置为透明)并进行正确的Alpha混合。这可以实现吗?任何帮助赞赏。

0 个答案:

没有答案