프로그래밍/Android

OpenGL 프레임버퍼 사용

chance 2011. 10. 27. 16:15

 

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