Example usage for com.badlogic.gdx.graphics GL30 GL_RGBA8

List of usage examples for com.badlogic.gdx.graphics GL30 GL_RGBA8

Introduction

In this page you can find the example usage for com.badlogic.gdx.graphics GL30 GL_RGBA8.

Prototype

int GL_RGBA8

To view the source code for com.badlogic.gdx.graphics GL30 GL_RGBA8.

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 w  w w  .  j  a va2  s .  c  o 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();
}