gpt4 book ai didi

c++ - OpenGL 多视口(viewport)和 gluPerspective()

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:00 25 4
gpt4 key购买 nike

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

请注意,我在等待响应时正在玩耍,我让它做我想做的事,但解决方案没有,因为请查看代码行,基本上我将视口(viewport)开始位置移动到 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);

最佳答案

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

关于c++ - OpenGL 多视口(viewport)和 gluPerspective(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4001671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com