여러 보조창에 렌더링하기

시작하기 전에 우리가 정의한 콜백함수들을 기억해 봅시다.:

  • 휴면(idle) 함수 - renderSceneAll

  • 메인창의 렌러링함수 - renderScene

  • subwindow1 창의 렌더링함수 - renderScenesw1

  • subwindow2 창의 렌더링함수 - renderScenesw2

  • subwindow3 창의 렌더링함수 - renderScenesw3

각 창들의 렌더링 함수를 살펴보는 것으로 이번 장을 시작하겠습니다. 메인창은 보조창들로 가려져 있기 때문에 검은색으로만 렌더링합니다. 이 예제에서는 여러개의 창을 가지고 있기 때문에 적절한 창의 식별값으로 glutSetWindow 함수를 호출해야합니다. 그 다음 색상버퍼를 기본색인 검은색으로 깨끗이 지웁니다.

void renderScene()
{
    glutSetWindow(mainWindow);
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

각각의 보조창을 위한 렌더링 함수를 만들어야하는데 이 예제에서는 모든 창에 그리는 지형은 같고 시점이나 카메라의 위치만 다릅니다.

지형을 그리는 함수는 renderScene2 함수입니다. 하지만 이 함수를 호출하기 전에 우리는 반드시 특정 보조창을 현재창으로 설정하고 MODELVIEW 행렬을 초기화하기 위해서 단위행렬로 만들고 카메라를 gluLookAt 함수를 사용해서 설정해야 합니다.

다음 변수는 아래에 있는 코드에 나오는데 각각의 의미를 알아봅시다. :

  • x,y,z : 월드내에서 현재 위치의 좌표입니다.

  • lx,ly,lz : 시선을 정의하는 벡터입니다.

  • deltaMove, deltaAngle, angle : 카메라 이동을 정의냅니다.

보조창에 관한 첫 장에서 우리는 세 개의 보조창을 만들었습니다. 그 세 개의 보조창은 같은 장면을 서로 다르게 투시합니다. 첫번째 보조창은 현재 시점으로 장면으로 투시하고 두번째는 장면을 위에서 보는 것으로 투시합니다. 그리고 세번째 보조창은 카메라처럼 현재 위치에서 오른쪽을 투시합니다.

다음 코드는 각각의 창들을 위한 렌더링 함수입니다. 이 코드는 앞에서 살펴본 코드를 확장한 것입니다. 이 코드에 대해서 더 깊이 알고 싶다면 " 키입력 예제 : 세상을 둘러 보아요~" , "비트맵폰트와 직교투영", "초당프레임수(FPS) 계산하기" 편을 다시 읽어보세요.

// main window
void renderScene()
{
    glutSetWindow(mainWindow);
    glClear(GL_COLOR_BUFFER_BIT);
    glutSwapBuffers();
}

// subwindow 1 - 카메라 = 현재위치
void renderScenesw1()
{
    glutSetWindow(subWindow1);
    glLoadIdentity();
    gluLookAt(x, y, z, x + lx,y + ly,z + lz, 0.0f,1.0f,0.0f);

    renderScene2(subWindow1);
}

// subwindow 2 - 위에서 투시
void renderScenesw2()
{
    glutSetWindow(subWindow2);
    glLoadIdentity();
    gluLookAt(x, y+15, z, x ,y - 1,z, lx,0,lz);
    renderScene2(subWindow2);
}

// subwindow 3 - 오른쪽에서 투시
void renderScenesw3()
{
    glutSetWindow(subWindow3);
    glLoadIdentity();
    gluLookAt(x-lz*10 , y, z+lx*10, x ,y ,z , 0.0f,1.0f,0.0f);
    renderScene2(subWindow3);
}

이제 남은 것은 휴면(idle)함수를 만드는 것입니다. 우리가 만드는 예제에서 이 함수는 renderSceneAll 함수입니다. 이 함수는 deltaMove 와 deltaAngle 변수가 0 이 아닌지 검사해서 현재 위치값과 시선 벡터를 업데이트합니다.

각 보조창의 렌더링 함수를 모두 호출한 다음에 메인창의 렌더링 함수는 호출하지 않는데 그 이유는 메인창은 항상 검은색 배경이므로 변하는 것이 전혀 없기 때문입니다.

void renderSceneAll()
{
    if (deltaMove)
        moveMeFlat(deltaMove);
    if (deltaAngle)
    {
        angle += deltaAngle;
        orientMe(angle);
    }
    renderScenesw1();
    renderScenesw2();
    renderScenesw3();
}

VC 프로젝트 파일을 받아서 자세하게 살펴보세요. 자 이제 GLUT 튜토리얼이 끝났습니다. 제안, 버그 그리고 요구사항 등 얼마든지 환영합니다. 이메일(antonio.ramires@lighthouse3d.com)을 보내주세요.

Last updated