[ OpenGL 3 ] 모르면 안되는 기본 함수

openGL 프로그램의 기본 틀을 알아야 이를 응용해서 원하는 프로그램을 만들 수 있다. 기본 틀 분석을 위해 사용할 코드는 다음과 같다.

#include "stdafx.h"
#include <math.h>

#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

void MyDisplay() {
        glClear(GL_COLOR_BUFFER_BIT);       
        glColor3f(0.5, 0.5, 0.5);          
        glBegin(GL_POLYGON);                
        glVertex3f(-0.5, -0.5, 0.0);    
        glVertex3f(0.5, -0.5, 0.0);     
        glVertex3f(0.5, 0.5, 0.0);     
        glVertex3f(-0.5, 0.5, 0.0);    
        glEnd();
        glFlush();
}
void MyReshape(int NewWidthint NewHeight) {
        glViewport(0, 0, NewWidthNewHeight);
        GLfloat WidthFactor = (GLfloat)NewWidth / (GLfloat)300;
        GLfloat HeightFactor = (GLfloat)NewHeight / (GLfloat)300;
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        // orthographic : 직각
        glOrtho(-1.0 * WidthFactor, 1.0 * WidthFactor,
               -1.0 * HeightFactor, 1.0 * HeightFactor, -1.0, 1.0);
}
int main(int argcchar** argv) {
        glutInit(&argcargv);
        glutInitDisplayMode(GLUT_RGB);
        glutInitWindowSize(300, 300);
        glutInitWindowPosition(0, 0);
        glutCreateWindow("OpenGL Drawing Example");
        glClearColor(1.0, 1.0, 1.0, 1.0);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
        glutDisplayFunc(MyDisplay);
        glutMainLoop();
        return 0;
}

glutInit(&argc, argv) : glut를 초기화 하기 위한 메서드이다.  argc, argv는 윈도우에서 프로그램으로 전달하는 매개변수로, 운영체제마다 다를 수 있기 때문에 대부분의 경우 별다른 조작없이 glutInit 함수로 전달한다. glut 즉, gl과 윈도우의 인터페이스를 담당하는 함수모임이란 의미이며 Init는 초기화를 위미한다, glut를 초기화하는 함수는 모두 glutInit 라는 접두어가 붙는다. 

glutIntDisplayMode(unsigned int mode) : 색상 모드와 버퍼의 수, 버퍼의 종류를 설정함 즉, 데이터를 출력방식을 결정한다.
 mode 의 값으로는 
 - GLUT_RGBA : glut의 기본 색상모드 
 - GLUT_INDEX : 인덱스 색상모드 
 - GLUT_SINGLE : 단일 버퍼 
 - GLUT_DOUBLE : 이중 버퍼 , 부드로운 에니메이션을 만들 때 사용
 - GLUT_ACCUM / GLUT_STENCLE / GLUT_DEPTH ,상충되지 않는 속성들은 OR 비트 연산을 통해 적용시킨다.

glutInitWindowSize(int widtg, int height) : 윈도우 창 크기 설정, 윈도우를 만들꺼면 어떤 크기로 만들건지 지정해 줘야된다.

glutInitWindowPosition(int x, int y) : 화면 왼쪽 위에서 (x,y) 픽셀 만큼 떨어진 곳에 생성, 윈도우를 만들꺼면 어딨는지 알려줘야된다.

glutCreateWindow(string) : 더이상 설정이 끝났으면 윈도우 창 생성 , 창이름은 string 


glutClearColor(f R ,f G ,f B ,f A) : RGBA 값은 0 ~ 1.0 까지의 float 형 값을 사용,  컬러 버퍼를 지우는데 지우는 색을 지정 할 수 있다. 상태변수테이블을 생각하면 쉽다. 앞으로 모든 RGBA 값은 이 함수를 통해 설정된 RGBA 값으로 정해진다. 

glMatrixMode(mode) : 행렬모드를 설정한다. 당연히 상태변수테이블의 값을 조작하는 기능이며, 파이프라인에서 그래픽 계산에 사용되는 행렬을 설정한다. 추후에 자세히 알아보겠다.

glLoadIndentity() : glMatrixMode에서 설정한 행렬을 초기화한다. 이 때는 단위 행렬이 저장되는데 주후에 자세히 알아보겠다.

glOrtho(top,botton,left,right,near,far) : 위에서 초기화한 행렬을 다시 투영 행렬로 생성하는데, 각 인자는 다음 그림과 같다. 여기서 Ortho는 Orthographic 의 약자인데 3D 물체를 컴퓨터에서 표현하는 방식에는 Orthographic과 Perspective 두가지 방식이 있다.



그림으로 보면 대충 느낌이 오지만
이 역시 나중에 설명하겠다.

참고로 각 매개변수의 의미는 다음과 같다.




glutDisplayFunc(void (*func)(void)) : 디스플레이 이벤트를 담당하는 콜백 메서드를 등록한다. 즉, 디스플레이 이벤트가 발생할때마다 등록된 함수를 실행한다. 그럼 콜백메서드로 등록된 MyDisplay 함수를 살펴보자

glClear(mask) : 버퍼를 미리 설정된 값으로 컬러 버퍼를 지운다 OR 비트 연산 가능
 GL_COLOR_BUFFER_BIT : 컬러를 쓰기위해 현재 활설화된 버퍼로 지움
 GL_DEPTH/ACCUM/STENSIL_BUFFER_BIT , 깊이 버퍼 / 누적 버퍼 / 스텐실 버퍼로 지움

glColor3f(R,G,B) : 0 ~ 1.0 값으로 인수 전달, 상태 테이블을 변경한다.

glBegin(mode) ~ glEnd() 는 블록 사이에 배치된 정점들을 연결해서 어떤 도형을 그릴지 지정하는 메서드이다. 그리기 모드는 아래와 같다


void glFlush(void) : 물류센터에서 택배를 보낼때도 트럭에 여러 상자를 모아서 한번에 보내지 한상자를 하나씩 하나씩 보내진 않는다. GL에서도 속도 개선을 위해 명령어를 모아놨다가 한번에 보내는데 이를 명령어 모음 덩어리를 패킷이라고 한다. 다만 GL은 패킷이 다 차야지만 보내서 랜더링 처리를 하게되는데, 패킷이 다 차는것을 기다리지 않고 바로 보내서 처리하는 함수가 glFlush인 것이다. 같은 기능을 하는 함수로는 glFinish()가 있다. 이 둘의 차이점은 glFlush의 경우는 패킷을 보내기만하고 바로 리턴하는 반면, glFinish는 패킷의 내용이 모두 랜더링 처리가 완료되어야 리턴을 한다. 따라서 glFlush는 반드시 다 그렸다는 보증을 받지 않아도 되는 상황에서 사용한다. 실제 사용예는 추후에 알아보겠다.



glutMainLoop() : 이 전 글에서 이벤트와 콜벡함수가 뭔지 배웠다. 이 함수는 이 프로그램에 필요한 이벤트의 콜벡함수 등록을 모두 마쳤으니 이제 그만 이벤트 루프(이벤트가 발생하면 그 이벤트를 이벤트큐에 넣는)를 실행하라는 의미이다. 기능을 보니 대부분의 GL 프로그램에서 코드의 마지막에 위치할 것으로 예상된다.


마지막으로 접두어가 gl 인 함수는 모두 gl 라이브러리의 함수로 하는일은 상태 테이블의 여러가지 변수 값을 설정 하는 것 이라는 사실을 기억하면서 코드의 실행 결과는 다음과 같다