2010-10-22 7 views
5

So versuche ich zu lernen, wie man glViewport(), "mehrere Male" verwenden. Unten ist mein Code, ich habe versucht, anderen Beispielen zu folgen, aber sie sind entweder so verschachtelt mit anderen Dingen, die für das, was ich tue, nicht relevant sind, oder ich verstehe nicht, was sie tun. Übrigens benutze ich eine Flut, um mein Fenstersystem zu verwalten. Der beste Weg für mich zu lernen, ist ein einfaches Beispiel, das für mich selbst läuft, und dann von dort zu extrapolieren. Unten ist mein Code für ein einfaches Programm, das den Bildschirm in zwei teilt und zwei identische Sphären zeichnet. Ich kann nicht herausfinden, warum die Sphäre auf der rechten Seite gestreckt wird, wenn gluPerspective() für beide View-Ports identisch ist. Bitte, wenn Sie mir einfach erklären könnten, was ich in meinem Code falsch mache, würde es sehr helfen. Externe Ressourcen sind großartig, aber ich brauche einfache, einfache Beispiele (nicht Nate Robinson Beispiele).OpenGL mehrere Viewports und gluPerspective()

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); 
    } 

Bitte beachte, dass ich um mich zu spielen, während ich auf eine Antwort warten, habe ich es zu tun, was ich wollte, aber die Lösung ist nicht da, bitte die Codezeilen sehen, im Grunde zog ich die Ansicht Ports starten Position auf 1/4 des Bildschirms statt auf der Hälfte und ich bin nicht mehr geteilt durch zwei auf Gluperspektive.

/* 
* THE SECOND VIEW PORT 
*/ 

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

Antwort

5

Das zweite Paar von Argumenten glViewport sind Breite und Höhe , nicht die Endung x/y-Position. Ihr zweiter glViewport sollte glViewport(width/2, 0, width/2, height)

sein