GLUT Application

GLUT의 callback 함수 매커니즘은 대표적인 C-style이고 인터넷 검색을 하면 많은 자료를 찾을 수 있다. 이는 나중에 다룰 생각이고, 이번에는 지금까지 만든 코드를 실제로 GLUT에 적용해 보도록 하겠다.

본 예제는 M. Kilgard의 ‘A simple red cube drawn with minimal OpenGL calls.’를 바탕으로 변형한 것이다. 원본 소스는 여기서 다운로드 받을 수 있다.  GLUT는 freeglut을 사용하였다. 지금까지 차분히 따라왔다면 소스가 어떻게 구성되었는지 쉽게 감을 잡을 수 있을 것이다. 본 포스트에는 main 함수 부분만 간략하게 제시하고, 나머지 소스는 첨부 파일로 대신한다.

#include <GL/freeglut.h>
#include <iostream>
#include "glut_callback.h"
#include "box.h"

int main(int argc, char** argv)
{
    box my_box;    

    //box 초기화
    my_box.init_values();

    // 콜백될 때 함수 내부에서 사용될 클래스
    glut_callback::set_class(&my_box);

    // GLUT initialization code
    glutInit(&argc, argv);
    glClearColor(0.0, 0.0, 0.0, 0.0);

    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
    glutCreateWindow("red 3D lighted cube");

    // glut main loop 이 멈추어도 나머지 코드를 실행하도록 만든다.
    glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
    glutDisplayFunc(&glut_callback::draw_callback);
    glutKeyboardFunc(&glut_callback::keyboard_callback);
    glutIdleFunc(&glut_callback::idle_callback);
    glutMainLoop();

    return EXIT_SUCCESS;
}

다운로드: AdvancedCpp.zip

이 예제는 cube 단 하나를 렌더링하므로 콜백 함수가 그다지 어렵지 않으며, 콜백 함수로 전달할 자료의 구조도 단순한 편이다. 그러나 여러 개의 오브젝트를 그려야 한다면? 나는 그냥 ‘scene graph’ 나 Orge3D 같은 간단한 게임 엔진을 사용하기를 권장한다…. 너무 무책임한가? 🙂

차례로 돌아가기