Example usage for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER

List of usage examples for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER.

Prototype

int GL_FRAMEBUFFER

To view the source code for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER.

Click Source Link

Usage

From source file:de.fatox.meta.graphics.buffer.MultisampleFBO.java

License:Apache License

protected void build() {
    GL20 gl = Gdx.gl20;/*from   www. j ava 2  s .co  m*/

    checkValidBuilder();

    // iOS uses a different framebuffer handle! (not necessarily 0)
    if (!defaultFramebufferHandleInitialized) {
        defaultFramebufferHandleInitialized = true;
        if (Gdx.app.getType() == ApplicationType.iOS) {
            IntBuffer intbuf = ByteBuffer.allocateDirect(16 * Integer.SIZE / 8).order(ByteOrder.nativeOrder())
                    .asIntBuffer();
            gl.glGetIntegerv(GL20.GL_FRAMEBUFFER_BINDING, intbuf);
            defaultFramebufferHandle = intbuf.get(0);
        } else {
            defaultFramebufferHandle = 0;
        }
    }

    framebufferHandle = gl.glGenFramebuffer();
    gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, framebufferHandle);
    GLFrameBuffer.FrameBufferBuilder imBuilder = new GLFrameBuffer.FrameBufferBuilder(getWidth(), getHeight());

    int width = bufferBuilder.width;
    int height = bufferBuilder.height;

    if (bufferBuilder.hasDepthRenderBuffer) {
        depthbufferHandle = gl.glGenRenderbuffer();
        gl.glBindRenderbuffer(GL20.GL_RENDERBUFFER, depthbufferHandle);
        Gdx.gl30.glRenderbufferStorageMultisample(GL20.GL_RENDERBUFFER, 4,
                bufferBuilder.depthRenderBufferSpec.internalFormat, width, height);
    }

    if (bufferBuilder.hasStencilRenderBuffer) {
        stencilbufferHandle = gl.glGenRenderbuffer();
        gl.glBindRenderbuffer(GL20.GL_RENDERBUFFER, stencilbufferHandle);
        Gdx.gl30.glRenderbufferStorageMultisample(GL20.GL_RENDERBUFFER, 4,
                bufferBuilder.stencilRenderBufferSpec.internalFormat, width, height);
    }

    if (bufferBuilder.hasPackedStencilDepthRenderBuffer) {
        depthStencilPackedBufferHandle = gl.glGenRenderbuffer();
        gl.glBindRenderbuffer(GL20.GL_RENDERBUFFER, depthStencilPackedBufferHandle);
        Gdx.gl30.glRenderbufferStorageMultisample(GL20.GL_RENDERBUFFER, 4,
                bufferBuilder.packedStencilDepthRenderBufferSpec.internalFormat, width, height);
    }

    isMRT = bufferBuilder.textureAttachmentSpecs.size > 1;
    isMRT = true;
    int colorTextureCounter = 0;
    if (isMRT) {
        for (FrameBufferTextureAttachmentSpec attachmentSpec : bufferBuilder.textureAttachmentSpecs) {
            int texture = createTexture(attachmentSpec);
            textureAttachments++;
            if (attachmentSpec.isColorTexture()) {
                gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL30.GL_COLOR_ATTACHMENT0 + colorTextureCounter,
                        GL32.GL_TEXTURE_2D_MULTISAMPLE, texture, 0);
                imBuilder.addColorTextureAttachment(GL30.GL_RGBA8, GL30.GL_RGBA, GL30.GL_UNSIGNED_BYTE);
                colorTextureCounter++;
            } else if (attachmentSpec.isDepth) {
                gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT, GL30.GL_TEXTURE_2D,
                        texture, 0);
                imBuilder.addDepthTextureAttachment(GL30.GL_DEPTH_COMPONENT32F, GL30.GL_FLOAT);
            } else if (attachmentSpec.isStencil) {
                gl.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_STENCIL_ATTACHMENT, gl.GL_TEXTURE_2D,
                        texture, 0);
            }
        }
    } else {
        int texture = createTexture(bufferBuilder.textureAttachmentSpecs.first());
        textureAttachments = 1;
        imBuilder.addColorTextureAttachment(GL30.GL_RGBA8, GL30.GL_RGBA, GL30.GL_UNSIGNED_BYTE);
        gl.glBindTexture(GL32.GL_TEXTURE_2D_MULTISAMPLE, texture);
        Gdx.gl30.glFramebufferTexture2D(GL20.GL_FRAMEBUFFER, GL20.GL_COLOR_ATTACHMENT0,
                GL32.GL_TEXTURE_2D_MULTISAMPLE, texture, 0);
    }

    if (isMRT) {
        IntBuffer buffer = BufferUtils.newIntBuffer(colorTextureCounter);
        for (int i = 0; i < colorTextureCounter; i++) {
            buffer.put(GL30.GL_COLOR_ATTACHMENT0 + i);
        }
        buffer.position(0);
        Gdx.gl30.glDrawBuffers(colorTextureCounter, buffer);
    }

    if (bufferBuilder.hasDepthRenderBuffer) {
        gl.glFramebufferRenderbuffer(GL20.GL_FRAMEBUFFER, GL20.GL_DEPTH_ATTACHMENT, GL20.GL_RENDERBUFFER,
                depthbufferHandle);
    }

    if (bufferBuilder.hasStencilRenderBuffer) {
        gl.glFramebufferRenderbuffer(GL20.GL_FRAMEBUFFER, GL20.GL_STENCIL_ATTACHMENT, GL20.GL_RENDERBUFFER,
                stencilbufferHandle);
    }

    if (bufferBuilder.hasPackedStencilDepthRenderBuffer) {
        gl.glFramebufferRenderbuffer(GL20.GL_FRAMEBUFFER, GL30.GL_DEPTH_STENCIL_ATTACHMENT,
                GL20.GL_RENDERBUFFER, depthStencilPackedBufferHandle);
    }

    gl.glBindRenderbuffer(GL20.GL_RENDERBUFFER, 0);
    gl.glBindTexture(GL32.GL_TEXTURE_2D_MULTISAMPLE, 0);

    assertShit();
    gl.glBindFramebuffer(GL20.GL_FRAMEBUFFER, defaultFramebufferHandle);

    addManagedFrameBuffer(Gdx.app, this);
    nonMultisampledFbo = imBuilder.build();
}

