- public void init(GL2 gl) {
- int[] id = new int[] {0};
- gl.glGenFramebuffers(1, id, 0);
- _bufferTarget = id[0];
- gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _bufferTarget);
- id = new int[] {0};
- gl.glGenRenderbuffers(1, id,0);
- _depthBufferTarget = id[0];
- gl.glRenderbufferStorage(GL2.GL_RENDERBUFFER, GL2.GL_DEPTH_COMPONENT, _width, _height);
- gl.glFramebufferRenderbuffer(GL2.GL_FRAMEBUFFER, GL2.GL_DEPTH_ATTACHMENT, GL2.GL_RENDERBUFFER, _depthBufferTarget);
- id = new int[] {0};
- gl.glGenTextures(1, id,0);
- _colorBufferTarget = id[0];
- gl.glBindTexture(GL.GL_TEXTURE_2D, _colorBufferTarget);
- gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB8,_width, _height, 0, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE, null);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
- gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
- gl.glFramebufferTexture2D(GL2.GL_FRAMEBUFFER, GL.GL_COLOR_ATTACHMENT0, GL.GL_TEXTURE_2D, _colorBufferTarget,0);
- }
- public void draw(GL2 gl) {
- if(needsInvalidation) {
- if(_bufferTarget == -1) {
- init(gl);
- }
- //switch to FBO
- gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, _bufferTarget);
- gl.glPushAttrib(GL2.GL_VIEWPORT_BIT);
- gl.glLoadIdentity();
- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- //draws the FBOs content
- drawContent(gl,_width,_height);
- //go back to the default FBO
- gl.glPopAttrib();
- gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0);
- needsInvalidation = false;
- }
- gl.glEnable(GL.GL_BLEND);
- gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);
- gl.glEnable(GL.GL_TEXTURE_2D);
- //draw our texture on a quad
- gl.glBindTexture(GL.GL_TEXTURE_2D, _colorBufferTarget);
- gl.glBegin(GL2.GL_QUADS);
- gl.glTexCoord2f(0, 1);
- gl.glVertex2f(0, 0);
- gl.glTexCoord2f(0, 0);
- gl.glVertex2f(0, 240);
- gl.glTexCoord2f(1, 0);
- gl.glVertex2f(320, 240);
- gl.glTexCoord2f(1, 1);
- gl.glVertex2f(320, 0);
- gl.glEnd();
- gl.glDisable(GL.GL_TEXTURE_2D);
- gl.glDisable(GL.GL_BLEND);
- }