Quindi sto cercando di imparare come usare glViewport(), "MULTIPLE TIMES". Di seguito è il mio codice, ho cercato di seguire altri esempi, ma sono così contorti con altre cose non rilevanti per quello che sto facendo o, non capisco cosa stanno facendo. Dal modo in cui sto usando glut per gestire il mio sistema di finestre. Quindi il modo migliore per imparare è di dare un esempio semplice a me stesso, quindi estrapolare da lì. Di seguito è riportato il mio codice per un semplice programma che divide lo schermo in due e disegna due sfere identiche, non riesco a capire perché la sfera sulla destra viene allungata quando gluPerspective() è identico per entrambe le porte di visualizzazione. Per favore, se solo potessi spiegarmi cosa sto facendo male nel mio codice, sarebbe di grande aiuto. Le risorse esterne sono grandi, ma ho bisogno di esempi semplici e semplici (non esempi di Nate Robinson).OpenGL Multiple Viewports e 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);
}
Nota che sto giocando intorno mentre aspetto una risposta, ho ottenuto di fare quello che volevo, ma la soluzione non fa in quanto, si prega di vedere le linee di codice, in pratica ho spostato le porte vista iniziale posiziona a 1/4 dello schermo invece che a metà e non divido più per due in gluperspective.
/*
* THE SECOND VIEW PORT
*/
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(width/4, 0, width , height);
gluPerspective(45, ((float)width)/(((float)height)), 1, 2000);