首页 > 解决方案 > 链接多个 GLES 2.0 程序

问题描述

我正在尝试分层/链接多个 GLES 2.0 效果/程序。在我的具体情况下,第一遍渲染视频帧,然后第二遍渲染顶部的一些粒子,最后我想应用一个动画缩放效果来转换整个合成。我现在链接着色器的方法是分别编译/附加/链接它们,然后在我的 onDrawFrame() 方法中为每一个连续调用 glUseProgram()。

    super.onDrawFrame(fbo); // this is where I call the previous glUseProgram() ...
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBufferName);
    GLES20.glEnableVertexAttribArray(getHandle("aPosition"));
    GLES20.glVertexAttribPointer(getHandle("aPosition"), VERTICES_DATA_POS_SIZE, GL_FLOAT, false, VERTICES_DATA_STRIDE_BYTES, VERTICES_DATA_POS_OFFSET);
    GLES20.glEnableVertexAttribArray(getHandle("aTextureCoord"));
    GLES20.glVertexAttribPointer(getHandle("aTextureCoord"), VERTICES_DATA_UV_SIZE, GL_FLOAT, false, VERTICES_DATA_STRIDE_BYTES, VERTICES_DATA_UV_OFFSET);

    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 3); // texture #3 was just a guess but the previous ones appear to refer to stuff from the particles program, not the whole composition
    GLES20.glUniform2f(getHandle("zoomCenter"), .5f, .5f); // passing the variables to the shader, don't think there's a problem with that part, therefore not including their source
    GLES20.glUniform1f(getHandle("zoomFactor"), 2f);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);
    GLES20.glDisableVertexAttribArray(getHandle("aPosition"));
    GLES20.glDisableVertexAttribArray(getHandle("aTextureCoord"));

这对于前两层效果很好,我可以按预期在视频上绘制我的粒子。当我将动画缩放着色器应用于未合成的视频帧时,它本身也可以按预期工作。

然而,当我运行上面的代码时,我得到的东西看起来可能是整个图像的缩放,但随后它会随着每一帧逐渐变白,大约一秒钟后完全变白。

我想这可能是因为我调用GLES20.glBlendFunc了之前的粒子 GL 程序,所以某种添加剂混合不会出乎意料,但GLES20.glDisable ( GLES20.GL_BLEND );只会给我一个黑屏。我是按错误的顺序称呼东西还是我的假设是胡说八道,GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 3);到目前为止可能指的是整个作品?或者,也许我只是从根本上误解了链接这些着色器的方式。

标签: javaandroidopengl-es

解决方案


推荐阅读