OpenGL上的多个视口

时间:2012-06-22 18:00:24

标签: c++ opengl viewport

我正在尝试制作赛车游戏,而且我在屏幕上显示多个视口时遇到问题。我希望在屏幕的右下角放一个小的“迷你地图”(这实际上是与主摄像机场景不同的视图)但是为什么,第二个视口才会出现,我只能看到的是主摄像机的视图。

以下是我的代码:

    void mainRender() {
        updateState();

        setViewport(0, windowWidth, 0, windowHeight);
        setWindow();
        renderScene();


        setViewport(0, windowWidth, 0, windowHeight/2);
        renderScene();
        gluLookAt(0,88,0,
                  1 ,0 ,0,
                  0.0,1.0,0.0);



        Sleep(30);
    }

    void setWindow() {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(45.0f,(GLfloat)windowWidth/(GLfloat)windowHeight,0.1f, 100.0f);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(posX,posY + 0.025 * std::abs(sin(headPosAux*PI/180)),posZ,
        posX + sin(roty*PI/180),posY + 0.025 * std::abs(sin(headPosAux*PI/180)) + cos(rotx*PI/180),posZ -cos(roty*PI/180),
        0.0,1.0,0.0);

    }

    void setViewport(GLint left, GLint right, GLint bottom, GLint top){
        glViewport(left, bottom, right - left, top - bottom);
     }


    int main(int argc, char **argv) {
        glutInit(&argc, argv);
        glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA | GLUT_DEPTH);
        glutInitWindowSize(windowWidth,windowHeight);
        glutInitWindowPosition(windowXPos,windowYPos);

        /**
        Store main window id so that glui can send it redisplay events
        */
        mainWindowId = glutCreateWindow("TF");

        glutDisplayFunc(mainRender);

        glutReshapeFunc(onWindowReshape);

        /**
        Register keyboard events handlers
        */
        glutKeyboardFunc(onKeyDown);
        glutKeyboardUpFunc(onKeyUp);



        mainInit();

        glutMainLoop();

        return 0;
    }

2 个答案:

答案 0 :(得分:3)

  

我没有在第二个视口中绘制,我只是改变了相机的位置,所以它可以从向上看到地图,它看起来像一个小地图(这就是我使用lookAt函数)。

我认为你对opengl的运作方式有一些严重的误解。只是改变gluLookAt将不会做任何事情。如果要从不同角度查看场景,则必须在更改视口后重绘整个场景。如果要显示小地图,则应正常绘制整个场景,将视口设置为小地图,设置高架相机,然后再次绘制整个场景。

答案 1 :(得分:1)

您需要开始使用glGetError

你的函数的左右参数混淆了。你左边是宽度/ 2,右边是0.这样会产生负宽度,从而产生错误。你的身高也看起来很消极。