본문 바로가기

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

[OpenGL] 타이머 콜백 / 2022.10.24

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

 

일정한 시간 간격이 지나면 발생하는 이벤트가 타이머 이벤트이며, 타이머 콜백은 이 이벤트에 대응하는 콜백 함수다.

void glutTimerFunc(unsigned int msecs, void(*func)(int value), int value);
- unsigned int msecs : 얼마 후에 이벤트를 발생시킬 것인지, msec 단위
- void(*func)(int value) : 타이머 이벤트 발생 시에 호출되어야 할 함수명
- int value : 이벤트 발생 시에 콜백 함수에 넘겨줄 파라미터

 

예제를 통해 알아보자.

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

unsigned char PALETTE[16][3] = {
    { 255, 255, 255 },      // WHITE
    {   0, 255, 255 },      // CYAN
    { 255,   0, 255 },      // PURPLE
    {   0,   0, 255 },      // BLUE
    { 192, 192, 192 },      // LIGHT GRAY
    { 128, 128, 128 },      // DARK GRAY
    {   0, 128, 128 },      // DARK TEAL
    { 128,   0, 128 },      // DARK PURPLE
    {   0,   0, 128 },      // DARK BLUE
    { 255, 255,   0 },      // YELLOW
    {   0, 255,   0 },      // GREEN
    { 128, 128,   0 },      // DARK YELLOW
    {   0, 128,   0 },      // DARK GREEN
    { 255,   0,   0 },      // RED
    { 128,   0,   0 },      // DARK RED
    {   0,   0,   0 },      // BLACK
};

GLfloat Delta = 0.0;
GLint   Index = 0;
GLfloat Red = 0.0;
GLfloat Green = 0.0;
GLfloat Blue = 0.0;

void MyDisplay() {
    Red = PALETTE[Index][0] / 255.0f;
    Green = PALETTE[Index][1] / 255.0f;
    Blue = PALETTE[Index][2] / 255.0f;

    glColor3f(Red, Green, Blue);
    glBegin(GL_LINES);
    glVertex3f(-1.0 + Delta, 1.0, 0.0);
    glVertex3f(1.0 - Delta, -1.0, 0.0);
    glVertex3f(-1.0, -1.0 + Delta, 0.0);
    glVertex3f(1.0, 1.0 - Delta, 0.0);
    glEnd();
    glutSwapBuffers();
}

void MyTimer(int Value) {
    if (Delta < 2.0f)
        Delta = Delta + 0.01;
    else {
        Delta = 0.0;
        if (++Index >= 15) {
            Index = 0;
            glClear(GL_COLOR_BUFFER_BIT);
        }
    }
    glutPostRedisplay();
    glutTimerFunc(10, MyTimer, 1);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("OpenGL Timer Animation Sample");
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
    glutTimerFunc(10, MyTimer, 1);
    glutDisplayFunc(MyDisplay);
    glutMainLoop();
    return 0;
}

 

1. PALETTE : 16가지의 기본색

2. MyTimer() : 팔레트의 인덱스 값 변경 -> 다시 그리기 위해 glClear함수를 사용해 화면을 지움, glutTimerFunc의 첫 파라미터인 10은 10msec를 의미하고 콜백이 동일한 시간 간격으로 계속 일어나게 하기 위해 MyTimer함수 내부에 다시 선언해준다.

3. MyDisplay() : 색을 바꾸기 위해 인덱스 값을 사용하여 1을 기준으로 부동 소수로 바꿔주어야 함. -> glColor3f에서 색 지정 -> glBegin(GL_LINES)는 Delta 변수를 사용하여 선을 회전시키는 부분이다. 

 

실행 결과