2015-02-10 69 views
0

我试图渲染到纹理,然后将纹理绘制到正方形中。在创建帧缓冲区时,我在glFramebufferRenderbufferglFramebufferTexture2D调用后得到无效操作。这里是应该创建帧缓冲区的功能:OpenGL ES 2.0创建帧缓冲区无效操作

private void createFrameBuffer() 
{ 
    final int[] texture = new int[1]; 
    frameTextureID = texture[0]; 
    GLES20.glGenTextures(1,texture,0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, frameTextureID); 

    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_NEAREST); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE); 
    GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE); 

    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null); 

    final int[] depthBuffer = new int[1]; 
    GLES20.glGenRenderbuffers(1, depthBuffer, 0); 
    renderBufferID = depthBuffer[0]; 

    GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER, depthBuffer[0]); 
    GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER, GLES20.GL_DEPTH_COMPONENT16, width, height); 

    final int[] frameBuffer = new int[1]; 
    GLES20.glGenFramebuffers(1,frameBuffer,0); 
    frameBufferID = frameBuffer[0]; 
    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,frameBufferID); 

    GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, frameTextureID, 0); 
    error("glFramebufferTexture2D"); 
    GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT , GLES20.GL_RENDERBUFFER, renderBufferID); 
    error("glFramebufferRenderbuffer"); 

    frameBufferComplete("createFrameBuffer"); 

    GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0); 
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0); 
} 

我不明白这是什么问题。

ps:当我检查函数结束时,帧缓冲区已完成。

回答

0

这些前几个语句顺序错误:

final int[] texture = new int[1]; 
frameTextureID = texture[0]; 
GLES20.glGenTextures(1,texture,0); 

才把它是由glGenTextures()设定的texture[0]值。所以frameTextureID将始终为0

相反,这应该是:

final int[] texture = new int[1]; 
GLES20.glGenTextures(1,texture,0); 
frameTextureID = texture[0]; 

还要注意的是RGBA8(RGBA与8位分量)不能保证在ES 2.0渲染格式。这是你的纹理使用GL_RGBAGL_UNSIGNED_BYTE的组合。许多实现通过OES_rgb8_rgba8 extension来支持它。但是,如果您想完全确定您的代码适用于所有设备,则需要使用RGB565等支持的格式之一:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, 
        GLES20.GL_RGBA, GLES20.GL_UNSIGNED_SHORT_5_6_5, null); 
相关问题