You are here: Home - Studies∞ - GDC2013 Day2-Class3

opengles30

Starting Out with OpenGL ES 3.0 Games for Mobile

Room 3016, West Hall
Speaker: Jonathan Kirkham and Dave Shreiner at ARM

아시는 분들은 아시겠지만 전 원래 경영학 전공생이 아닌 컴퓨터프로그래머로 업계에 입문하였습니다. 사실 경영학 전공은 창업 이후에 학부를 다시 다닌 것이라 개발사이드의 중요업무를 책임지는 것에 큰 만족감을 느끼고 있습니다. 이번 GDC에서도 기술강연을 찾다 OpenGL ES 3.0에 관련된 세션을 듣고 싶어서 참석하였는데요, 이제는 ES라는 단어가 기존 OpenGL Architecture의 문제들을 새롭게 디자인할 수 있는 계기로 작용하고 있다는 생각이 들었습니다. OpenGL은 현재 운명을 달리한 실리콘그래픽스에서 개발한 3D그래픽 라이브러리를 공개한 것으로 오픈소스의 장점때문에 이후 하드웨어 개발사와 소프트웨어 개발사 간의 개발 접점 역할을 충실히 이행하고 있습니다.

오늘 발표를 맡은 ARM도 최근 모바일 화두와 함께 새롭게 OpenGL 아키텍쳐를 만들어나가는데 중요한 역할을 하는 회사로 부상했습니다. 2000년도 초 중반 nVIDIA가 사실상 OpenGL 아키텍쳐를 주도하던 시절에 비해 상전벽해의 감정을 느낍니다. 강연 중간 중간에 기존 OpenGL 구조를 nVIDIA가 왜 이렇게 만들어놨는지 모르겠다고 혼잣말로 중얼거리던 연사의 모습이 떠오르네요. 그럼 강연의 정리를 시작해 보겠습니다.

OpenGL ES 3.0은 최신의 API입니다. 오늘 이 자리에서는 이번 3.0에서 추가된 다양한 기능 중 핵심이 되는 몇 가지를 설명해 드리고자 합니다. 강연 시간이 짧기 때문에 이 자리에서 접하신 새로운 기능들은 나중에 알려드릴 웹사이트 등을 통해 다시 한번 숙지하시길 기대합니다.

이번 3.0에서는 쉐이더 관련 랭귀지가 완전히 바뀌었습니다. 특히 새로운 오브젝트 타입들이 추가된 것들도 눈여겨볼만한 부분입니다. 그 중 Texture Swizzles와 Integer Formats 그리고 ETC2 Texture을 꼭 한번 보시기 바랍니다. 드디어 OpenGL ES 3.0부터 완전히 Shader-based의 API가 되었습니다. 그렇기에 여러분들의 렌더링 파이프라인은 반드시 쉐이더를 통과하게 되어있고 이 쉐이더는

Geometric Data -> Vertex Shader -> Rasterizer -> Fragment Shader

의 순서를 따라 처리되게 됩니다. -이 중에서 Fragment Shader가 바로 DirectX에서는 PixelShader라고 불리는 부분입니다.- 쉐이더기반이기 때문에 여러분의 지오메트리 데이터가 GPU에 연결된 비디오램쪽으로 복제되는 과정을 잘 컨트롤 해야 할 필요가 있습니다. glBufferData()를 통해 호스트메모리의 데이터를 GPU메모리로 옮길 수 있습니다. 흔히 VBO라고 불리는 Vertex Buffer Object 타입이 바로 GPU메모리를 말합니다. 이 과정을 컨트롤 할 필요 없이 여러분들은 이전처럼 렌더링 할 수 있지만 이 경우에는 내부적으로 VBO로 복제한 후 렌더링하게 됩니다.

다음을 설명하기에 앞서 먼저 두 인터페이스의 차이를 상기하고 넘어가겠습니다. 아시다피시

glDrawArray ; Pass vertex data to vertex shader sqauentially
glDrawElement ; Pass vertex data to vertex shader indexed by element list

입니다. 보통 한 모델데이터를 여러 번 렌더링 할 때 매번 이를 복제하는 것은 매우 불편하기 때문에 Indexed Object를 새롭게 지원합니다. 아래의 두 인터페이스를 참고해 주십시오.

glDrawArraysInstanced
glDrawElementsInstanced

