2010-10-22 73 views
5

所以我想學習如何使用glViewport(),「多個時間」。下面是我的代碼,我試圖去關注其他的例子,但是它們或者與我正在做的事情無關的其他事情如此複雜,或者我不明白他們在做什麼。順便說一句,我用glut來管理我的窗口系統。所以我學習的最好方法是獲得一個簡單的例子,然後從中推斷出來。下面是我的一個簡單程序的代碼,它將屏幕分爲兩部分,繪製兩個相同的球體,當gluPerspective()對於兩個視圖端口都相同時,我無法弄清楚爲什麼右邊的球體會拉伸。請,如果你只能向我解釋我在代碼中做錯了什麼,那將會大大幫助。外部資源非常好,但我需要簡單,簡單的例子(不是內特羅賓遜的例子)。OpenGL多視口和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); 
    } 

請注意,我打轉轉,而我等待的迴應,我得到了它做我想要的東西,但解決的辦法是沒有,因爲,請參閱的代碼行,基本上我感動的視口開始位置的四分之一,而不是一半,我不再是兩分之一。

/* 
* THE SECOND VIEW PORT 
*/ 

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

回答

5

第二對參數glViewport是寬度高度,未結束的x/y位置。你的第二個glViewport應該是glViewport(width/2, 0, width/2, height)