List of usage examples for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER
int GL_FRAMEBUFFER
To view the source code for com.badlogic.gdx.graphics GL20 GL_FRAMEBUFFER.
Click Source Link
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); }