iOS 3D 게임 프로그래밍 실무 교육 2 (OpenGL)

2011. 5. 27. 18:19게임 개발/OpenGL

 OPENGL에 대해서 집중적으로 공부를 시작합니다.

OpenGL(Open Graphics Library, 오픈지엘) 1992 실리콘 그래픽스사에서 만든 2차원 3차원 그래픽스 표준 API 규격으로, 프로그래밍 언어 플랫폼 간의 교차 응용 프로그래밍을 지원한다. API 250여개 가량의 함수 호출을 이용하여 단순한 기하도형에서부터 복잡한 삼차원 장면을 생성할 있다. OpenGL 현재 CAD, 가상현실, 정보시각화, 비행 시뮬레이션 등의 분야에서 활용되고 있다. 또한 컴퓨터 게임 분야에서도 널리 활용되고 있으며, 마이크로소프트사의 Direct3D 함께 컴퓨터 그래픽 세계를 양분하고 있다. Direct3D와는 달리, 표준안이 여러 관련 업체의 토론과 제안으로 이루어지기에 버전 업데이트는 느린 편이다. OpenGL 사용하여 개발된 대표적인 게임은 이드 소프트웨어 퀘이크 3 시리즈이다. 현재 비영리 기술 컨소시엄인 크로노스 그룹 의하여 관리되고 있다.
 (위키백과 에서 가져왔습니다.)


Before And After of the Day

잉... 그러구 보니.. OpenGL ES를 봐야징;;; 


1. OpenGL 개론
 

  - Open Graphics Language
 - 무료로 개방되어 있음.
 - 많은 플랫폼에 채용됨.
 - Open GL 설계 원리
 - 범용성 , 효율성 , 독립성, 완전성, 상호 작업성

2. OpenGL 용어
 
 - GLLSL (Graphic Library Shader Language) : 셰이더 제어를 위한 언어
 - GLEW (GL Extension Wrangler Language) : 셰이더 제어를 위한 확장 언어
 - GLU (GL Utility Library) : OpenGL에 그리거나 조작할 수 있는 함수
 - GLUT( GL Utitlity Toolkit ) : 통합 관리 도구
 
 - 모델 : 우리가 바라보는 대상 
 - 모델 행렬 : 대상의 실제 위치
 - 뷰행렬 :  카메라의 위치
 - 투영 : 카메라의 렌즈
 - 뷰포트 : 이미지가 촬영되는 곳 

 - 모델링 (What to Draw)
   장면 내부 물체를 정의 하는 작업 , 선분의 끝점, 다각형의 정점을 정의
 - 랜더링 (How to Draw) 
  정의될 물체를 그려내기 , 와이어 프레임 렌더링 , 솔리드 랜더링 

 - 정점 버퍼 ( Vertex Buffer )
 - 변환된 정점 ( Post - tranformed vertices )
 - 기본 요소 ( Primitives )
 - 픽셀 ( Pixels )
 
 - 정점 (  Vertex )
 - 위상 ( Topology )
 - 기본 요소 ( Primitives)
 - 기하 ( Geometry )

3. OpenGL 역활 : 상태 변수
 - 파이프 라인 : 상태변수를 참조해서 자동으로 실행됨.

1) 변환 프로세서 ( Transformer )
2) 절단 프로세서 ( Clipper )
3) 투상 프로세서 ( Projector )
4) 레스터 프로세서 ( Rasterizer )

4. OpenGL 동작 원리
 : 기본적으로 루프가 돌아가지요... 메모리 버퍼 위에 그려서, 보여지는 영역만 렌더링 위에 가져온다.
 

 - Recorder : 관측자
 - Lens :  시야각
 - Camera Position  : 카메라 위치
 - Scene Objects : 모델 
 

 
5. Topology (Number of Primitives , Number of vertices )
 : 점,선, 삼각형으로 구성되어 있다. 사각형이 없다는 것을 주의깊게 확인해야 한다.

 1) GL_POINTS  ( v , p )
 2) GL_LINES ( v/2 , 2p )
 3) GL_LINE_LOOP (v, p )
 4) GL_LINE_STRIP ( v-1 , p +1 )
 5) GL_TRIANGLES ( v/3 , 3p )
 6) GL_TRIANGLE_STRIP ( n-2 , p +2 )
 7) GL_TRIANGLE_FAN ( n-1 , p+1 )

6. GL함수들은 아래와 같이 표기되어진다.
 
- glVertex3f(x,y,z)  
  1) gl : GL 함수
  2) 3 : 파라미터 수
  3) f : 자료형 ( f : float , d : double , b : signed char , ub : unsigned char , i : int/long , ui : unsigned long , s : short )

- glVertex3fv(p)
 1) v : 벡터
 2) p : 배열명 

7. Open GL ES 개론
 

http://www.khronos.org/opengles/

 
OpenGL ES는 OpenGL을 기반으로 임베디드 시스템에 최적화된 API를 제공한다. 거의 쓰이지 않거나 중복된 기능을 수행하는 API들을 과감히 제거하고 임베디드 시스템에 적합한 데이터 타입을 추가하는 등 최대한 간결하고 작게 만드는 것을 목표로 하면서도 기존의 OpenGL을 사용하여 구현할 수 있는 거의 대부분의 기능을 똑같이 구현할 수 있도록 디자인 되었다.
 

  - 임베디드 시스템용이고, OpenGL API의 서브셋 
  - 하드웨어의 사양을 실행시간에 판단하고 ES 2.0 이나 ES 1.1을 지원.
  - 두가지 버전이 있고, 서로 호환이 안되기 때문에, 따로따로 제작 해야 한다.


OpenGL ES 1.1은 OpenGL 1.5와 호환되는 버전으로, fixed function hardware를 위한 API를 제공한다. 1.1 버전에서는 기존 OpenGL에서 자주 쓰이던 glBegin/glEnd, color index mode, GL_QUAD/GL_POLYGON과 같이 코드 크기 및 성능에 나쁜 영향을 미치는 primitive들이 쓰이지 않는 대신, Vertex Array, Vertex Buffer Object (VBO)등의 API를 사용하고 있으며, full transform, lighting, multitexturing, fixed point, floating point 등의 기능을 충실히 제공하고 있다.

OpenGL ES 2.0은 OpenGL 2.0과 호환되는 버전으로, shader를 사용한 programmable hardware를 위한 API를 제공한다. Fixed function pipeline을 제거하고 vertex shader와 fragment shader를 사용하고 있으며, 이를 위해 GLSL ES라고 하는 shading language를 지원한다. 

  
  1) OpenGL ES 1.1 
   ==> 정점 버퍼 객체 , 다중 텍스쳐 지원 , 고정 파이프라인만 지원
  2) OpenGL ES 2.0 
   ==> 많은 고정기능 제거 , 셰이딩 추가 ( Vertex Shader, Fragment Shader, Pixel Shader)
          하위 호환성이 깨지게 됨, 개발자들에 더 큰 제어권 부여 


뭐.. 여기까지만 정리 하고.. 난 농구하러 갈란다.