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 같은 간단한 게임 엔진을 사용하기를 권장한다…. 너무 무책임한가? 🙂