반응형
OpenGL에서 애니메이션을 처리하는 방법은 여러가지가 존재합니다.
Timer 콜백함수를 설정해 일정 시간마다 애니메이션을 수행시킬 수도 있고, Idle 콜백함수를 설정해 지속적으로 애니메이션을 수행할 수도 있습니다.
하지만 가장 중요한건 애니메이션을 출력하려면 싱글 버퍼가 아닌 더블 버퍼를 사용해야 한다는 것 인데요.
싱글 버퍼를 이용할 경우 지웠다 그렸다를 반복하는 과정인 애니메이션을 재생할 경우, 깜빡거리는 현상이 발생하기 때문입니다.
먼저 더블 버퍼를 설정하기 위해 다음 소스코드와 같이 메인함수를 구성합니다.
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 더블버퍼 사용
glutCreateWindow("OpenGL");
glutMainLoop();
return 0;
}
기존에는 glutInitDisplayMode(GLUT_RGBA)만을 사용했었는데 앞에 GLUT_DOUBLE라는 상수가 추가되었습니다.
더블 버퍼는 프론트 버퍼, 백 버퍼로 구성되며 각각 번갈아가며 그리고 지우고를 반복합니다.
싱글 버퍼링의 경우 glFlush() 함수를 통해 그려줬다면
더블 버퍼링을 통해 백 버퍼, 프론트 버퍼를 바꿔가며 그려주기 위해서 glutSwapBuffers()라는 함수를 사용합니다.
좌 우로 간단하게 삼각형이 움직여보는 애니메이션 예제를 통해 더블 버퍼링과 애니메이션에 대해 이해해 보시기 바랍니다!
#include <gl\glut.h>
void DoDisplay();
void DoTimer(int value);
const GLfloat size = 0.2;
GLfloat x;
GLfloat dx = 0.02;
int main()
{
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); // 더블버퍼 사용
glutCreateWindow("OpenGL");
glutDisplayFunc(DoDisplay);
glutTimerFunc(1, DoTimer, 1); // 1밀리초 이후 실행
glutMainLoop();
return 0;
}
void DoTimer(int value)
{
x += dx; // 0.02만큼 증가
if (x + size > 1 || x - size < -1) {
dx *= -1; // 1이나 -1이상 되면 곱하기 -1을 통해 반대방향으로 이동하도록 설정
}
glutPostRedisplay();
glutTimerFunc(1, DoTimer, 1); // 1 밀리세컨드 마다 호출, DoTimer 앞의 Value값으로 애니메이션이 재생되는 딜레이 설정 가능
}
void DoDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(x, size);
glVertex2f(x - size, -size);
glVertex2f(x + size, -size);
glEnd();
glutSwapBuffers();
}
다음 글에서는 투영 행렬에 대해 설명해보도록 하겠습니다. 읽어주셔서 감사합니다.
반응형
'개발 > OpenGL' 카테고리의 다른 글
프레임 버퍼 이미지 파일로 저장하기 (0) | 2019.10.16 |
---|---|
GLFW, GLEW, GLM을 사용하는 프로젝트 세팅하기 (0) | 2018.04.17 |
OpenGL 점,선 그리기 (1) | 2016.01.14 |
OpenGL 1.0 시작하기 (0) | 2015.12.30 |