본문 바로가기
C++ 200제/코딩 IT 정보

[OpenGL ES] 1. 자료형과 기본도형 (Primitives)

by vicddory 2017. 10. 19.

[OpenGL ES 1] 자료형과 기본도형 (Primitives)

OpenGL ES 1, opengl_part2[[OpenGL ES] 1. 자료형과 기본도형 (Primitives)]


OpenGL ES 강의 시작

OpenGL ES 자료형을 살펴보자. OpenGL은 Multi Platform을 지원하고, 특정 벤더에 종속되지 않기에 언어에 따라 자료형이 변경될 수 있다.


가령, C++에서는 float가 32비트이지만, 자바스크립트에서는 16비트다. 이런 차이를 극복하기 위해 OpenGL ES는 자신만의 자료형으로 동작한다. GLfloat, Glint처럼 GL로 시작한다.


1. 8비트 자료형


8비트 자료형

Same C

Desc

 GLbyte

 char

 -128 to 127

 GLubyte

 unsigned char

 0 to 255

 GLchar

 char

 -128 to 127


2. 16비트 자료형


16비트 자료형

Same C

Desc

 GLshort

 short

 -32,768 to 32,767

 GLushort

 unsigned short

 0 to 65,353


3. 32비트 자료형


32비트 자료형

Same C

Desc

 GLint

 int

 -2,147,483,648 to 2,147,483,647

 GLuint

 unsigned int

 0 to 4,294,967,295

 GLfixed int -2,147,483,648 to 2,147,483,647
 GLsizei int -2,147,483,648 to 2,147,483,647
 GLenum unsigned int 0 to 4,294,967,295
 GLbitfield unsigned int 0 to 4,294,967,295
 GLfloat  float -2,147,483,648 to 2,147,483,647
 GLclampx int Integer clamped to the range 0 to 1
 GLclampf float Floating-point clamped to the range 0 to 1


4. 64비트 자료형


64비트 자료형

Same C

Desc

 GLdouble

 double

 −9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

 GLclampd

 double

 Double clamped to the range 0 to 1


특이한 점은 OpenGL ES는 64비트 자료형을 지원하지 않는다는 것이다.


임베디드 시스템은 성능이 중요하기에 일부 기기는 64비트 프로세서를 지원하지 않는다. 위 자료형을 사용할 경우엔, C++ 기반의 어플리케이션을 쉽고 안전하게 자바스크립트로 변환할 수 있다.


이번에서 다룰 내용은 그래픽스 파이프라인(graphics pipeline)이다. (더욱 정확한 표현을 쓰자면, programmable pipeline이다) 아래 그림을 살펴보자.


OpenGL ES 1, programmable_pipepline_example[[OpenGL ES] 1. 자료형과 기본도형 (Primitives)]


먼저 언급하고 싶은 건 옵션으로 분류된 Frame Buffer다.

Frame Buffer는 사용하지 않도록 설정할 수 있으나, OpenGL ES 내부에서는 Frame Buffer와 Color Buffer를 사용할 수밖에 없다.


위 그림에서 EGL API가 보이나? OpenGL ES 어플리케이션에서 매우 중요한 요소이기에 사용자들은 EGL API의 기본 컨셉과 설정/사용 방법을 미리 습득해야 한다. 그러나 EGL은 매우 방대한 API라 여기서 모두 다룰 수는 없다.


EGL을 알고 있거나 위의 글을 읽었다면 다음 파트로 넘어가자.


Primitives (기본 도형)

Primitives란 Points, Lines, Triangles을 말한다. 이 요소들은 공간상에 생성될 때, x, y, z의 위치를 보유한 vertex(꼭지점)들로 이루어져 있다.


3차원 Point란 하나의 vertex, 

3차원 Line은 두 개의 vertex,

3차원 Triangle는 세 개의 vertex로 만들어진다.


OpenGL ES은 높은 성능을 위하여 vertex 정보를 float형의 1차원 배열로 구성한다.


