지금까지 잘 따라오셨습니다. 우린 하얀색 삼각형이 있는 OpenGL 창을 만들어 보았지만 전혀 재미가 없었지요. 그렇지만 이제부터가 시작입니다.! 지금부터 삼각형을 살살 돌려보도록하죠 :)
우선 main 함수에 몇가지를 더 추가해줘야합니다. 첫째, GLUT 에 이중버퍼(double buffer)가 필요하다고 알려주는 것이죠. 이중버퍼는 부드러운 애니메이션을 만들기 위해서 꼭 필요한 것입니다. 이중버퍼는 후면버퍼(back buffer)에 그림을 다 그리고 나서 전면 버퍼(우리가 실제로 보는 장면, front buffer)로 교체하는데, 이렇게 해서 렌더링을 수행합니다. 이중버퍼는 장면의 깜빡임을 제거할 때도 사용합니다.
두번째로 설정해줘야할 것은 GLUT 에게 어플리케이션의 휴면(Idle) 시간에 렌더링 함수가 호출되도록 알려주는 것입니다. 이렇게 해주면 GLUT 가 계속해서 렌더링 함수를 호출하기 때문에 결과적으로 애니메이션이 만들어지는 것입니다. GLUT 는 glutIdleFunc 함수를 제공하는데 이 함수로 어플리케이션의 휴면(Idle) 시간에 호출될 콜백 함수를 등록할 수 있습니다.
voidglutIdleFunc(void (*func)(void)); 인자설명:func - 어플리케이션의 휴면(Idle) 시간에 호출될 함수의 이름입니다.
우리가 만들 예제는 어플리케이션의 휴면(idle) 시간에 호출되는 함수를 renderScene 함수로 설정하고 깊이 검사가 가능하도록 설정합니다. OpenGL 은 깊이 검사를 알아서 설정해 주지 않기 때문에 깊이 검사를 설정하지 않으면 물체가 그려질 때 앞뒤 순서가 맞지 않게 그려집니다. 다행인 것은 깊이 검사를 설정하는게 쉽다는 거죠. 아래의 main 함수처럼 설정해주면 됩니다.
이제는 렌더링 함수를 고쳐봅시다. 우선 각을 나타내는 float 형의 변수를 선언하고 0.0 으로 설정합니다. 그런 다음에 renderScene 함수에서 필요에 따라 값을 더해줍니다.
float angle=0.0;voidrenderScene(void){ // 깊이 버퍼를 깨끗이 지워야합니다. // 깊이 버퍼가 꽉차있으면 아무것도 그려지지 않기 때문이죠. // 아래는 깊이버퍼를 지워주는 코드입니다.glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 이전에 설정한 것들을 저장합니다. // 여기서는 카메라의 설정을 저장합니다.glPushMatrix(); // angle 변수값을 회전량으로 y 축(0, 1, 0)을 중심으로 회전변환을 수행합니다. glRotatef(angle,0.0,1.0,0.0);glBegin(GL_TRIANGLES);glVertex3f(-0.5,-0.5,0.0);glVertex3f(0.5,0.0,0.0);glVertex3f(0.0,0.5,0.0);glEnd(); // 모델링 변환을 마치고나서 // 카메라설정을 원래대로 돌려놓습니다.glPopMatrix(); // 위에서 그린것을 보여주기 위해서 버퍼를 교체합니다.glutSwapBuffers(); // 마지막으로 angle 변수에 1 을 더해줍니다. angle++;}
glutSwapBuffers 함수는 후면버퍼에 앞서 그린 것들을 보여주기 위해서 후면버퍼와 전면버퍼를 교환해줍니다. 함수원형은 아래와 같아요.:
voidglutSwapBuffers();
자 이제~ 회전하는 삼각형을 그리는 VC 프로젝트 파일을 받아서 실행해보세요. 정말 멋지지 않나요? 그렇지 않다구요? 이 강좌는 GLUT 를 배우는 것에 초점을 맞췄기에 화려한 예제가 없습니다. 그러니 불평하지 말아주세요 :)