Subversion Repositories AndroidProjects

Rev

Rev 43 | Blame | Compare with Previous | Last modification | View Log | RSS feed

package com.gebauz.framework.util;

import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11ExtensionPack;

import android.util.Log;

public class RenderTextureFbo extends RenderTexture
{
        private int mFrameBufferID = 0;
       
        protected RenderTextureFbo()
        {
               
        }
       
        @Override
        public void recreate()
        {
                createTarget(width, height);
        }
       
        @Override
        public void createTarget(int w, int h)
        {
                createTexture();
                bind();
               
                GL10 gl = GLUtil.getGL();              
        gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, w, h, 0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, null);
       
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
       
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
        gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
               
                createFrameBufferObject(w, h);
               
                //setFiltering(Filter.NEAREST, Filter.NEAREST);
               
        unbind();
        }
       
        private void createFrameBufferObject(int w, int h)
        {
                width = w;
                height = h;
               
        GL11ExtensionPack gl11ep = (GL11ExtensionPack)GLUtil.getGL();
        int[] framebuffers = new int[1];
        gl11ep.glGenFramebuffersOES(1, framebuffers, 0);
        mFrameBufferID = framebuffers[0];
        gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, mFrameBufferID);

        int colorBuffer;
        int[] renderbuffers = new int[2];
        gl11ep.glGenRenderbuffersOES(2, renderbuffers, 0);
        colorBuffer = renderbuffers[0];

        gl11ep.glBindRenderbufferOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, colorBuffer);
        gl11ep.glRenderbufferStorageOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, GL11ExtensionPack.GL_RGBA8, width, height);
        gl11ep.glFramebufferRenderbufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL11ExtensionPack.GL_RENDERBUFFER_OES, colorBuffer);
        gl11ep.glFramebufferTexture2DOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D, getHandle(), 0);
       
        int depthBuffer;
        depthBuffer = renderbuffers[1];
        gl11ep.glBindRenderbufferOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, depthBuffer);
        gl11ep.glRenderbufferStorageOES(GL11ExtensionPack.GL_RENDERBUFFER_OES, GL11ExtensionPack.GL_DEPTH_COMPONENT16, width, height);
        gl11ep.glFramebufferRenderbufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, GL11ExtensionPack.GL_DEPTH_ATTACHMENT_OES, GL11ExtensionPack.GL_RENDERBUFFER_OES, depthBuffer);
       
        int status = gl11ep.glCheckFramebufferStatusOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES);
        if (status != GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES)
        {
                Log.v(GLUtil.LOG_TAG, "Framebuffer is not complete: " + getStatusString(status));
                throw new RuntimeException("Framebuffer is not complete: " + getStatusString(status));
        }
        gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);
        }

        /** Activate for rendering to render target. */
        @Override
        public void activate()
        {
                GL11ExtensionPack gl11ep = (GL11ExtensionPack)GLUtil.getGL();
                gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, mFrameBufferID);             
        }
       
        /** Deactivate render target. */
        @Override
        public void deactivate()
        {
                GL11ExtensionPack gl11ep = (GL11ExtensionPack)GLUtil.getGL();
                gl11ep.glBindFramebufferOES(GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);
               
        }
       
        public static String getStatusString(int status)
        {
                switch(status)
                {
                case GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES:
                        return "GL_FRAMEBUFFER_COMPLETE_OES";
                case GL11ExtensionPack.GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES:
                        return "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES";
                case GL11ExtensionPack.GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES:
                        return "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES";
                case GL11ExtensionPack.GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES:
                        return "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES";
                case GL11ExtensionPack.GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES:
                        return "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES";
                case GL11ExtensionPack.GL_FRAMEBUFFER_UNSUPPORTED_OES:
                        return "GL_FRAMEBUFFER_UNSUPPORTED_OES";
                }
                return "N/A";
        }
       

}