1
2
3
GLfloat point3D = {1.0,0.0,0.5};
GLfloat line3D = {0.5,0.5,0.5,1.0,1.0,1.0};
GLfloat triangle3D = {0.0,0.0,0.0,0.5,1.0,0.0,1.0,0.0,0.0};
cs


float 배열엔 여러 vertex를 구분하지 않고 통째로 담는다.


OpenGL ES은 첫 번째 값은 x, 두 번째 값은 y, 세 번째 값은 z라고 인식하며, 3개의 값을 한 쌍으로 배열 전체를 읽어 들인다. 4개의 값을 한 쌍으로 인식시키려면 별도의 커스터마이징 작업이 필요하다.


지금은 단순히 x, y, z의 순으로만 생각하자.


OpenGL ES 1, primitives_example[[OpenGL ES] 1. 자료형과 기본도형 (Primitives)]


위의 그림 속, 노란색 점선은 바닥과 vertex와의 관계를 나타낸다. 간단한 그림이지만 이런 의문이 들 수 있다.


"그래, 근데 3DS Max나 Maya의 3D 도형 좌표를 어떻게 OpenGL 배열로 바꾸지?"


내가 처음 OpenGL을 공부할 때, 3D 파일 포맷을 OpenGL로 쉽게 변환할 수 있을 거라 생각했다.


"어쨌든, OpenGL ES는 가장 유명한 그래픽 라이브러리고, 거의 모든 3D 기반의 소프트웨어가 사용하니까, 3D 파일을 바로 가져올 수 있는 함수가 있을 거야"


라고 확신했지만, 내 생각이 틀렸다.


3D 파일 포맷과 같이 변덕스러운(포맷이 뭐가 될지 알 수 없는) 것들은 신경 쓰지 않는다. 3D 파일 포맷은 많지 않은가?


obj, .3ds, .max, .ma, .fbx, .dae, .lxo... 등등 OpenGL과 Khronos가 신경 쓰기엔 너무 많다. 하지만 Collada 포맷은 Khronos에서 만들었다. 맞지? 그래서 언젠가는 OpenGL이 Collada 포맷과 호환이 되리라 기대한다.


하지만, 지금은 그냥 이 사실을 받아들이자.


OpenGL ES는 3D 파일 확장자들을 신경 쓰고 있지 않다. 어쨌든 3D 소프트웨어에서 3D 모델(vertex)을 OpenGL 어플리케이션과 호환시키는 것이 필요하지 않은가?


안타깝게도 3D 엔진이나 3rd party(써드파티) API를 사용하는 방법뿐이다. (3D 엔진(PowerVR, SIO2, Oolong, UDK, Ogre...)의 API에 갇히겠지만)


3D 어플리케이션 파일을 로드하려고 써드파티 API를 사용한다면, API의 클래스들에 당신의 어플리케이션을 합쳐야(호환시켜야) 한다.


opengl ES 자료형 기본도형[[OpenGL ES] 1. 자료형과 기본도형 (Primitives)]


3D 소프트웨어에서 .h 파일을 추출하는 플러그인을 찾는 것도 하나의 방법이다. (.h 파일은 3D 정보를 OpenGL ES에서 사용 가능한 배열을 담음) 그러나, 여태까지 내가 봐왔던 2개의 플러그인은 끔찍할 정도다. (Blender에서 제공하는 Python과 Perl)


Maya, 3DS Max, Cinema 4D, LightWave... 에서는 플러그인조차 없다. 여기서는 다루지 않을 NinevehGL이란게 있다.


OpenGL ES 2를 위해 순수 Objective-C로 만들어진 3D 엔진으로, 이 엔진의 전체 API나 obj, dae 파일 포맷을 파싱하는 API를 살펴보는 것도 좋은 선택이다.


NinevehGL의 장점은 공짜, 가볍다는 것이다. 이젠, Primitives 속으로 깊숙히 들어가보자.


출처 : All About OpenGL ES 2.X 번역

[OpenGL ES] 1. 자료형과 기본도형 (Primitives)

댓글