헬로, 안드로이드 14 주차 OpenGL 의 3D 그래픽 (1) 강대기동서대학교컴퓨터정보공학부
학습목표 3 차원그래픽의기본개념에대해이해한다. OpenGL 의기본개념에대해이해한다. 간단한 OpenGL 프로그램을만들수있다.
차례 3D 그래픽이해하기 OpenGL 소개하기 OpenGL 프로그램만들기 스레드관리하기 배경화면변경및사용자이미지로변경 요약 퀴즈 연습문제
3D 그래픽이해하기 세상은 3 차원이나, 책이나그림, 컴퓨터모니터를볼때에는 2 차원을보고있음 실내에서창밖을바라보면, 그게바로컴퓨터모니터를통해보는것과비슷함 고정된위치에서한쪽눈으로만보면, 고화질의사진으로바꾸어놓아도눈치챌수없음 창문 뷰포트 (viewport) 눈과창문사이의거리 시야 (FOV; field of view) 눈과창문의네귀퉁이를잇는선 시야절두체 (view frustum) 또는관찰절두체
3 차원장면보기
OpenGL 소개하기 1992 년실리콘그래픽스사에서개발 개발사가제조사에상관없이하드웨어를사용할수있도록, 통일된인터페이스제공 핵심아이디어는개발자가하드웨어의디테일보다는뷰포트, 조명등의개념에만집중하게해줌 존카맥 (John Carmack) Microsfot 의 Direct3D 에맞서, Doom 과 Quake 등을 OpenGL 로개발하는것을고수함 OpenGL 자체는워크스테이션용이어서임베디드시스템용으로는덩치가큼 안드로이드에서는임베디드시스템을위한 OpenGL ES 를구현 OpenGL ES 는여러회사들의컨소시엄인 Khronos Group 에서만듦 OpenGL ES 의자바언어바인딩은 Java Specification Request (JSR) 239 에서정의됨
OpenGL 프로그램만들기 프로젝트생성 OpenGL / org.example.opengl / OpenGL /OpenGL 생성된 OpenGL 액티비티가 GLView 라는 View를참조하도록수정함 res/layout/main.xml 리소스는삭제 GLView.java 의새로운클래스들 ( 교재와다름 ) GLSurfaceView SurfaceView의하위클래스로내부적으로 GL 요청을처리하기위한기능을담당함. GLSurfaceView.Renderer GLSurfaceView가가지고있는 Renderer 인터페이스로, OpenGL이호출하면프레임에그림을그림 EGLConfig Embedded Graphic Library (EGL) 의사양 (configuration) 을저장함 GL10 OpenGL(R) ES 1.0 코어의자바프로그래밍언어의바인딩을가지는인터페이스 GLU GL Utilities (GL 유틸리티함수들 ) 교재의클래스들소개 SurfaceView 3차원그래픽에사용되는특별한종류의뷰. OpenGL의모든뷰로확장가능함 Surface Canvas처럼그리기에사용되지만, 3D 하드웨어로구현된다는차이가있음. SurfaceHolder 이클래스의인스턴스는자신이갖고있는 Surface가사라지더라도계속유지됨 SurfaceHolder.Callback SurfaceView는이인터페이스를구현하는데, 뷰의 Surface가생성되거나없어지거나, 크기가변하면, OpenGL이이를알림
GLView.java package org.example.opengl; import android.content.context; import android.opengl.glsurfaceview; class GLView extends GLSurfaceView { private final GLRenderer renderer; } } GLView(Context context) { super(context); // Uncomment this to turn on error-checking and logging //setdebugflags(debug_check_gl_error DEBUG_LOG_GL_CALLS); renderer = new GLRenderer(context); setrenderer(renderer);
GLRenderer.java ( 대략적인구성 ) package org.example.opengl; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.content.context; import android.opengl.glsurfaceview; import android.opengl.glu; import android.util.log; class GLRenderer implements GLSurfaceView.Renderer { private final Context context; GLRenderer(Context context) { this.context = context; } public void onsurfacecreated(gl10 gl, EGLConfig config) { } public void onsurfacechanged(gl10 gl, int width, int height) { } public void ondrawframe(gl10 gl) { } }
쓰레드관리하기 안드로이드 2D 라이브러리는화면의일부를다시그려야할때, 뷰의 ondraw() 를호출하지만, OpenGL 은그리는데사용될렌더러의 ondrawframe() 을호출함 (1 초에프레임을호출하는수 Frames Per Second) GLSurfaceView 는 프레임 (frame) 에그림을그릴 Renderer 인터페이스와 Renderer 를주기적으로호출할 GLThread 클래스, EGL 설정을담당할 EGLHelper 클래스를가지고있음 GLSurfaceView 를확장한 GLView 에서 GLRenderer 설정 GLRenderer 에서 surface 가생성되면 (onsurfacecreated()) 프레임을그리기위한설정을완료하고, surface 가바뀌면 (onsurfacechanged()) 그에따른처리를하며, ( 예제에서는시야절두체설정 ) 프레임을그려달라는요청을받으면 (ondrawframe()) 프레임을그림
onsurfacecreated() 광원이되는조명의특성을설정함 물체의재료에따라다른질감을가지므로이를설정함 OpenGL 옵션설정 깊이테스트및알파블렌딩설정 알파블렌딩 두색을섞을때, 투명도를나타내는알파채널을이용하여섞는것 주로유리를통해본이미지나투명한물속의물체를나타낼때사용함 질감을위한텍스춰설정 필요하면비트맵파일을읽어들여텍스춰로입힘
onsurfacechanged() 시야절두체 (view frustum) 설정 픽셀이정사각형이아닐수있으므로, 화면가로와세로의 ratio 설정 투영법 (projection) 설정 많이쓰이는것은원근투영법 평행투영법도있음
ondrawframe() 화면을검게청소함 이미읽어들인모델을위치시킬장소설정 시간에맞추어모델을회전시킬것이므로, 각도설정 모델을그림 ( 예제에서는정육각형 ; cube) 그려진프레임의개수를계속추적하여, Frames Per Second (fps) 값계산함
OpenGL ES OpenGL ES 1.0 은통합 OpenGL 1.3, ES 1.1 은통합 OpenGL 1.5 에기초함 JSR 239 는원본 1.0 과유지릴리즈버전 1.0.1 두가지버전이있음
GLRenderer.java ( 대략적인구성 ) package org.example.opengl; import javax.microedition.khronos.egl.eglconfig; import javax.microedition.khronos.opengles.gl10; import android.content.context; import android.opengl.glsurfaceview; import android.opengl.glu; import android.util.log; class GLRenderer implements GLSurfaceView.Renderer { private final Context context; GLRenderer(Context context) { this.context = context; } public void onsurfacecreated(gl10 gl, EGLConfig config) { } public void onsurfacechanged(gl10 gl, int width, int height) { } public void ondrawframe(gl10 gl) { } }
배경화면변경및사용자이미지삽입 새로 AVD 를생성하되, SD 카드를충분히크게잡아줌 (64M 정도?) Camera 를실행하여사진찍음 Home 의 Menu 에서 Wallpaper 선택후 Pictures 선택하면찍힌사진이보임 adb 프로그램으로 SD 카드가마운트된디렉토리에서찍힌사진을복사함 C:\Android\android-sdk-windows-1.5_r3\tools>adb pull "/sdcard/dcim/camera/2009-10-07 16.12.35.jpg" camera_image.jpg 올리고싶은사진을, 복사된카메라이미지 (camera_image.jpg) 와같은크기로만든뒤, adb 로올림 (213 x 350 x 24) GIMP 소프트웨어사용, 파일명은소문자로함 에뮬레이터를재시동
요약 3 차원그래픽의기본개념을다루어보았다. OpenGL 의기본개념에대해공부해보았다. 간단한 OpenGL 프로그램을만들어보았다.
퀴즈 Canvas 와 Surface 의차이는무엇인가? 뷰포트 (viewport) 란무엇인가? 시야 (FOV; field of view) 란무엇인가? 시야절두체 (view frustum) 란무엇인가? OpenGL ES 란무엇인가? OpenGL ES 의자바언어바인딩은무엇으로정의되어있는가? GLSurfaceView 클래스에대해설명하라. GLSurfaceView 의 GLRenderer 는무슨일을하는가? 알파블렌딩이란무엇인가? 원근투영법이란무엇인가? FPS 는무엇인가?
연습문제 정육면체대신구체 (ball), 또는정사면체, 원뿔, 원기둥등을모델로설정해서프로그램을작성하라. Spinner 위젯을이용하여정육면체, 구체, 정사면체, 원기둥, 원뿔중모델을선택할수있게해보자. 이를위해서 XML 파일로이루어진메인뷰안에사용자의 Custom 뷰를저장하는방법을사용해보자. 예제프로그램은 GLSurfaceView 에서 GLRenderer 를사용하고있다. 교재에나와있는것처럼쓰레드를이용하는방법으로예제프로그램을재구성해보라.