상태머신
그래픽 출력에는 좌표뿐만 아니라 여러 요소가 개입됩니다.
색상
굵기
모양
조명
등등
그리기 함수들은 이 요소들을 참조하지만, 모든 인자로 이 수많은 요소들을 컨트롤 할 수 없습니다.
인자 목록이 한없이 길어질 것이며 잘 바뀌지도 않는 값을 매번 전달하는건 아주 비효율적이겠지요?
그래서 OpenGL은 이런 여러가지 정보를 상태머신에 저장합니다.
상태머신이란 상태를 저장하는 장소이며, 그리기에 영향을 미치는 여러 변수값들의 집합입니다.
모든 그리기 함수들은 전달받은 인자 외의 정보는 상태머신을 참조합니다.
상태변수들은 적당한 디폴트로 설정되어있는데, 이 값을 바꾸어주고싶을 때는 변경 함수로 값을 바꿔줍니다, 이 바뀐 값은 다시한번 바꾸기 전 까지 계속 유지됩니다.
상태머신은 전역적입니다.
void DoDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
//glColor3f(1.0, 1.0, 1.0); 하얀색이라 있으나마나한 코드
glVertex2f(0.0, 0.6);
glColor3f(1.0, 0.0, 0.0);
glVertex2f(-0.6, 0.0);
//glColor3f(1.0, 0.0, 0.0); 위의 정점이 빨간색이라서 있으나 마나한 코드
glVertex2f(-0.4, -0.6);
glColor3f(0.0, 1.0, 0.0);
glVertex2f(0.4, -0.6);
glColor3f(0.0, 0.0, 1.0);
glVertex2f(0.6, 0.0);
glEnd();
glFlush();
}
각 정점의 색과 인접한 정점의 색을 선형보간하여 칠해 보여줍니다.
상태머신에는 색상처럼 복잡한 정보도 있지만, 꺼짐과 켜짐만 정의되는 옵션도있습니다
void glEnable(GLenum cap);
void glDisable(GLenum cap);
GLBoolean gllsEnabled(GLenum cap);
설정값은 열거형으로 지정하는데, 수십가지 값이 있습니다.
GL_FOG는 안개, GL_LIGHTNING은 조명효과인데, 쓰고싶으면 glEnable로 활성화하고 아니면 glDisable로 해제하면 됩니다.
위의 진위형 켜짐과꺼짐같은 형태의 기능이 아닌 경우에는
void glGetIntegerv(GLenum pname, GLint* params);
void glGetFloatv(GLenum pname, GLint* params);
void glGetDoublev(GLenum pname, GLint* params);
void glGetBooleanv(GLenum pname, GLint* params);
첫번째 인수는 알고싶은 상태변수 값이구, 두번째 인수는 상태값을 리턴받을 배열입니다.
그럼, 예를 들어서, 현재 설정된 색상값을 알고싶으면 아래와 같이 하면 됩니다.
GLfloat arColor[4];
// 색을 이루는 인자는 네가지가 있기 때문에
glGetFloatv(GL_CURRENT_COLOR, arColor);
요런식으로 하면 됩니다.
상태머신은 영속적이기 때문에, 상태머신이 여러번 변경되었을 때 다시 이전 상태로 돌아가고 싶은 경우에는 어떻게 할까요?
void glPushAttrib(GLbitfield mask);
void glPopAttrib(void);
푸시푸시하면 현재의 상태정보를 스택에 저장하구, 팝하면 스택에 저장한 상태정보를 복구합니다.
저장 대상이 되는 상태값은 그룹별로 비트마스크로 정의되어있습니다.
Mask 설명
GL_COLOR_BUFFER_BIT GL_BLEND, GL_DITHER
GL_CURRENT_BIT 현재색상, 법선, GL_EDGE_FLAG
GL_DEPTH_BUFFER_BIT GL_DEPTH_TEST
GL_ENABLE_BIT GL_COLOR_MATERIAL, GL_DEPTH_TEST
GL_CULL_FACE
GL_FOG_BIT GL_FOG, 안개색상, 밀도, 시작점, 끝점
GL_HINT_BIT GL_POINT_SMOOTH_HINT, GL_LINE_SMOOTH_HINT
GL_LIGHTNING_BIT GL_LIGHTNING
버전조사
다음 두 함수는 GL, GLU라이브러리 자체에 대한 정보를 조사합니다.
특정 기능의 지원여부를 알아본다구 생각하시면 됩니다.
const GLubyte* glGetString(GLenum name);
const GLubyte* gluGetString(GLenum name);
name인수로 어떤 정보를 조사할 것인지 지정하며, 조사결과는 문자열로 리턴합니다.
정보 설명
GL_VENDOR GL을 구현한 회사명 리턴
GL_RENDERER Renderer의 이름 리턴
GL_VERSION 버전 or 릴리즈 번호
GL_SHADING_LANGUAGE_VERSION 쉐이더 언어의 버전
GL_EXTENSION 확장 기능 목록 표시
크게 자주쓰이거나 하진 않습니다.
'Graphics > OpenGL' 카테고리의 다른 글
OpenGL 기초 - 블렌딩 (0) | 2014.05.17 |
---|---|
OpenGL 기초 - 점, 선, 삼각, 사각, 다각형 (0) | 2014.05.17 |
OpenGL 기초 - 색상변경 (0) | 2014.05.16 |
OpenGL 기초 - 기본타입, 함수형식 (0) | 2014.05.16 |
OpenGL 기초 - 삼각형 출력하기 (0) | 2014.05.16 |