애니메이션
GLUT는 반복적인 처리가 필요할 때 주로 사용되는 타이머 이벤트도 제공한다.
void glutTimerFunc(unsigned int millis, void (*func)(int value), int value);
millis 후에 func함수를 호출하며 인수로 value를 전달한다.
value는 타이머 콜백으로 전달되어 작업거리를 지시하는데 타이머의 용도가 하나뿐이라면 아무값이나 주어도 상관은 없다.
콜백을 등록해 놓으면 millis 후에 콜백함수가 호출된다.
일반적인 타이머와는 다르게 주기적으로 호출되는게 아니라 딱 한번만 호출된다.
주기적으로 계속 호출하려면 콜백함수에서 자신을 계속 호출해야한다.
불편하긴 하지만, 호출될때마다 다음 주기를 가변적으로 설정할 수 있다는 점에서 활용성은 더 높다.
애니메이션을 할 때에는 더블버퍼링을 사용하는게 좋다.
버퍼 한개에서 지웠다 그렸다를 반복하면 깜빡임 현상이 발생하기 때문이다.
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
두 버퍼는 각각 전면(Front Buffer 또는 On Screen Buffer), 후면(Back Buffer 또는 Off Screen Buffer)이라고 부른다.
전면 버퍼 : 현재 화면에 출력되는 버퍼
후면 버퍼 : 안쪽에 숨겨진 버퍼
더블 버퍼링 : 그래픽카드에서 전면버퍼를 모니터에 뿌리지만 실제 그리기 동작은 후면버퍼에서 한다.
glutSwapBuffers();
백버퍼에 그림을 다 그렸으면, 전면버퍼와 통째로 교체한다.
전면버퍼와 후면버퍼가 일시에 교체됨으로써 백 버퍼에 미리 준비해둔 그림이 뿅하고 나타난닼ㅋㅋㅋㅋ
버퍼를 교체하는 것 자체가 출력이므로 glFlush(); 함수는 안써도 된다.
그람 삼각형을 좌우로 이동시켜볼까?
#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(30, DoTimer, 1); // 30밀리초 이후 실행
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(30, DoTimer, 1); // 30밀리초마다 호출
}
void DoDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
glVertex2f(x, size);
glVertex2f(x - size, -size);
glVertex2f(x + size, -size);
glEnd();
glutSwapBuffers();
}
결과화면은 삼각형이 좌우로 이동한다.
움직이는거라 따로 스크린샷이 의미없어 하지 않겠다.
'Graphics > OpenGL' 카테고리의 다른 글
glutGameModeString, EnterGameMode 등 (0) | 2014.05.27 |
---|---|
OpenGL 기초 - GLUT : Win32 예제 (0) | 2014.05.27 |
OpenGL 기초 - GLUT : 팝업메뉴 (0) | 2014.05.27 |
OpenGL 기초 - GLUT : 입력처리 (0) | 2014.05.27 |
OpenGL 기초 - GLUT (0) | 2014.05.19 |