삼각형 만들기

지난 1. Android OpenGL ES의 개요 포스팅에서 간단히 삼각형을 만들었고, 삼각형을 그리기위해서 Activity, GLSurfaceView, Renderer가 필요했었습니다.

이번 시간에는 삼각형을 그리는 프로세스에 대해서 알아보도록 하겠습니다.

안드로이드 프로젝트 설정

디바이스가 OpenGL ES 2.0을 지원해야하기에 다음과 같이 메니페스트에 선언해줍니다.

MainActivity.kt

OpenGL ES 2.0 버전을 사용하기 위해 GLSurfaceView.setEGLContextClientVersion(2) 를 호출합니다.

GLSurfaceView.setRenderer(Renderer)를 호출하여, GLSurfaceView에 그릴 렌더러를 준비합니다.

GLSurfaceView.Renderer

Renderer는 범용 렌더러 인터페이스로 프레임을 렌더링 하기 위해 OpenGL 함수를 호출을 수행합니다.

GLSurfaceView와의 연결은 GLSurfaceView.setRenderer(GLSurfaceView.Renderer)를 통해 가능합니다.

1_Triangle 예제에서는 Renderer인터페이스를 구현한 MyRenderer라는 클래스를 만들었었습니다. 렌더러 인터페이스를 구현하게 되면 필수적으로 구현해야할 메소드 3가지가 있습니다.

  • onSurfaceCreated(GL10 gl, EGLConfig config) : 서비스가 생성 또는 재생성될 때 호출됩니다. 
  • onSurfaceChanged(GL10 gl, int width, int height) : surface의 사이즈가 변경될 경우 호출됩니다.
  • onDrawFrame(GL10 gl) : 현재 프레임을 그리기 위해 호출됩니다.

onSurfaceCreated는 렌더링쓰레드가 시작되고 EGL context가 유실될 때마다 호출 됩니다. EGL Context는 일반적으로 sleep모드가 된 후 디바이스가 깨어 날 때 유실됩니다.

onSurfaceChanged에서는 보통 viewport를 지정합니다. 만약 카메라(사진찍는 카메라가 아님) 고정되어있다면 프로젝션 매트릭스를 여기서 설정할 수도 있습니다.

onDrawFrame에서는 화면에 그리고자 하는 내용에 대한작업을 주로 합니다.

이제 삼각형을 그리기 위한 소스를 파악해보도록 하겠습니다.

MyRenderer.kt

화면을 그리는 주된 역할을 하게될 클래스입니다.

GLSurfaceView.Renderer 구현하여 위에서 설명한 3가지 메소드를 구현하게 될것입니다.

VertexShader(정점 쉐이더)

정점을 계산하기 위한 버텍스 쉐이더 입니다.

  • attribute :  Vertex Shader에서만 사용가능한 타입. 정점 정보를 전달하기위해 사용합니다.
  • vec4 : homogeneous 좌표계의 기본적인 정점 위치를 갖는 4차원(x,y,z,w) float형 벡터 데이터입니다. 지금은 삼각형만 그리므로 평면상의 x축과 y축만 이해하면됩니다.
  • gl_Position : Vertex Shader의 내장변수중 다음 스테이지에 정점의 위치 정보를 전달합니다.

FragmentShader(프레그먼트 쉐이더)

  • precision mediump : 정확도를 중간으로 설정합니다. Highp는 최고 정확도, lowp는 최하 정확도입니다. Highp의 경우 디바이스가 지원을 안하는 경우도 있고, 퍼포먼스측면에서 문제가 될수도 있습니다.
  • gl_FragColor : 최종 프래그먼트 색상으로 고정된 내장 변수 입니다.

삼각형 정점 버퍼 만들기

삼각형을 그리기위해 꼭지점 3개를 찍습니다.

Note : 안드로이드에서 OpenGL을 위한 버퍼 사용시 주의해야할 점은 자바의 힙메모리는 사용할 수 없다는 점입니다. 그러므로 NIO패키지에서 ByteBuffer.allocate(int)가 아닌 ByteBuffer.allocateDirect(int)를 이용해야 합니다.

onSurfaceCreated

Surface가 생성 또는 재생성 될때 호출되는데 당장은 이번 예제에서는 딱히 할 작업이 없으므로 생략하겠습니다.

onSurfaceChanged

Surface의 사이즈에 변화가 생길 때 호출됩니다. 이곳에서 몇몇 작업을 하도록합니다.

onDrawFrame

 

GlUtil.kt

OpenGL 프로그래밍을 하면서 자주 쓰게되는 보일러플레이트 코드를 유틸리티 클래스로 따로 빼둔 것입니다.

본 프로젝트는 github에서 확인 가능합니다.

Buy me a coffeeBuy me a coffee
카테고리: AndroidGraphics

1개의 댓글

Jason · 2019년 8월 12일 9:27 오전

잘봤습니다!

답글 남기기

이메일은 공개되지 않습니다.