渲染到FBO会产生意外的结果



我有一个统一的Android插件,该插件将使用OpenGL ES进行一些本机渲染。

我已经简化了代码,并成功地重现了问题:

       GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId);
    //Draw texture to framebuffer
    GLES20.glViewport(0, 0, width, height);
    GLES20.glUseProgram(program);
    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
    GLES20.glUniformMatrix4fv(u_MVPMatrix, 1, false, matrix, 0);
    GLES20.glEnableVertexAttribArray(a_Position);
    GLES20.glVertexAttribPointer(a_Position, 3, GLES20.GL_FLOAT, false, 0, verticesBuffer);
    GLES20.glEnableVertexAttribArray(a_texCoord);
    GLES20.glVertexAttribPointer(a_texCoord, 2, GLES20.GL_FLOAT, false, 0, uvBuffer);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indices.length, GLES20.GL_UNSIGNED_SHORT, indicesBuffer);
    GLES20.glFinish();
    GLES20.glFlush();
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0);

当我强迫Unity仅使用OpenGL ES20时,它的工作正常,但是如果使用OpenGL ES30,我会得到意外的结果和此处给出的输入阵列:

GLES20.glVertexAttribPointer(a_Position, 3, GLES20.GL_FLOAT, false, 0, verticesBuffer);

被忽略,给定的四边形以不同的形状绘制。无论我将输入坐标更改为什么,我仍然会得到相同的奇数形状。

我不是OpenGL编码器,所以我找不到问题。我是否缺少在这里设置一些状态?

如reto koradi在评论中所建议的,客户端顶点阵列在ES 3.0中弃用。当切换到VBO时,它可以正常工作。不确定为什么,但是假设它与Unity后留下的一些未知的OpenGL状态有关。

最新更新