OpenGL:多个重叠视口闪烁

时间:2012-05-16 00:51:25

标签: c++ opengl viewport

我正在尝试在窗口中创建两个视口:主要的全屏视图和左上角的较小视图。我已经查看了问题并查看了解决方案:我正在使用glScissor()和glViewport(),清除我的深度缓冲区位,启用深度缓冲区位,并且只渲染一次(在for循环之后)。但显然,我错过了一些东西。这是我的代码。提前谢谢。

编辑: 链接到屏幕截图:http:// imgur [dot] com / a / sdoUy 基本上,左上方的迷你视口会闪烁,消失并很快再现。

void viewports() {
float width = wWidth;
float height = wHeight; 

for (int i = 0; i < 2; i++) {
    glClearColor(.392,.584,.929,0.0f);

    if (i == 0) {
        //main view
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
        glViewport(0,0,(GLsizei)width,(GLsizei)height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,(GLfloat)width/(GLfloat)height,1.0,100.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        keyOp();
        camera();
    } else if (i == 1) {
        glScissor(0,height - height/3,(GLsizei)height/3,(GLsizei)height/3);
        glEnable(GL_SCISSOR_TEST);
        glClear(GL_DEPTH_BUFFER_BIT);
        glViewport(0,height - height/3,(GLsizei)height/3,(GLsizei)height/3);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluPerspective(60,1,1.0,100.0);
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gluLookAt(0,40,-15,0,-1,-15,1,0,0);
        glDisable(GL_SCISSOR_TEST);
    }
    renderScene();
}
}

2 个答案:

答案 0 :(得分:2)

不要在renderscene中调用glutSwapBuffers。你每帧调用renderscene两次(对于i == 0和i == 1),所以你正在绘制主屏幕,交换,绘制小地图,交换,重复。

您需要绘制主要和小地图,然后交换。

也不要打扰多次调用glClearColor,你只需要在init调用一次。

答案 1 :(得分:0)

不确定它是否有助于解决您的闪烁问题,但我注意到您已写过:

glClearColor(.392,.584,929,0.0f);

第三个参数是929而不是我想要的,.929