2010-10-22 43 views
5

Vì vậy, tôi đang cố gắng tìm hiểu cách sử dụng glViewport(), "MULTIPLE TIMES". Dưới đây là mã của tôi, tôi đã cố gắng làm theo những ví dụ khác, nhưng chúng quá phức tạp với những thứ khác không liên quan đến những gì tôi đang làm hoặc, tôi không hiểu họ đang làm gì. Bằng cách này tôi đang sử dụng glut để quản lý hệ thống cửa sổ của tôi. Vì vậy, cách tốt nhất cho tôi để tìm hiểu là để có được một ví dụ đơn giản chạy cho bản thân mình, sau đó ngoại suy từ đó. Dưới đây là mã của tôi cho một chương trình đơn giản chia màn hình thành hai và vẽ hai hình cầu giống hệt nhau, tôi không thể tìm ra lý do tại sao quả cầu bên phải bị kéo giãn khi gluPerspective() giống hệt nhau cho cả hai cổng xem. Xin vui lòng, nếu bạn chỉ có thể giải thích cho tôi những gì tôi đang làm sai trong mã của tôi nó sẽ giúp rất nhiều. Tài nguyên bên ngoài rất tuyệt, nhưng tôi cần những ví dụ đơn giản, đơn giản (không phải ví dụ của Nate Robinson).OpenGL Multiple Viewports và 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); 
    } 

Lưu ý rằng tôi đang chơi xung quanh trong khi tôi chờ đợi một phản ứng, tôi đã nhận nó làm những gì tôi muốn, nhưng các giải pháp làm cho không có từ đó, xin vui lòng xem dòng mã, về cơ bản tôi chuyển các cổng xem bắt đầu vị trí đến 1/4 của màn hình thay vì một nửa và tôi không còn chia cho hai trên gluperspective.

/* 
* THE SECOND VIEW PORT 
*/ 

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

Trả lời

5

Cặp thứ hai của đối số cho glViewport là rộngchiều cao, không phải là kết thúc x/y vị trí. GlViewport thứ hai của bạn phải là glViewport(width/2, 0, width/2, height)