【问题标题】:OpenGL Multiple Viewports and gluPerspective()OpenGL 多个视口和 gluPerspective()
【发布时间】:2010-10-22 23:35:12
【问题描述】:

所以我正在尝试学习如何使用 glViewport(), "MULTIPLE TIMES"。下面是我的代码,我试图遵循其他示例,但它们要么与其他与我正在做的事情无关的事情如此复杂,要么我不明白他们在做什么。顺便说一句,我正在使用 glut 来管理我的窗口系统。所以对我来说最好的学习方法是自己运行一个简单的例子,然后从那里推断。下面是我的一个简单程序的代码,它将屏幕一分为二并绘制了两个相同的球体,我无法弄清楚为什么当 gluPerspective() 对于两个视口相同时右侧的球体会被拉伸。拜托,如果您能向我解释我在代码中做错了什么,那将有很大帮助。外部资源很棒,但我需要简单、简单的示例(不是 Nate Robinson 示例)。

GLfloat width = 800, height = 600, x_0 = 470, y_0 = 0;
int mainWindow;


    void resize(int w, int h){
         width=w;
         height=h;
    }

    void draw(void){
         glEnable(GL_SCISSOR_TEST);
         glClearDepth(1.0);
         glClearColor(0.0, 0.0, 0.0, 1.0);
         glEnable(GL_DEPTH_TEST);
         glEnable(GL_LIGHT0);
         glEnable(GL_LIGHTING);
         GLfloat color[4] = {1.0, 0.0, 0.0, 1.0};

         /*
          * LEFT VIEW PORT
          */
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glViewport(0, 0, (float)width/2 , height);
         gluPerspective(45, ((float)width/2)/(float)height, 1, 2000);
         glMatrixMode(GL_MODELVIEW);
         glScissor(0, 0, (float)width , height);
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         glLoadIdentity();
         gluLookAt( 0.0, 0.0, 50.0,
                    0.0, 0.0, 0.0,
                    0.0, 1.0, 0.0 );

         glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); 
         glPushMatrix();
         glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
         glutSolidSphere(10.0, 20, 40);
         glPopMatrix();
         glPopAttrib();

         /*
          * THE SECOND VIEW PORT
          */
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         glViewport((float)width/2, 0, width , height);
         gluPerspective(45, ((float)width)/2/((float)height), 1, 2000);
         glMatrixMode(GL_MODELVIEW);
         glScissor(((float)width/2), 0, width , height);
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         glLoadIdentity();
         gluLookAt( 0.0, 0.0, 50.0,
                    0.0, 0.0, 0.0,
                    0.0, 1.0, 0.0 );
         glPushAttrib(GL_LIGHTING_BIT | GL_CURRENT_BIT); 
         glPushMatrix();
         glMaterialfv(GL_FRONT, GL_DIFFUSE, color);
         glutSolidSphere(10.0, 20, 40);
         glPopMatrix();
         glPopAttrib();

         glDisable(GL_SCISSOR_TEST);
         glFlush();
         glutSwapBuffers();
    }

    void glutAppInitialize(void){
         GLfloat light_ambient[] = {0.2, 0.2, 0.2, 1.0};
         GLfloat light_diffuse[] = {1.0, 1.0, 1.0, 1.0};
         GLfloat light_specular[] = {1.0, 1.0, 1.0, 1.0};
         GLfloat light_position[] = {1.0, 1.0, 0.0, 0.0};
         glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
         glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
         glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
         glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    }

    int main(int argc, char* argv[]){
         glutInit(&argc, argv);
         glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
         glutInitWindowPosition(x_0, y_0);
         glutInitWindowSize(width ,height);
         glutAppInitialize();
         mainWindow = glutCreateWindow("Tori App");
         glutDisplayFunc(draw);  
         glutReshapeFunc(resize);
         glutMainLoop();
         return(0);
    }

请注意,我在等待响应时正在玩耍,我让它做我想做的事,但解决方案没有,因为请查看代码行,基本上我将视口开始位置移动到 1/屏幕的 4 而不是一半,我不再在 gluperspective 上除以 2。

/*
 *  THE SECOND VIEW PORT
 */

    glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(width/4, 0, width , height);
gluPerspective(45, ((float)width)/(((float)height)), 1, 2000);

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    glViewport 的第二对参数是 widthheight,而不是结束的 x/y 位置。你的第二个 glViewport 应该是glViewport(width/2, 0, width/2, height)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      • 2013-12-29
      相关资源
      最近更新 更多