我正在尝试在窗口中创建两个视口:主要的全屏视图和左上角的较小视图。我已经查看了问题并查看了解决方案:我正在使用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();
}
}
答案 0 :(得分:2)
不要在renderscene中调用glutSwapBuffers。你每帧调用renderscene两次(对于i == 0和i == 1),所以你正在绘制主屏幕,交换,绘制小地图,交换,重复。
您需要绘制主要和小地图,然后交换。
也不要打扰多次调用glClearColor,你只需要在init调用一次。
答案 1 :(得分:0)
不确定它是否有助于解决您的闪烁问题,但我注意到您已写过:
glClearColor(.392,.584,929,0.0f);
第三个参数是929而不是我想要的,.929