Search code examples
androidopengl-esopengl-3android-graphics

Setting Framebuffer's Depth/Stencil Buffer on Android OpenGL ES 3.1


I'm trying to attach a depth and stencil buffer to a frame buffer. I'm doing this as follows:

int[] bufferHandle = new int[1];
GLES31.glGenRenderbuffers(1, bufferHandle, 0); // glError = 0 (GL_NO_ERROR)
GLES31.glRenderbufferStorage(GLES31.GL_RENDERBUFFER, GLES31.GL_DEPTH24_STENCIL8, width, height);  // glError = 1282 (GL_INVALID_OPERATION)
GLES31.glBindRenderbuffer(GLES31.GL_RENDERBUFFER, 0); //  // glError = 0 (GL_NO_ERROR)
GLES31.glFramebufferRenderbuffer(GLES31.GL_FRAMEBUFFER, GLES31.GL_DEPTH_STENCIL_ATTACHMENT, GLES31.GL_RENDERBUFFER, bufferHandle);  // glError = 1282 (GL_INVALID_OPERATION)

The glRenderbufferStorage and glFramebufferRenderbuffer calls return 1282 (GL_INVALID_OPERATION). Any ideas what I might be missing?


Solution

  • The error occur, because the render buffer object is not created.

    glGenRenderbuffers generates a unused name respectively reserves a name, which can be used for a render buffer, but it doesn't create or bind the render buffer object. For this you've to call glBindRenderbuffer:

    int[] bufferHandle = new int[1];
    GLES31.glGenRenderbuffers(1, bufferHandle, 0);
    GLES31.glBindRenderbuffer(GLES31.GL_RENDERBUFFER, bufferHandle[0]);
    GLES31.glRenderbufferStorage(GLES31.GL_RENDERBUFFER, GLES31.GL_DEPTH24_STENCIL8, width, height);
    

    Note, the render buffer object is created, when glBindRenderbuffer is called the first time, bside that the object is bound to the specified target.
    glRenderbufferStorage establishes the format and size of the data storage.