GLUT

문자기반의 콘솔에 화려한 그래픽을 수놓을 수 없기 때문에 윈도우가 필요하게 됩니다.
하지만!
윈도우를 사용하게 된다면, 플랫폼 독립성을 보장할 수 없습니다. 오로지 윈도우 운영체제에만 의존해서 작동하게 되기 마련이니까요, 그래서 나온것이 GLUT입니다.

GLUT는 그래픽과는 거의 상관없는 기능이며 그래픽을 그리기 위한 껍데기를 만들어주는 것입니다.
그래서 OpenGL 학습을 위해서는 GLUT를 우선적으로 연구해봐야 하는것입니다.

주요함수만 간단하게 훑고 지나가겠습니다.
깊어지면 타겟 플랫폼의 AUX를 사용해야 하기 때문에 포스팅이 너무 길어집니다.




void glutInit(int *argcp, char **argv);
이 함수는 GLUT라이브러리를 초기화하고 기반 플랫폼의 윈도우 시스템과 연결합니다.
인수는 main으로부터 전달받은 argc의 주소와 argv의 배열을 전달하는데, argc가 내부에서 변경될 수도 있으므로, 반드시 참조로 전달하여야 합니다.
glutInit 함수가 하는 가장 중요한 일은 에러처리입니다. 윈도우 시스템과 연결할 수 없다거나 해당 운영체제가 그래픽 인터페이스를 제공하지 않는다면, 에러 메시지를 출력하구 강제종료하는 극단적인 방어가 주된 임무입니다. 
그런데 윈도우 환경에서 작업할 경우에는 확실한 그래픽 운영체제이기 때문에, 굳이 호출하지 않아도 되는것이죠.
  - 결국은 다른(그래픽 기반이 아닌) 운영체제에서 할 경우에는 이 함수를 꼭 호출해야한다는 것입니다.

void glutInitWindowSize(int width, int height);
void glutInitWindowPosition(int x, int y);
인수로 폭과 높이, 그리고 (x, y)좌표를 전달합니다.
윈도우 폭과 높이는 창의 크기가 아니라 작업공간의 크기입니다.
창의 크기는 작업영역크기에 타이틀 바와 경계선이 더해지므로 지정한 크기보다 좀 더 크게 생성됩니다. 100 * 100이면, 작업영역의 크기가 100 * 100이구 윈도우는 좀 더 클것입니다.

크기와 위치를 생략하면 300 * 300의 윈도우를 생성합니다.


void glutInitDisplayMode(unsigned int mode);
디스플레이 표면의 주요 특징들을 결정합니다.
윈도우를 생성한 이후에는 변경할 수 없으므로 잘 선택해야합니다.
여러개의 모드를 OR연산자를 이용해 지정하되 상호 배타적 속성은 한개만 지정합니다.

모드                                              설명
GLUT_RGBA, GLUT_RGB                 트루컬러 모드, 기본값
GLUT_INDEX                                  팔레트를 사용하는 인덱스 모드, 거의 사용안함
GLUT_SINGLE                                싱글버퍼 사용, 기본값
GLUT_DOUBLE                               더블버퍼 사용
GLUT_DEPTH                                 깊이버퍼를 사용한다
GLUT_ACCUM                                누적버퍼를 사용한다
GLUT_ALPHA                                 색상에 알파값을 사용한다
GLUT_STENCIL                               스텐실 버퍼를 사용한다
GLUT_MULTISAMPLE                      멀티샘플링을 지원한다. 
                                                     클라이언트와 서버가 동시지원해야한다.
GLUT_STEREO                               스테레오 윈도우를 사용한다.
GLUT_LUMINANCE                          루미넌스 색상모델을 사용한다.

별다른 지정이 없으면 
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
로 초기화합니다.

int glutCreateWindow(char *name);
윈도우는 상단에 제목을 가지는데 제목을 문자열 인수로 지정합니다.
윈도우를 지칭하는 유일한 ID가 리턴됩니다. 

void glutMainLoop(void);
모든 윈도우 시스템은 이벤트 드리븐 방식으로 동작합니다.
이 함수는 계속 실행되면서 사용자나 시스템에 의해 발생한 메시지를 받아 메시지 처리함수를 호출하는 중요한 역할을 합니다.
콜백함수는 루프로 들어가기전에 미리 선언해야합니다.
아래는 콜백함수입니다.

void glutDisplayFunc(void (*func)(void));
void glutKeyboardFunc(void (*func)(unsigned char key, int x, int y);
void glutMouseFunc(void (*func)(int button, int state, int x, int y);
void glutReshapeFunc(void (*func)(int width, int height);
화면을 그릴 때, 키보드 입력을 받을 때, 마우스 입력을 받을 때, 윈도우 크기가 변경되었을 때, 호출 할 함수를 등록하는 콜백함수입니다.
glutMainLoop는 끊임없이 메시지큐를 감시하며 메시지가 들어올때마다 대응되는 콜백함수를 호출합니다.
이거 말고도 여러가지 콜백함수가 있는데 그거는 나중에 알아보도록 하겠습니다.

void glutSetWindowTitle(char *name);
캡션은 윈도우의 제목을 보여주는 역할을 하지만, 실행중에 변수를 찍어보고 싶을때도 유용합니다.
OpenGL은 폰트출력이 번거로와 캡션 외에는 정보를 실시간으로 출력해 볼만한 장치가 없습니다.
변수값 확인을 위해서 종종 사용될 것입니다.

여태까지 한번 이상씩은 해본 함수들이기 때문에 따로 예제는 하지 않겠습니다.


Posted by 긍정왕오킹