- public abstract class FrameBufferObject implements FrameObject, PropertyHolder{
- private int _width,_height;
- private int _top,_bottom;
- private int _bufferTarget = -1;
- private int _colorBufferTarget = -1;
- private int _depthBufferTarget = -1;
- private boolean needsInvalidation = false;
- public FrameBufferObject(int width,int height,int right,int bottom) {
- _width = width;
- _height = height;
- _top = right;
- _bottom = bottom;
- needsInvalidation = true;
- }
- @Override
- 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_RGBA8,_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);
- }
- @Override
- public void dispose(GL2 gl) {
- gl.glDeleteFramebuffers(1, new int[] {_bufferTarget},0);
- gl.glDeleteRenderbuffers(1, new int[] {_depthBufferTarget},0);
- gl.glDeleteTextures(1, new int[] {_colorBufferTarget}, 0);
- }
- public abstract void drawContent(GL2 gl,int width,int height);
- @Override
- 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_ALL_ATTRIB_BITS);
- GLU glu = new GLU();
- gl.glViewport(0, 0, _width, _height);
- gl.glMatrixMode( GL2.GL_PROJECTION );
- gl.glLoadIdentity();
- glu.gluOrtho2D(0, _top, 0, _bottom);
- gl.glMatrixMode( GL2.GL_MODELVIEW );
- gl.glLoadIdentity();
- gl.glClearColor(0.0f, 0.0f, 0.0f,0.0f);
- gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT);
- //draws the FBOs content
- drawContent(gl,_top,_bottom);
- //go back to the default FBO
- gl.glBindFramebuffer(GL2.GL_FRAMEBUFFER, 0);
- gl.glPopAttrib();
- gl.glMatrixMode( GL2.GL_PROJECTION );
- gl.glLoadIdentity();
- glu.gluOrtho2D(EngineController._left, EngineController._right, EngineController._bottom, EngineController._top);
- gl.glMatrixMode( GL2.GL_MODELVIEW );
- gl.glLoadIdentity();
- needsInvalidation = false;
- }
- //apply shader here
- gl.glEnable(GL.GL_BLEND);
- gl.glBlendFunc(GL.GL_SRC_ALPHA,GL.GL_ONE_MINUS_SRC_ALPHA);
- gl.glEnable(GL.GL_TEXTURE_2D);
- 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, _height);
- gl.glTexCoord2f(1, 0);
- gl.glVertex2f(_width, _height);
- gl.glTexCoord2f(1, 1);
- gl.glVertex2f(_width, 0);
- gl.glEnd();
- gl.glDisable(GL.GL_TEXTURE_2D);
- gl.glDisable(GL.GL_BLEND);
- }
- @Override
- public void setNeedsInvalidation() {
- needsInvalidation = true;
- }
- }