본문 바로가기

프로그래밍/Android

OpenGL 프레임버퍼 사용

 

API DEMOS에 프레임버퍼를 사용해 텍스처에 그림을 그리는(Render to texture) 예제가 포함되어 있다.

 

프레임버퍼는 openGL 2.0 부터 지원하는데, 예제에서는 extension pack 통해 1.1에서

프레임버퍼를 사용하는 예제를 다루고 있다.

 

 

>> onSurfaceCreated

 

1. 프레임버퍼 지원 여부 검사

String extensions=" " + gl.glGetString(GL10.GL_EXTENSIONS) + " ";

if( extensions.indexOf(" GL_OES_framebuffer_object " ) >= 0)

return true;

 

2. 텍스처 생성

int tex_id;

int[] textures = new int[1];

gl.glGenTexture(1, textures, 0 );

id = textures[0];

 

gl.glBindTexture( GL10.GL_TEXTURE_2D, tex_id );

gl.glTexImage2D( GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, 너비, 높이, 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_LINEAR );

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


3. 프레임버퍼/렌더버퍼 생성

GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

int frame_id;

int[] framebuffers = new int[1];

gl11ep.glGenFramebuffersOES( 1, framebuffers, 0 );

frame_id = framebuffers[0];

gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES, frame_id );

 

int render_id;

int[] renderbuffers = new int[1];

gl11ep.glGenRenderbuffersOES( 1, renderbuffers, 0 );

render_id = renderbuffers[0];

 

gl11ep.glBindRenderbufferOES( GL11ExtensionPack.GL_RENDERBUFFER_OES, render_id );

 

gl11ep.glRenderbufferStorageOES( GL11ExtensionPack.GL_RENDERBUFFER_OES,

GL11ExtensionPack.GL_DEPTH_COMPONENT16, 너비, 높이 );

 

gl11ep.glFramebufferRenderbufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,

GL11ExtensionPack.GL_DEPTH_ATTACHMENT_OES,

GL11ExtensionPack.GL_RENDERBUFFER_OES, render_id );

 

 

// 프레임버퍼에 텍스쳐 연결

gl11ep.glFramebufferTexture2DOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES,

GL11ExtensionPack.GL_COLOR_ATTACHMENT0_OES, GL10.GL_TEXTURE_2D,tex_id, 0 );


// 상태 검사

int status = gl11ep.glCheckFramebufferStatusOESGL11ExtensionPack.GL_FRAMEBUFFER_OES );

if( status != GL11ExtensionPack.GL_FRAMEBUFFER_COMPLETE_OES ) {

// 에러

}

 

gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0 );

 

 

>> onDrawFrame

GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES, frame_id );

//  버퍼에그리기

doDrawSomethingToBuffer();

 

gl11ep.glBindFramebufferOES( GL11ExtensionPack.GL_FRAMEBUFFER_OES, 0);

 

// 화면에 그리기

.

.

gl.glBindTexture( GL10.GL_TEXTURE_2D, tex_id );

gl.glTexEnvf( GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

gl.glActiveTexture( GL10.GL_TEXTURE0 );

.

.

 

// 원래 상태로 복구

gl.glBindTexture( GL10.GL_TEXTURE_2D, 0 );

gl.glDisableClinetState( GL10.GL_VERTEX_ARRAY );

gl.glDisableClientState( GL10.GL_TEXTURE_COORD_ARRAY );

'프로그래밍 > Android' 카테고리의 다른 글

HTTP POST/GET 몇가지 정리  (0) 2012.01.30
OpenGL es 조명  (0) 2011.12.07
API demos openGL es 2.0  (0) 2011.11.21
GLSurfaceView 배경 투명하게  (1) 2011.11.04
최상위 뷰 만들기  (0) 2011.10.27
ADB tcp/usb 연결설정  (0) 2011.10.26
sdk3.0 fragment를 하위버전에서 사용하기  (0) 2011.10.19
SurfaceView/GLSurfaceView  (0) 2011.10.11
Custom layout, layoutinflater  (0) 2011.10.11
MediaStore 썸네일 데이터 관련 정리  (0) 2011.09.26