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

Unity3d 渲染到FBO会产生意外的结果,unity3d,opengl-es,Unity3d,Opengl Es,我在Unity中有一个Android插件,它将使用OpenGL ES进行一些本地渲染 我将代码简化为这样,它成功地再现了问题: GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboId); //Draw texture to framebuffer GLES20.glViewport(0, 0, width, height); GLES20.glUseProgram(program); GLES2

我在Unity中有一个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中不推荐客户端顶点数组。当切换到VBOs时,它会工作。不确定原因,但假设它与Unity之后留下的未知OpenGL状态有关。

正如Reto Koradi在评论中所建议的,在ES 3.0中不推荐客户端顶点数组。当切换到VBOs时,它会工作。不确定原因,但假设它与Unity之后留下的未知OpenGL状态有关。

什么是
verticesBuffer
?OpenGL缓冲区或Java缓冲区对象的名称?客户端顶点数组在ES 3.0中标记为不推荐使用。尽管.verticesBuffer是FloatBuffer类型,并且包含quad.Ok中顶点的坐标,但它们仍然可以工作。正如我所说的,为了向后兼容ES2.0,应该仍然支持它,即使它是ES3.0中不推荐使用的特性。但无论如何,您最好还是使用VBOs。您是否正确地查询属性和制服的绑定位置(例如,如何获取
u\u MVPMatrix
a\u Position
等的位置值)?我可以想象一个ES 3.0编译器可能有不同的绑定偏移量,因为它必须分配额外的内置符号(可能与应用程序符号共享绑定表标识符)。什么是
verticesBuffer
?OpenGL缓冲区或Java缓冲区对象的名称?客户端顶点数组在ES 3.0中标记为不推荐使用。尽管.verticesBuffer是FloatBuffer类型,并且包含quad.Ok中顶点的坐标,但它们仍然可以工作。正如我所说的,为了向后兼容ES2.0,应该仍然支持它,即使它是ES3.0中不推荐使用的特性。但无论如何,您最好还是使用VBOs。您是否正确地查询属性和制服的绑定位置(例如,如何获取
u\u MVPMatrix
a\u Position
等的位置值)?我可以想象一个ES 3.0编译器可能有不同的绑定偏移量,因为它必须分配额外的内置符号(可能与应用符号共享绑定表标识符)。