Showing posts with label OpenGL. Show all posts
Showing posts with label OpenGL. Show all posts

June 23, 2015

FBO on Android

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
}

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 );