Blame |
Last modification |
View Log
| RSS feed
package com.gebauz.pingK.common.framework;
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";
}
}