컴퓨터 그래픽스 구성요소
- 모델링: 무엇을 그릴것인지, 그래픽으로 표현하고자 하는 물체(Object)를 정의하는 작업. 
- 렌더링: 모델링에 의해 정의된 물체를 어떻게 그릴 것인지, 예를들어 조명을 어떻게 가할 것인지, 관찰자의 위치는 어디에 둘 것인지, 3차월 물체를 어떻게 2차원 물체로 사상시킬 것인지.

프레임 버퍼의 용량
- 프레임 버퍼의 용량은 해상도와 관계가 있다. RGB Full Color의 1024*768 해상도의 그림은 화소당 24비트이니까 1024*768*24 비트(약 2.4MB)가 된다.

OpenGL 소개
API 레벨


고수준 API인 오픈 인벤터, VRML, java 3D 등에서는 모델링에 치중하지만, GL은 렌더링에 치중한다. GL은 저수준 API이기 때문에 단지 점, 선, 다각형 수준의 기본 요소만을 이해한다. 따라서 지엘에서는 고수준 API 처럼 물체를 원구, 실린더 등의 차원에서 정의할 수 없다. 
다시말해, 물체가 단순하든 복잡하든 이미 설계된 물체를 화면에 그려내기 위한 것이 지엘이다.

GL의 설계원리
: G은 C언어 또는 어셈블리 언어로 작성된 약 200여 개의 함수로 구현되어 있다. C프로그램뿐만 아니라 C++, Ada, FORTRAN, Java 프로그램도 지엘 함수를 호출하여 사용할 수 있다. 

- 범용성
: GL은 거의 대부분의 하드웨어에서 실행될 수 있다. 윈도우 운영체제 뿐만 아니라 유닉스 에서도 실행가능 하다.

- 효율성
: 그래픽 카드사 마다 제공하는 기능이 서로 다르기 때문에 어느 한가지 대상만을 고려해서 인터페이스를 설계할 수 없다. 그래서 해당 그래픽 카드사들이 공통으로 가지고 있는 기능을 활용하여 성능을 극대화 시켰으며, 해당 기능을 사용하지 않는 그래픽 카드사를 위해 해당 기능을 ON/OFF 시키는 기능까지 제공한다.

- 완전성
: 그래픽 카드의 성능을 최대한 발휘하기 위해서 그래픽 카드에서 제공하는 어떤 기능을 사용할 때, 다른 그래픽 카드사가 해당 기능을 제공하지 않는 경우를 대비해 "ARB 확장" 형태로 명령어를 제공함으로써 이러한 문제를 해결한다.


파이프라인과 상태 변수
: GPU의 속도를 급격하게 올려준 것이 파이프라인 구조이다. 파이프라인 구조는 일종의 분업 체제라고 할 수 있다.

공장의 컨베이어 벨트 시스템처럼 위 그림의 프로세스1 에서 작업한 후 프로세스2로 넘겨주는 식으로 분업체제를 갖춘다. 설사 프로세스1 에서 작업을 마쳤다고 쉬지 않고 다음 작업을 가져와서 실행한다. 


파이프라인은 크게 위 그림과 같은 서브 프로세서로 이루어져 있다. 입력 기본 요소에 변환, 투상, 절단, 래스터 변환 등의 프로세싱이 순차적으로 가해진다. 
여기서 GL이 하는일은 단지 서브 프로세서에 파라미터를 전달하는 일을 한다. 
GL은 거대한 상태 변수 기계(State Variable Machine)이다. 여기서 상태 변수는 물체가 어떻게 그려져야 할 것 인지를 표현하는 변수들을 말하며, 그래픽 컨텍스트라고 도 불린다. 
결국 GL 프로그램은 입력에 가해질 프로세스의 상태 변수 값을 명시하는 것에 불과하다.


GL은 시스템 테이블을 사용하여 현재 컨텍스트의 상태 변수값을 저장한다. GL은 현재 상태의 값을 set, get하는 함수를 제공한다. 한번 지정된 상태 변수는 변경되기 전까지 그 값을 유지하고, 프로세스를 실행할 때 그 값을 가져다가 사용한다. 

예를 들어 보자.

 glColor3f(1.0, 1.0, 1.0); // GL_CURRENT_COLOR값을 RGB 1, 1, 1 로 변경. 백색이 됨.
위 함수 호출로 색이 백색으로 설정 되었기 때문에 지금 부터 그리는 모든 선, 점등은 흰색으로 그려진다. 

float MyColor[3]; 
glGetFloatv(GL_CURRENT_COLOR, MyColor) // 상태 값 검색 함수
위 함수 호출을 통해 현재 설정된 색이 어떤색인지 검색할 수 있다.

어떤 상태변수는 속성이 아니라 기능에 속한다. 이러한 상태 변수는 해당 기능을 사용할 것인지, 사용하지 않을 것인지 결정한다. 조명, 텍스처 등과 같은 종류의 상태 변수를 모드(Modes)라 한다. 모드는 일반적인 상태보다 좀 더 포괄적인 개념의 상태 변수다. 예를 들어 조명 모드를 비활성화하면 조명에 관련된 모든 상태 변수가 자동으로 비활성 된다.
모드를 처리학 위해서는 설정, 해제, 검색 등 세 종류의 함수가 필요하다.

glEnable(GL_LIGHTING); // 조명 모드 활성화
if glIsEnabled(GL_LIGHTING) 
    glDisable(GL_LIGHTING); // 조명 모드 비활성화








Posted by 홍성곤
,