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 <stdlib.h>

    #include <gl/glew.h>
    #include <gl/wglew.h>
    #include <gl/glut.h>

     

    위의 Header File 중 #include <gl/wglew.h> 부분은 생략해도 일반적으로 별 문제가 없다.

     

    다음은 GLUT 를 사용한 main 함수를 살펴보자.

     

    void showOpenGLInfo( void );
    void initRendering( void );
    void display( void );

     

    int   main( int argc, char *argv[] )
    {
          // init GLUT and create Window
          glutInit( &argc, argv ); // glut 의 초기화
          glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH );
          glutInitWindowSize( 320, 320 ); // 초기 Window 크기
          glutInitWindowPosition( 100, 100 ); // 초기 Window 위치, 화면 왼쪽상단에서 가로,세로 100 pixel의 위치
          glutCreateWindow( "OpenGL: Open a Simple Window" ); // OpenGL Window Title
          showOpenGLInfo(); // Show general OpenGL Infomations.

     

          // initialize rendering & register callbacks
          initRendering();
          glutDisplayFunc( display );

     

          // enter GLUT event processing cycle
          glutMainLoop();

     

          return 0;
    }

     

    위에서 glutInitDisplayMode() 부분은 매우 중요한 부분으로 몇가지의 옵션이 있는데, 여기에 보여주는것은 Buffer 는 SINGLE Buffer, 색상은 RGB, 그리고 깊이 Buffer 를 사용하겠다는 의미이다. 초기 단순한 Window 를 만드는데는 GLUT_DEPTH 는 필요치 않으나 일반적으로 포함시켰다.

     

    다른 glut*() 함수들은 그 의미를 쉽게 이해할 수 있을것이다. showOpenGL(); 함수는 기본적인 OpenGL 정보를 보여주기 위한것이다. 꼭 필요한 부분이 아니므로 일반적으로 사용하지는 않는다. 이 함수는 아래에 첨부되었다.

    여기까지가 GLUT 을 사용하여 OpenGL Programming 을 하기위한 거의 필수 함수들이다.

     

    void  showOpenGLInfo( void )
    {
          if (glewInit() != GLEW_OK) {
                fprintf( stderr, "Error: %s\n", glewGetErrorString(glewInit()) );
                exit(0);
          }
          fprintf( stderr, "OpenGL Vender: %s\n", glGetString(GL_VENDOR) );
          fprintf( stderr, "OpenGL Version: %s\n", glGetString(GL_VERSION) );
          fprintf( stderr, "GLU Version: %s\n", gluGetString(GLU_VERSION) );
          fprintf( stderr, "GLEW Version: %s\n", glewGetString(GLEW_VERSION) );

     

          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 )
    {
          glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

          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,
                        LPSTR lpszCmdParam , int nCmdShow )
    {
          // init GLUT and create Window
          // glutInit( &argc, argv );
          // need both double buffering and z buffer
          glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH );

              .

              .

              .

     

    그리고 showOpenGL(); 함수는 다음과 같이 변형시키면 된다. 이 부분에 대하여는 아주 쉽게 처리됨을 알 수 있을것이다.

     

    void  showOpenGLInfo( void )
    {
          TCHAR buffer[1024], errmsg[32];

     

          if (glewInit() != GLEW_OK) {
                sprintf( errmsg, "Error: %s\n", glewGetErrorString(glewInit()) );
                MessageBox( GetFocus(), errmsg, "OpenGL Error", MB_OK );
                exit(0);
          }
          sprintf( buffer, "OpenGL Vender: %s\n"

                           "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 )
    {
          glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

     

          glColor4f( 1.0, 1.0, 0.0, 1.0 ); // yellow color
          glBegin( GL_TRIANGLES );
                glVertex3f( -0.5,-0.5, 0.0 );
                glVertex3f( 0.5,-0.5, 0.0 );
                glVertex3f( 0.0, 0.5, 0.0 );
          glEnd();

     

          glFlush();
    }

     

    이 Program 을 컴파일 한 후 실행시키면 다음과 같은 검은 바탕에 노란 삼각형의 그림이 그려지는 것을 볼 수 있을것이다.

     

      

     

     

     

     

     

    GLUT 상태 정보 검색 함수

     

    다음의 함수

     

    int  glutGet( GLenum state ) 

     

    는 OpenGL 사용시 필요한 정보를 얻는데 자주 사용된다.  state 는 어떤 정보를 검색할 것인지에 대한 symbolic 상수 이다. 다음의  예는;

     

    width  = glutGet( GLUT_SCREEN_WIDTH );
    height = glutGet( GLUT_SCREEN_HEIGHT ); 

    now = glutGet( GLUT_ELAPSED_TIME );

     

    pixel 크기로 screen 의 가로와 세로에 대한 정보를 알려준다.  마지막의 예는 현재의 시간에 대한 정보를 알려주는 예이다.  OpenGL Window를 screen 의 한 가운데에 screen 크기의 절반의 크기로 위치하게 하기위하여는 main() 함수를 다음과 같이 수정하면 된다.

     

    int   main( int argc, char *argv[] )
    {
          // init GLUT and create Window
          glutInit( &argc, argv ); // glut 의 초기화
          glutInitDisplayMode( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH ); 
          int width = glutGet( GLUT_SCREEN_WIDTH ) / 2;
          int height = glutGet( GLUT_SCREEN_HEIGHT ) / 2;

          glutInitWindowSize( width, height );   // 초기 Window 크기
          glutInitWindowPosition( width/2, height/2 ); // 초기 Window 위치,

          glutCreateWindow( "OpenGL: Open a Simple Window" ); // OpenGL Window Title
          showOpenGLInfo(); // Show general OpenGL Infomations.

             .

             .

          return 0;
    }

     

     

     

     

    Source Code:             01_1 - create_window.zip

     

     

     

    'OpenGL 활용 > 1장 - Basic' 카테고리의 다른 글

    1장 6절 - Mouse Motion Event  (0) 2013.01.22
    1장 5절 - Mouse Event  (0) 2013.01.22
    1장 4절 - Animation by Idling  (0) 2013.01.21
    1장 3절 - Keyboard Event  (0) 2013.01.20
    1장 2절 - Resize OpenGL Window  (0) 2013.01.20
    And