본문 바로가기

iOS개발팁

아이폰 OpenGL ES 튜토리얼 01

이번 시간부터 본격적으로 OpenGL ES 프로그래밍 튜토리얼을 시작하겠습니다. 오늘 다뤄볼 내용은 앞으로 OpenGL ES 프로그래밍을 하는데 있어 바탕이 되는 코드를 작성하는 것입니다. 이 튜토리얼을 마치면 옆의 그림과 같이 검은 화면이 출력되는 앱이 실행됩니다. 결과가 조금 싱겁기는 하지만 꽤 중요한 내용들과 알아야할 내용들이 많이 있으므로 꼭 읽어 보시고 직접 코딩해 보시길 바랍니다.


이 튜토리얼에서 다루는 내용
  • 코어 애니메이션의 CAEAGLLayer
  • 컨텍스트의 개념
  • 프레임버퍼와 렌더링버퍼의 개념
  • 깊이 버퍼의 개념
  • 아이폰 상에서의 OpenGL ES 초기화 코드 작성
  • 렌더링 처리 코드 분리하기
  • C 언어로 렌더링처리하기
  • 검은 화면 출력하기
코어 애니메이션의 CAEAGLLayer

Mac OS X에서는 OpenGL을 사용하는 수많은 방법이 있는 것에 비해 아이폰에서 OpenGL ES는 코어 애니메이션 레이어를 통해서만 가능합니다.  따라서 OpenGL ES를 아이폰에서 사용하려면 UIView객체는 OpenGL ES 코어 애니메이션 레이어를 가지고 있어야 합니다. 이 레이어를 얻기 위해서는 UIView 클래스를 상속 받고 layerClass 메서드를 오버라이드해 CAEAGLLayer 클래스를 반환하는 것입니다. 아래의 코드처럼 말이죠.
+ (Class)layerClass
{
    return [CAEAGLLayer class];
}
UIView는 기본으로 layerClass 메소드에 CALayer 클래스를 반환하도록 코딩되어 있습니다. 즉, UIView를 캐싱하는 레이어로 CALayer를 사용하는 것입니다. 그리고 이 메서드는 UIView가 설정될 때 호출됩니다.  이 layerClass메소드를 오버라이드 해서 다른 레이어를 사용하도록 해도 됩니다. 바로 위의 예처럼 말이죠.

컨택스트의 개념

아이폰의 개발 문서를 읽다보면 Context(이하 컨택스트)라는 단어가 무척 많이 나옵니다. 사실 OpenGL ES를 쓰는데에도 컨택스트가 필요합니다. 그렇다면 컨택스트가 무엇일까요? 컨택스트를 쉽게 말하자면 목적지입니다. 애플 개발자 문서 중 쿼츠2D프로그래밍 문서에 나와 있는 그림을 빌리자면 아래와 같습니다.


하나의 이미지가 있을 때, 윈도우에도 그릴 수 있고 프린터에도 그릴 수 있고 레이어에도 그릴 수 있습니다. 즉, 종류를 따지지 않고 그릴 수 있는 곳에는 모두 그릴 수 있습니다. 하지만 모든 종류마다 프로그래머가 일일이 모든 목적지에 대한 세부사항과 특징들을 코딩해야 한다면 프로그래머들은 머리를 쥐어 뜯을 지도 모릅니다. 다행히도 애플은 컨텍스트라는 것을 만들어서 이런 다양한 목적지의 공통점만을 모아 추상화 시켜 놓았습니다.  이 추상화 시켜 놓은 컨텍스트를 바탕으로 다양한 목적지에 그림을 그리는 것이 무척 수월해 졌습니다. 자세한 내용은 쿼츠2D프로그래밍 문서를 참고하시길 바랍니다.

그럼 OpenGL ES와 컨텍스트는 무슨 관계일까요? OpenGL ES는 코어 애니메이션의 레이어상에서 동작한다고 설명했습니다. 레이어에 OpenGL ES를 사용하여 그림을 그리는 것이므로 레이어가 목적지가 됩니다. 그렇다면 레이어를 목적지로 삼는 컨텍스트가 필요할 것입니다. 그것도 OpenGL ES의 처리 내용만 전용으로 그리는 CAEAGLLayer를 위한 것이 필요하겠죠. 그 역할을 하는 것이 바로 EAGLContext 입니다.

EAGLContext 는 OpenGL ES의 렌더링 명령어가 처리되는 곳으로 결국 3차원 또는 2차원 그림이 그려지는 곳입니다. OpenGL로 그림을 그릴 때에는 EAGLContext에 다양한 것들을 붙여줘야 합니다. 바로 프레임버퍼라는 것인데요 렌더링버퍼와 깊이버퍼 등이 모여서 프레임버퍼를 이룹니다. 다음 절에서 더욱 자세하게 알아보도록 하겠습니다.