1장 1절 - Create a Simple OpenGL Window
Create a Simple OpenGL Window
OpenGL Programming 을 하는 방법의 여러가지 중에서 GLUT (Graphic Library Utility Tools)을 이용하여 하는 기초적인 사항들을 알아보기로 하자. GLUT 은 graphic 처리에 대한 event handling 의 기본적인 callback 함수들을 제공하고 있는데, 대표적인것이
- 도형을 화면에 표현하는 Display Event Handler
- OpenGL 화면의 크기를 조정하는 Reshape Event Handler
- Keyboard 의 일반 key 에 대한 Keyboard Event Handler
- Keyboard 의 특수 key 에 대한 Special Event Handler
- Mouse Button 에 대한 Mouse Event Handler
- Mouse 움직임에 따른 Motion Event Handler
- 화면에서 Object 의 움직임과 동작을 주는 Idle Event Handler
- Menu 에 대한 Menu Event Handler
등이 있다. 이번 장에서는 이러한 사항에 대한 기초적인 부분을 알아보기로 한다.
MS Windows 환경에서 OpenGL Programming 을 하는 방법에는 Console 모드를 사용하는 방법과 Win32 API 를 사용하는 두가지 방식이 있다. 여기에서는 간단히 두가지의 Programming 하는 방법을 비교해 보고 GLUT 의 기본적인 사용법을 알아 보기로 한다.
OpenGL 의 처음 시작으로 간단한 OpenGL 창을 만들어 보기로 하자.
OpenGL Programming 을 위한 Header File 은 다음을 준비해 두는게 일반적이다. 때에 따라 필요하지 않은 Header 도 있지만 컴파일된 파일 Size가 큰 문제가 되지 않는다면, 다음의 Header File 들은 일반적으로 붙여서 사용하는 것이 programming 하는데 편리하다.
#include <stdio.h> #include <gl/glew.h> |
위의 Header File 중 #include <gl/wglew.h> 부분은 생략해도 일반적으로 별 문제가 없다.
다음은 GLUT 를 사용한 main 함수를 살펴보자.
void showOpenGLInfo( void );
int main( int argc, char *argv[] )
// initialize rendering & register callbacks
// enter GLUT event processing cycle
return 0; |
위에서 glutInitDisplayMode() 부분은 매우 중요한 부분으로 몇가지의 옵션이 있는데, 여기에 보여주는것은 Buffer 는 SINGLE Buffer, 색상은 RGB, 그리고 깊이 Buffer 를 사용하겠다는 의미이다. 초기 단순한 Window 를 만드는데는 GLUT_DEPTH 는 필요치 않으나 일반적으로 포함시켰다.
다른 glut*() 함수들은 그 의미를 쉽게 이해할 수 있을것이다. showOpenGL(); 함수는 기본적인 OpenGL 정보를 보여주기 위한것이다. 꼭 필요한 부분이 아니므로 일반적으로 사용하지는 않는다. 이 함수는 아래에 첨부되었다.
여기까지가 GLUT 을 사용하여 OpenGL Programming 을 하기위한 거의 필수 함수들이다.
void showOpenGLInfo( void )
return; |
다음의 initRendering(); 함수는 OpenGL programming 의 초기화에 필요한 부분들에 대한 함수들을 묶어놓은 함수이다.
void initRendering( void ) { glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); // black background color glEnable( GL_DEPTH_TEST ); // Enable hidden--surface--removal } |
위에서 glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); 는 검은색 배경색을 나타낸다. 함수내의 숫자는 RGBA 의 크기를 나타내는데, 0에서 1 사이의 값을 가진다. 변수형태는 float 로 표현된다. glEnable( GL_DEPTH_TEST ); 는 현재는 별 의미가 없다. 다음에 3차원 도형을 다룰 때 설명이 따르게 될것이다.
glutDisplayFunc( display ); 함수는 display() 함수에서 요구한 사항들을 OpenGL Window 에 나타내는 것이다. 다음의 display() 함수를 살펴보면
void display( void ) glFlush(); |
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 는 색상 Buffer 와 깊이 Buffer 를 비우고, 마지막에 glFlush();
함수를 통해 display() 명령들을 화면으로 내보낸다. 이러한 display() 함수의 모든 명령들을 받아 처리하는 glut callback 함수가 glutDisplayFunc(); 이다. 여기에서는 아무런 그림이나 도형도 그리지 않고 단지 OpenGL Window 만 열게 하였다.
main() 함수의 마지막 glutMainLoop(); 함수는 위 모든 함수들을 최종적으로 정리, Looping 하여 나타낸다. 다음은 위에서 사용된 함수들에 대한 간단한 설명이다.
- glClearColor(); - 화면 배경 색상 설정
- glClear(); - 화면과 Buffer 를 지움
- glFlush(); - Buffer 의 내용을 화면에 뿌려줌
- glGetString(); - OpenGL 의 version, 확장목록등의 정보를 알려줌
위 프로그램을 실행시키면, Command 창과 함께 OpenGL Window 창이 뜨게 된다. Win32API mode 로 프로그래밍을 하게 되면, Command 창은 뜨지 않게 된다. Win32API mode 에 대한 Programming 은 다음의 Site 에가면 매우 잘 설명이 되어있다. 영어해석에 별 무리가 없다면 다양한 좋은 정보들을 얻을 수 있을것이다.
NeHe Production: http://nehe.gamedev.net/
Win32API 로 구현된 Program 들은 매우 복잡하게 보이나, 단지 keyboard, mouse, 등의 Event Handler 에 대한 부분만이 glut 을 사용할 때와 조금 다르고 다른 부분에 별 차이가 없음을 알게 될것이다.
간단히 Win32API Mode 로 위의 program을 변경하면 다음과 같이 몇 부분만 바꾸면 된다. main() 함수의 처음 부분을
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, . . . |
그리고 showOpenGL(); 함수는 다음과 같이 변형시키면 된다. 이 부분에 대하여는 아주 쉽게 처리됨을 알 수 있을것이다.
void showOpenGLInfo( void )
if (glewInit() != GLEW_OK) { "OpenGL Version: %s\n" "GLU Version: %s\n" "GLEW Version: %s\n", glGetString(GL_VENDOR ),glGetString(GL_VERSION), gluGetString(GLU_VERSION), glewGetString(GLEW_VERSION) ); MessageBox( GetFocus(), buffer, "OpenGL Info", MB_OK );
return; |
이상으로 이제 OpenGL 프로그래밍의 기본은 준비되었다. 기본적이 도형을 그리는 부분은 다음에 알아보겠지만 우선 간단한 노란색 2차원 삼각형 그림을 그리기 위해, 위의 display() 함수 내에 다음의 몇 줄을 더해보자.
void display( void )
glColor4f( 1.0, 1.0, 0.0, 1.0 ); // yellow color
glFlush(); |
이 Program 을 컴파일 한 후 실행시키면 다음과 같은 검은 바탕에 노란 삼각형의 그림이 그려지는 것을 볼 수 있을것이다.
GLUT 상태 정보 검색 함수
다음의 함수
int glutGet( GLenum state ) |
는 OpenGL 사용시 필요한 정보를 얻는데 자주 사용된다. state 는 어떤 정보를 검색할 것인지에 대한 symbolic 상수 이다. 다음의 예는;
width = glutGet( GLUT_SCREEN_WIDTH ); now = glutGet( GLUT_ELAPSED_TIME ); |
pixel 크기로 screen 의 가로와 세로에 대한 정보를 알려준다. 마지막의 예는 현재의 시간에 대한 정보를 알려주는 예이다. OpenGL Window를 screen 의 한 가운데에 screen 크기의 절반의 크기로 위치하게 하기위하여는 main() 함수를 다음과 같이 수정하면 된다.
int main( int argc, char *argv[] ) glutInitWindowSize( width, height ); // 초기 Window 크기 glutCreateWindow( "OpenGL: Open a Simple Window" ); // OpenGL Window Title . . return 0; |
Source Code: 01_1 - create_window.zip