2016-12-05 38 views
1

我在Unity中有一个Android插件,它将使用OpenGL ES进行一些本地渲染。向FBO渲染会产生意想不到的效果

我简化了代码,这一点,它成功地再现了问题:

 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); 

它工作正常,当我强制统一使用唯一的OpenGL ES20,但如果使用OpenGL ES30,我得到意想不到的结果和这里给出的输入数组:

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

被忽略,给定的四边形绘制在不同的形状。不管我改变输入坐标,我仍然会得到相同的奇怪形状。

我不是OpenGL编码器,所以我找不到问题。我错过了在这里设置一些州吗?

+0

什么是'verticesBuffer'? OpenGL缓冲区的名称,还是Java缓冲区对象?客户端顶点数组在ES 3.0中被标记为已弃用。但他们仍然应该工作。 –

+0

verticesBuffer是FloatBuffer类型,并包含四边形中顶点的坐标。 – sinsro

+0

好的。正如我所说的,尽管这是ES 3.0中不推荐使用的功能,但它仍应该支持向后兼容ES 2.0。但是,无论如何你可能会更好地使用VBOs。 –

回答

0

正如Reto Koradi在评论中所建议的那样,客户端顶点数组在ES 3.0中已弃用。当切换到维也纳国际组织时,它可以工作不知道为什么,但认为它与Unity之后留下的未知OpenGL状态有关。

相关问题