2

我正在尝试在我的窗口中创建两个视口:一个主全屏视图和一个位于左上角的较小视图。我已经查看了问题并查看了解决方案:我正在使用 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();
}
}
4

2 回答 2

3

Don't call glutSwapBuffers in renderscene. You call renderscene twice per frame (for i==0 and i==1), so you're drawing main screen, swap, draw minimap, swap, repeat.

You need to draw both main and minimap, and then swap.

Also don't bother calling glClearColor so many times, you only need to call it once at init.

于 2012-05-16T02:29:10.450 回答
0

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

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

第三个参数是 929 而不是我假设你想要的 .929

于 2012-05-16T00:59:53.457 回答