[ OpenGL 2 ] OpenGL ?
1. GL의 설계
GL은 C언어 또는 어셈블리 언어로 작성된 약 200여 개의 함수 모음이다. 따라서 C 프로그램 뿐 아니라, Java 심지어 FORTRAN 프로그램 까지도 지엘 함수를 사용할 수 있다. GL의 기본적인 설계 원리는 다음과 같다
- 범용성 : GL은 저수준 그래픽 언어로 하드웨어나 운영체제 에 관계없이 실행될 수 있도록 설계되었다.
- 효율성 : 각 그래픽 하드웨어 회사의 제품마다 지원하는 기능이 있고, 아닌 기능이 있을것이다. GL 은 이를 고려하여, 주어진 기능이 프로그램에 의해 활성화, 비활성화 될 수 있도록 기능모드Functional Mode 를 제공한다.
- ARB 확장 : 예를 들어 엔비디아의 AMD의 GPU를 생각해보자. 각 회사마다 자신들이 개발한 그래픽 기능 함수들이 있을 것이고, 이는 프로그래밍을 할 때 상당히 골치 아프게 작용할 것이다. 이를 체계적으로 관리하기 위해 OpenGL 위원회 Architecture Review Board,ARB 에서 해당 함수의 가치가 증면되면, ARB는 그 함수를 핵심기능으로 OpenGL 에 통합시킨다. 또한 이런 함수 내지 토큰 간의 이름 충돌을 피하기 위해 회사별로 이름 규칙을 만들었다. GL_NV_ .... 이라면, 이는 엔비디아사의 독점 확장이라는 의미이다.
- 상호작업성 : GL은 명령을 내리는 주체와 명령을 수행(랜더링) 하는 주체가 별개의 체계로 동작한다. 이때 네트워크상으로도 전달이 가능하며 심지어 각 주체가 운영체제나 하드웨어가 달라도 가능하다. 한마디로 GL은 Server-Client 구조 이다.
- 비객체지향 : GL의 함수는 객체지향 개념이 없다. 그래픽 작업에서 첫번째로 중요한 것은 속도 이기 때문에, GL 은 단지 이 속도 개선을 위해 절차지향언어로 구성되어 있다. 따라서 함수 오버로딩이 없으며 구분을 위해 명령어 구조가 정해져 있다.
glVertex3fv(p) 는 gl의 3D Vertex 기능을 담당하는 함수이며 float형 v벡터 p(x,y,z 로 이뤄진 배열 ) 이 사용된다는 뜻인데, 오버로딩이 없으므로 2D Vector 기능을 당당하는 함수는 따로 glVertex2f(p) 이다.
2. 파이프라인과 상태변수
- 파이프라인 구조란 CPU의 그래픽 처리속도를 개선하기 위해 고안된 하드웨어적인 구성으로 물체 렌더링을 체계적으로 처리한다. 그래픽 테이터 입력은 변환-투상-절단-래스터 를 담당하는 프로세서들을 순차적으로 거쳐 출력되는데, 이는 공장의 컨베이어 벨트와 비슷하다 하나의 출력이 완성될때까지 각 프로세서들이 쉬는것이 아니라, 끊임없이 다음 작업을 하기 때문이다. 일종의 분업 체계라고 할 수 있다. 파이프라인에서 이뤄지는 변환-투상-절단-래스터 프로세스 과정을 서브 프로세스라고 하는데, 이는 하드웨어적으로 고정된 것이라 GL이 관여할 수는 없다. 그렇다면 GL이 하는 일은 무엇인가?
상태 변수란 그래픽이 어느 위치에서 어떤 모양, 어떤 색으로 그려질지를 결정하는 변수이다. 당연하게도 서브 프로세스는 이 상태 변수를 기준으로 행해지는데, GL은 이 상태변수를 체계적으로 관리 하게 해주는 역활을 하는것이다.
- 상태 테이블 : GL이 상태 변수를 관리하는 방식을 상태 테이블을 이용한다. 상태 테이블이란, 전역 변수로 이해하면 쉬운데, 그래픽 작업마다 따로 상태 변수가 있는것이 아니라 전역 변수 테이블을 유지하면서 작업 시 마다 이 테이블에서 변수를 꺼내서 쓴다고 이해하면 쉽다. 따라서 한번 상태 변수를 설정하면 변경이 있기 전까지는 모두 똑같은 상태 변수가 적용된다. GL 함수는 이 상태 테이블 값을 변경하고 조회하는 기능을 제공하는 것이다.
3. 프로그램 구성 요소
- GL : GL은 단순히 렌더링 기능만을 제공하는 함수 라이브러리 이다.
- GLU : 다각형분할Tessellation , 투상 Projection 2차원곡면 Quadratic Surface 등 고급 그래픽 기능을 제공하는 함수로 GL의 도우미 정도로 볼 수 있다. 이를 이용하면 원구, 원뿔 원기둥 등을 손쉽게 생성할 수 있다.
- GLUT : 사용자와 통신하기 위한 운영체제의 콜벡함수들의 모임이다. 그러나 GLUT가 많은 기능을 제공하는 것은 아니며, 운영체제와 관련된 함수들은 당연히 호환성 문제와 직면하는데 GLUT는 호환성을 보장하기 위해 상당히 추상적으로 구성되어 있다. 따라서 매우 제한적인 GUI 인터페이스만 제공한다.
4. 입력장치와의 통신
기본적으로, 메저 프로세스Measure Process : 입력장치의 입력 값Measure을 저장하는 프로세스이며, 트리거 프로세스Trigger Process : 메저(입력값) 을 전달하라는 신호를 보내는 프로세스이다. 프로그램이 사용자의 입력과 작용하기 위한 방법에는 3가지가 있다
- 리퀘스트Request 모드 : 프로그램 실행 중에 Measure를 요구하는 방식이다. Trigger가 있어야지만 Measure를 전달하며, 그 전까지 프로그램은 대기 상태가 된다. C언어의 Scanf 함수를 생각해보면 이해가 빠르다.
- 샘플Sample 모드 : 직접Immediate 모드 라고도 하며, Trigger 가 없어도 계속 프로그램으로 Measure를 전달한다. 예를들면 FPS 게임에서 마우스 클릭이나 마우스 움직임 없어도 계속 마우스 위치 정보가 전달되며 그 위치를 기준으로로 항상 조준점이 출력되는 것을 생각하면 쉽다.
- 이벤트Event 모드 : 처리해야 할 트리거와 메저가 전달된 상황을 하나의 사건, 즉 이벤트 라고 생각하고 그 이벤트를 이벤트 큐에 삽입한다. 응용 프로그램은 이 이벤트 큐 를 주기적으로 검사하며 순차적으로 이벤트를 처리하는 방식이다. 만약 이벤트 큐가 비어있다면 프로그램은 다른 일을 수행한다. 만약 이벤트 큐에 이벤트가 존재한다면, 이를 응용프로그램에 전달하여 처리한다.
- 콜벡Callback함수 : 응용 프로그램이 이벤트를 처리할 때 호출하게되는 함수이다. 운영체제에서 사용자의 입력에 의해 어떤 기능을 한다는 것은 운영체제가 내부적으로 함수가 호출했다는 의미인데 이런 방식으로 운영체제가 호출하는 함수를 콜벡함수 라고 한다.
GL은 C언어 또는 어셈블리 언어로 작성된 약 200여 개의 함수 모음이다. 따라서 C 프로그램 뿐 아니라, Java 심지어 FORTRAN 프로그램 까지도 지엘 함수를 사용할 수 있다. GL의 기본적인 설계 원리는 다음과 같다
- 범용성 : GL은 저수준 그래픽 언어로 하드웨어나 운영체제 에 관계없이 실행될 수 있도록 설계되었다.
- 효율성 : 각 그래픽 하드웨어 회사의 제품마다 지원하는 기능이 있고, 아닌 기능이 있을것이다. GL 은 이를 고려하여, 주어진 기능이 프로그램에 의해 활성화, 비활성화 될 수 있도록 기능모드Functional Mode 를 제공한다.
- ARB 확장 : 예를 들어 엔비디아의 AMD의 GPU를 생각해보자. 각 회사마다 자신들이 개발한 그래픽 기능 함수들이 있을 것이고, 이는 프로그래밍을 할 때 상당히 골치 아프게 작용할 것이다. 이를 체계적으로 관리하기 위해 OpenGL 위원회 Architecture Review Board,ARB 에서 해당 함수의 가치가 증면되면, ARB는 그 함수를 핵심기능으로 OpenGL 에 통합시킨다. 또한 이런 함수 내지 토큰 간의 이름 충돌을 피하기 위해 회사별로 이름 규칙을 만들었다. GL_NV_ .... 이라면, 이는 엔비디아사의 독점 확장이라는 의미이다.
- 상호작업성 : GL은 명령을 내리는 주체와 명령을 수행(랜더링) 하는 주체가 별개의 체계로 동작한다. 이때 네트워크상으로도 전달이 가능하며 심지어 각 주체가 운영체제나 하드웨어가 달라도 가능하다. 한마디로 GL은 Server-Client 구조 이다.
- 비객체지향 : GL의 함수는 객체지향 개념이 없다. 그래픽 작업에서 첫번째로 중요한 것은 속도 이기 때문에, GL 은 단지 이 속도 개선을 위해 절차지향언어로 구성되어 있다. 따라서 함수 오버로딩이 없으며 구분을 위해 명령어 구조가 정해져 있다.
glVertex3fv(p) 는 gl의 3D Vertex 기능을 담당하는 함수이며 float형 v벡터 p(x,y,z 로 이뤄진 배열 ) 이 사용된다는 뜻인데, 오버로딩이 없으므로 2D Vector 기능을 당당하는 함수는 따로 glVertex2f(p) 이다.
2. 파이프라인과 상태변수
- 파이프라인 구조란 CPU의 그래픽 처리속도를 개선하기 위해 고안된 하드웨어적인 구성으로 물체 렌더링을 체계적으로 처리한다. 그래픽 테이터 입력은 변환-투상-절단-래스터 를 담당하는 프로세서들을 순차적으로 거쳐 출력되는데, 이는 공장의 컨베이어 벨트와 비슷하다 하나의 출력이 완성될때까지 각 프로세서들이 쉬는것이 아니라, 끊임없이 다음 작업을 하기 때문이다. 일종의 분업 체계라고 할 수 있다. 파이프라인에서 이뤄지는 변환-투상-절단-래스터 프로세스 과정을 서브 프로세스라고 하는데, 이는 하드웨어적으로 고정된 것이라 GL이 관여할 수는 없다. 그렇다면 GL이 하는 일은 무엇인가?
상태 변수란 그래픽이 어느 위치에서 어떤 모양, 어떤 색으로 그려질지를 결정하는 변수이다. 당연하게도 서브 프로세스는 이 상태 변수를 기준으로 행해지는데, GL은 이 상태변수를 체계적으로 관리 하게 해주는 역활을 하는것이다.
- 상태 테이블 : GL이 상태 변수를 관리하는 방식을 상태 테이블을 이용한다. 상태 테이블이란, 전역 변수로 이해하면 쉬운데, 그래픽 작업마다 따로 상태 변수가 있는것이 아니라 전역 변수 테이블을 유지하면서 작업 시 마다 이 테이블에서 변수를 꺼내서 쓴다고 이해하면 쉽다. 따라서 한번 상태 변수를 설정하면 변경이 있기 전까지는 모두 똑같은 상태 변수가 적용된다. GL 함수는 이 상태 테이블 값을 변경하고 조회하는 기능을 제공하는 것이다.
3. 프로그램 구성 요소
- GL : GL은 단순히 렌더링 기능만을 제공하는 함수 라이브러리 이다.
- GLU : 다각형분할Tessellation , 투상 Projection 2차원곡면 Quadratic Surface 등 고급 그래픽 기능을 제공하는 함수로 GL의 도우미 정도로 볼 수 있다. 이를 이용하면 원구, 원뿔 원기둥 등을 손쉽게 생성할 수 있다.
- GLUT : 사용자와 통신하기 위한 운영체제의 콜벡함수들의 모임이다. 그러나 GLUT가 많은 기능을 제공하는 것은 아니며, 운영체제와 관련된 함수들은 당연히 호환성 문제와 직면하는데 GLUT는 호환성을 보장하기 위해 상당히 추상적으로 구성되어 있다. 따라서 매우 제한적인 GUI 인터페이스만 제공한다.
4. 입력장치와의 통신
기본적으로, 메저 프로세스Measure Process : 입력장치의 입력 값Measure을 저장하는 프로세스이며, 트리거 프로세스Trigger Process : 메저(입력값) 을 전달하라는 신호를 보내는 프로세스이다. 프로그램이 사용자의 입력과 작용하기 위한 방법에는 3가지가 있다
- 리퀘스트Request 모드 : 프로그램 실행 중에 Measure를 요구하는 방식이다. Trigger가 있어야지만 Measure를 전달하며, 그 전까지 프로그램은 대기 상태가 된다. C언어의 Scanf 함수를 생각해보면 이해가 빠르다.
- 샘플Sample 모드 : 직접Immediate 모드 라고도 하며, Trigger 가 없어도 계속 프로그램으로 Measure를 전달한다. 예를들면 FPS 게임에서 마우스 클릭이나 마우스 움직임 없어도 계속 마우스 위치 정보가 전달되며 그 위치를 기준으로로 항상 조준점이 출력되는 것을 생각하면 쉽다.
- 이벤트Event 모드 : 처리해야 할 트리거와 메저가 전달된 상황을 하나의 사건, 즉 이벤트 라고 생각하고 그 이벤트를 이벤트 큐에 삽입한다. 응용 프로그램은 이 이벤트 큐 를 주기적으로 검사하며 순차적으로 이벤트를 처리하는 방식이다. 만약 이벤트 큐가 비어있다면 프로그램은 다른 일을 수행한다. 만약 이벤트 큐에 이벤트가 존재한다면, 이를 응용프로그램에 전달하여 처리한다.
- 콜벡Callback함수 : 응용 프로그램이 이벤트를 처리할 때 호출하게되는 함수이다. 운영체제에서 사용자의 입력에 의해 어떤 기능을 한다는 것은 운영체제가 내부적으로 함수가 호출했다는 의미인데 이런 방식으로 운영체제가 호출하는 함수를 콜벡함수 라고 한다.