이는 불필요한 메모리복제 과정을 생략하기 때문에 빠른 렌더링을 보장합니다. 특히 모델뷰 매트릭스를 매 Rendering-Turn에서 재 설정할 수 있기 때문에 다양하게 활용이 가능합니다. -데모에서는 상자들이 특정 점을 향해서 Flocking하는 것을 보여주었습니다. 상자 메쉬의 버텍스는 고정되어 있지만 각 상자들의 위치는 모두 다르게 하여 모델뷰 매트릭스가 변화하는 것을 보여주었습니다.-
이 기능을 위해서 여러분은 glUniform3fv을 사용해야 합니다. 유니폼타입은 쉽게 쉐이더 상의 전역 상수처럼 생각하면 됩니다. 하지만 많은 유니폼상수들을 로딩하는 것은 느리다는 것은 기억하십시오. 하지만 유니폼 버퍼 오브젝트들을 사용하면 많은 유니폼들을 쉽게 로딩항 수 있습니다. 매번 각 타입에 따라서 따로 유니폼 버퍼 아이디를 가져와 데이터를 셋업할 수 있지만 이는 소스도 복잡하고 느립니다. 이럴 때 glGetUniformBlockIndex를 사용하면 데이터를 한번에 스트림타입으로 셋팅할 수 있습니다.

glUniformBlockBinding();
glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniformbuffer);

를 참고해 주십시오.

이후 Tessellation 데모를 보여주었습니다. 테셀레이션은 모델의 버텍스들을 컨트롤포인트로 하여 Curve나 Mesh Curve(NURBS와 비슷)를 실시간으로 생성해내는 기술로 저 폴리곤의 오브젝트를 매우 하이폴리곤 모델인것 처럼 보여줄 수 있습니다.-3.0에서 테셀레이션은 매우 빠르고 완벽하게 동작했습니다.-

또 재미있는 기능으로 파이프라인을 변형할 수 있는 것이 있습니다. Vertex Shader를 통과한 데이터를 다시 Vertex Shader쪽으로 통과하도록 만들 수 있습니다. 오브젝트가 프레임 간에 변형이 없을 때 매우 유용하게 사용할 수 있습니다. 앞서 설명드린 유니폼 타입은 Vertex Shader나 Fragment Shader 양쪽에서 데이터에 접근할 수 있습니다. glTransformFeedbackVaryings()를 사용하면 Vertex Shader를 통과한 데이터를 다시 VertexShader의 입력 데이터로 걸 수 있습니다.

glBindBufferRange(GL_TRANSFORM_FEEDBACK_BUFFER, …);를 이용해서 버퍼 상의 사용 영역을 먼저 지정하고

glEnable(GL_RASTERIZER_DISCARD);
glBeginTransformFeedbacks(); 이 함수를 이용하면 transform feedback를 사용할 수 있게 됨
glEndTransformFeedback();로 끝냄
glDisable(GL_RASTERIZER_DISCARD);명시적으로 구간을 지정해서 피드백 버퍼를 사용하도록 되어 있음

위와 같이 사용하면 됩니다.

다음으로 Occlusion Queries를 설명드리겠습니다. 오클루젼은 안보이는 부분들을 렌더링 하지 않는 기술을 말합니다. 그 중에서 오늘 설명드릴 부분은 보이지 않는 부분들의 Shader처리를 건너뛸 수 있도록 메쉬 상에서 데이터를 지정하는 기능입니다. 기본 아이디어는 이렇습니다. 먼저 매우 러프하게 렌더링을 한번 하면서 어떤 부분이 가려지는지 Marking할 수 있다면 두 번째 정교하게 렌더링하는 타임에서 이를 제외할 수 있다는 것입니다. 보통은 단색으로 된 OBB를 랜더링하는 것이 좋은 선택이 될 수 있습니다.

glGenQuries()

glBeginQuery
glDrawArray
glEndQuery

위와 같이 돌린 다음에 glGetQueryObjectiv()를 이용해 결과 값을 얻어온 후

glGetQueryObjective(GL_ANY_SAMPLES_PASSED_CONSERVATIVE, GL_QUERY_RESULT, visible);
if(visible)
Render!

위와 같은 구조가 됩니다. 당연히 다 걸러내고 렌더링하기 때문에 매우 빠릅니다. -이후 하이폴리곤으로 구성된 Rounded-cube를 보여주었는데 1FPS이었다가 Occlusion을 사용하니 60FPS가 나왔습니다. 당연히 뒤를 다 제외하고 렌더링하는 것이니 이렇게 나오는 결과가 당연합니다.-

Q&A가 이어지려는 찰나 연사는 질문이 많을텐데 그냥 온라인을 통해서 하는 것이 어떻겠냐고 질문을 막았습니다. :-(

malideveloper.arm.com 에서 모든 정보를 얻을 수 있다고 합니다.
관심있는 분들은 위의 사이트를 참고하시기 바랍니다.

이번 강연은 오랜만에 리얼타임렌더링에 관련된 내용이어서 반가웠고 2000년 초반 이후 특별한 새로우 이슈가 없었던 RT CG분야가 모바일을 만나면서 다시 한번 뜨거워지는 느낌이라 흐뭇했습니다. 다들 VisualShower의 Visual이 비주얼컴퓨팅을 의미하는 것이라는 건 알고 계시지요?

by Kay Park

Back to top