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.glCheckFramebufferStatusOES( GL11ExtensionPack.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 |