private void initFBO(int width, int height) {
hFBOTex = new int[1];
GLES20.glGenTextures(1,hFBOTex,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, hFBOTex[0]);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGBA,width,height,0,GLES20.GL_RGBA,GLES20.GL_UNSIGNED_BYTE,null);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
hFBO = new int[1];
GLES20.glGenFramebuffers(1,hFBO,0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,hFBO[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D,hFBOTex[0],0);
int[] depth;
depth = new int[1];
GLES20.glGenRenderbuffers(1,depth,0);
GLES20.glBindRenderbuffer(GLES20.GL_RENDERBUFFER,depth[0]);
GLES20.glRenderbufferStorage(GLES20.GL_RENDERBUFFER,GLES20.GL_DEPTH_COMPONENT16,width,height);
GLES20.glFramebufferRenderbuffer(GLES20.GL_FRAMEBUFFER,GLES20.GL_DEPTH_ATTACHMENT,GLES20.GL_RENDERBUFFER,depth[0]);
if ( GLES20.glGetError() != GLES20.GL_NO_ERROR) Log.i("mr","initFBO - rbo");
if(GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER) != GLES20.GL_FRAMEBUFFER_COMPLETE)
Log.e("mr","initFBO");
}
public void onDrawFrame ( GL10 unused ) {
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,hFBO[0]);
// draw somethings to FBO
GLES20.glFlush();
// read a block of pixels from back buffer in double-buffered configurations
ByteBuffer buf = ByteBuffer.allocateDirect(width*height*4);
GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buf);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);
// draw somethings to frame(back) buffer
// you can use hFBOTex[0] as a texture
}
Showing posts with label OpenGL. Show all posts
Showing posts with label OpenGL. Show all posts
June 23, 2015
FBO on Android
December 26, 2014
Render the captured image from real camera matrix using OpenGL
// intrinsic parameter: fx, fy, cx, cy, skew
// image size: width, hegiht
// view frustum: nearp, farp
// extrinsic parameter: r00, r01, r02, r10, r11, r12, r20, r21, r22, tx, ty, tz
// projection matrix
float pm[16] = { 0.0f };
pm[0] = 2.0f*fx/width;
pm[4] = -2.0f*skew/width;
pm[8] = 1.0f - 2.0f*cx/width;
pm[12] = 0.0f;
pm[1] = 0.0f;
pm[5] = -2.0f*fy/height;
pm[9] = 1.0f - 2.0f*cy/height;
pm[13] = 0.0f;
pm[2] = 0.0f;
pm[6] = 0.0f;
pm[10] = -(farp+nearp)/(farp-nearp);
pm[14] = -2.0f*farp*nearp/(farp-nearp);
pm[3] = 0.0f;
pm[7] = 0.0f;
pm[11] = -1.0f;
pm[15] = 0.0f;
glViewport ( 0, 0, width, height);
glMatrixMode ( GL_PROJECTION );
glLoadMatrixf ( pm );
glMatrixMode ( GL_MODELVIEW );
glLoadIdentity();
// -z direction
float rm[16] = { 0.0f };
rm[0] = 1.0f;
rm[5] = 1.0f;
rm[10] = -1.0f;
rm[15] = 1.0f;
glMultMatrixf ( rm );
rm[0] = r00;
rm[4] = r01;
rm[8] = r02;
rm[1] = r10;
rm[5] = r11;
rm[9] = r12;
rm[2] = r20;
rm[6] = r21;
rm[10] = r22;
rm[15] = 1.0f;
// inverse rotation and translation
glMultTransposeMatrixf ( rm );
glTranslatef ( -tx, -ty, -tz );
Subscribe to:
Posts (Atom)