본문 바로가기

기타/컴퓨터 그래픽스 & OpenGL

[OpenGL] 아이들 콜백 / 2022.10.23

* 출처 : OpenGL로 배우는 3차원 컴퓨터 그래픽스, 한빛아카데미

 

GLUT은 매우 짧은 시간 간격으로 이벤트 루프를 돌기 때문에 어떤 경우에는 큐에 새로운 이벤트가 아직 하나도 안 들어가 있는 때도 있다. 아이들 콜백을 정의하면 이 경우에도 콜백 함수를 만들어 필요한 일을 할 수 있다.

예제를 통해서 알아보자. 

 

#include <glut.h>
#include <gl/GL.h>
#include <gl/GLU.h>

GLfloat Delta = 0.0;

void MyDisplay() {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.5, 0.8);
    glVertex3f(-1.0 + Delta, -0.5, 0.0);
    glVertex3f(0.0 + Delta, -0.5, 0.0);
    glVertex3f(0.0 + Delta, 0.5, 0.0);
    glVertex3f(-1.0 + Delta, 0.5, 0.0);
    glEnd();
    glutSwapBuffers();
}

void MyIdle() {
    Delta = Delta + 0.0001;
    glutPostRedisplay();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(300, 300);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("OpenGL Drawing Example");
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, 1.0, -1.0);
    glutDisplayFunc(MyDisplay);
    glutIdleFunc(MyIdle);
    glutMainLoop();
    return 0;
}

 

이 코드는 사각형을 점차 오른쪽으로 움직이게 하는 애니메이션 프로그램이다.

 

1-1) 전역 변수 Delta : 사각형을 오른쪽으로 옮기는데에 사용, x축으로 Delta만큼 이동된 곳에 새로운 사각형이 그려짐

1-2) MyIdel() : Delta 변수를 0.0001만큼 증가

1-3) MyDisplay() :

- glClear(GL_COLOR_BURRER_BIT) : 기존 컬러 버퍼 내용을 지움 -> 이 함수가 없으면 새로운 사각형이 원래의 사각형에 겹쳐서 그려짐

- glutSwapBuffers() : 이 함수위의 코드들은 백 버퍼에 적용되는데 이 백 버퍼에 적용된 코드들을 버퍼 스와핑 명령을 통해 프런트 버퍼가 됨 -> 따라서 새로 생성된 사각형을 보일 수 있게 됨

 

델타 0.00001만큼 증가