프로그래밍[Univ]/그래픽스

[Graphics] OpenGL API

Cloud Travel 2013. 3. 24. 15:12

* 그래픽 분야 표준화 Guide Line

 - Host machine independence : 동일 프로그램을 다양한 H/W에서 사용 가능해야 한다.

 - Device Independence : I/O Device 종류가 달라도 프로그램 명령은 동일해야 한다.

 - Programming Language Independence : 프로그램 작성에 아무 언어를 사용해도 된다.

 - Operator Portability : 사용법을 쉽게 터득 할 수 있어야 한다.


* Graphics Primitives(기본요소) & Attribute(외양)

 - 기본요소 : 점, 선, 채움 영역, 꺽은선, 표시 꺽은선, 문자

 - 외양 : 겉모양(Aspect), 같은 기본요소라도 패턴 색상, 두께 등을 다르게 하여 다양한 형태를 만들 수 있다.

  


* ISO Graphic standard

 ⓐ GKS(Graphical Kernel System)

  - 유럽에서 발달

  - 2D 위주 시작 > GKS-3D로 발전

  - 파일 저장 형식 : 기본요소(위치 좌표, 속성, 가시성, 변환 정보)를 서술하여 가상 레벨에 저장

 ⓑ PHIGS(Programmer's Hierarchical Interactive Graphics System)

  - 미국에서 발달

  - 3차원 모델링, 가시화에 중점을 두었고, CAD 개념이 도입됨

  - 계층 구조로 물체의 상관관계를 하나의 집합으로 표현(구조체)

   > 구조체 관통에 의한 드로잉, CTM(Current Transformation Matrix)개념 도입


* Graphics API

 - 응용 프로그램 라이브러리, 인터페이스

 - PHIGS, GKS는 일반적으로 low level로 정의

 - Graphics application program이 바로 Assembly (device language)로 변환되기 힘들기 때문에 사용

 

* High level graphic API

 - 장면을 묘사하는 언어와 이로인해 만들어지는 장면 그래프가 있다.

 - 장면 묘사언어(Scene Description language), 장면 그래프(Scene graph)

 

 - 고수준 API예 : Open Inventor, VRML, Java 3D


* Low level graphic API

 - 장면 묘사 없이 구체적인 프로시저를 호출

 - 하드웨어와 직접연관되서 사용됨(속도 향상!)

 - High level보다 더 세분화된 묘사가 가능


* OpenGL 설계원리

 1. 범용성 : 운영체제와 무관

 2. 효율성 : 하드웨어 가속 기능을 최대한 활용, 회사마다의 공통점과 차이점을 찾아 옵션 기능을 추가

 3. 완전성 : 특정 하드웨어의 성질을 ARB로 확장하여 명령어 제공, 추세에 따라 표준이 변경되기도함.

 4. 상호 작업성 : C(client)-S(server) model을 지원

 5. 독립성 : 기능, 객체간의 독립성을 유지

 


* GPU 설계원리

- CPU Pipe line과 유사

 - 분업, 병렬처리를 통한 처리 속도의 극대화

 - 파이프라인의 서브 프로세서는 속도향상을 위해 HW로 제작한다.

  > GL은 상태변수(State variable)을 생성하여 각각의 파이프라인에 전달만 하면된다.

  > 파이프라인은 상태변수를 참조하고, 자동실행한다.


* 속성 값 할당 방법

 - 파라미터리스트와 시스템 테이블 방식이 있다.

 - 파라미터리스트의 단점에 의해 시스템 테이블 방식을 많이 사용한다.

 ⓐ 파라미터리스트(Parameter list)

  > 파라미터로 속성을 모두 전달

   ex) drawLine( (1,0), (2,0), (255,0,0) ) ; // 빨강색선을 그린다.

  > 속성의 수는 색뿐만 아니라 수많이 존재, 복잡해진다.

   eg. HTML CSS

 ⓑ 시스템 테이블(System table)

  > 각각 속성에 대한 값을 매칭하여 테이블을 생성

  > 사용자는 변화시킬 값을 변화시키고, 작업. 현상태(Current State)를 표에서 읽어와서 작업

   eg. 그림판, Photoshop


* GL 명령어 구조

 

 - Type에는 다양한 것이 존재하지만, f(float)와 v(array)를 주로 사용한다.

 - GL용으로 사용한다는 의미에서 type을 float대신 GLfloat라고 정의하기도 한다.

  > float와 GLfloat가 하는 일은 동일하다.

 - 속도를 위해 객체 지향 요소를 전혀 가미하지 않았기 때문에 오버라이드가 없다.


* GL, GLU, GLUT

 ⓐ GL(OpenGL Core Library) - 렌더링 기능을 제공하는 함수 라이브러리

 ⓑ GLU(OpenGL Utility Library)

  - OpenGL을 위한 그래픽스 라이브러리로 GL함수에 기반하여 작성되었다.

  - GL라이브러리의 도우미 역할로 더 높은 수준의 그리기 루틴을 제공한다.(약 50여 개의 함수가 존재)

  - 일반적으로 GL Package(OpenGL Package)에 함께 배포된다.

  - 임베디드에 제공되는 것과 다르다. 임베디드에는 OpenGL ES(OpenGL for Embedded Systems)로 제공된다.

  - 화면과 세계 좌표간의 맵핑, 미니맵의 텍스쳐 생성, 곡면 표면, NURBS의 그림 등의 기능을 

    OpenGL에서 제공하는 루틴보다 더 인간 친화적으로 제공한다.

  - 사용자의 IO를 받지 않으며 Animation등에서 사용된다.

  ※ NURBS(Non-Uniform Rational Basis Spline)

   - 컴퓨터 그래픽에서 곡선과 표면을 생성하는  수학적 모델

   - 3D NURBS는 복잡하고 유기적인 표면을 만들 수 있다.

   - Control Point를 이용하여 곡선의 모양을 결정

 ⓒ GLUT(OpenGL Utility Toolkit)
  - 사용자의 I/O를 받아들이기 위한 Utility이다.
  - 기본적으로 제공되는 GLUT는 몇 가지 제한 사항을 가지고 있다.  
   1. Library사용을 위해 glutMainLoop() 호출이 필요하지만, 이 함수의 return 값이 없다.
     이는 필요할 때, GLUT를 프로그램에 가져오는 것을 힘들게 한다. 또는 반복적인 실행으로 프로그램이 엉키게 된다.
     해결책 
       - 새로 제공되는 glutCheckLoop()또는 glutMainLoopEvent()함수를 통해서 glutMainLoop()이 되는지 확인       
       - OS가 Thread를 제공해준다면, GLUT를 위한 Thread를 따로 둬서 관리한다.
  2. glutMainLoop()가 Return값이 없는 것으로 인해 GLUT프로그램이 이벤트 루프를 종료 할 수 없다.
      해결책 : glutLeaveMainLoop()함수를 제공해주기 시작했다.
  3. 윈도우가 종료될 때 GLUT가 자신의 역할을 하지 못하고 종료될 때가 있다.
      해결책 : 별도의 콜백 함수를 만들어서 제어를 한다.