From source file:de.fatox.meta.graphics.buffer.MultisampleFBO.java

License:Apache License

private void assertShit() {
    GL20 gl = Gdx.gl;/*from   ww  w  .j a  v a  2  s  . c  om*/
    int result = gl.glCheckFramebufferStatus(GL20.GL_FRAMEBUFFER);
    if (result != GL20.GL_FRAMEBUFFER_COMPLETE) {

        if (hasDepthStencilPackedBuffer) {
            gl.glDeleteBuffer(depthStencilPackedBufferHandle);
        } else {
            if (bufferBuilder.hasDepthRenderBuffer)
                gl.glDeleteRenderbuffer(depthbufferHandle);
            if (bufferBuilder.hasStencilRenderBuffer)
                gl.glDeleteRenderbuffer(stencilbufferHandle);
        }

        gl.glDeleteFramebuffer(framebufferHandle);

        if (result == GL20.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT)
            throw new IllegalStateException("frame buffer couldn't be constructed: incomplete attachment");
        if (result == GL20.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS)
            throw new IllegalStateException("frame buffer couldn't be constructed: incomplete dimensions");
        if (result == GL20.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT)
            throw new IllegalStateException("frame buffer couldn't be constructed: missing attachment");
        if (result == GL20.GL_FRAMEBUFFER_UNSUPPORTED)
            throw new IllegalStateException(
                    "frame buffer couldn't be constructed: unsupported combination of formats");
        throw new IllegalStateException("frame buffer couldn't be constructed: unknown error " + result);
    }
}

From source file:de.fatox.meta.graphics.buffer.MultisampleFBO.java

License:Apache License

/** Makes the frame buffer current so everything gets drawn to it. */
public void bind() {
    Gdx.gl20.glBindFramebuffer(GL20.GL_FRAMEBUFFER, framebufferHandle);
}