gpt4 book ai didi

c++ - Opengl:视口(viewport)、裁剪、矩阵模式困惑

转载 作者:行者123 更新时间:2023-11-30 02:04:40 27 4
gpt4 key购买 nike

我一直在学习计算机图形学,我对视口(viewport)、gluortho 的作用以及何时使用 GL_MatrixMode 和 GL_Projection 感到很困惑。这是我写的一个让我感到困惑的示例代码。

void init()
{
glClearColor(1.0,1.0,1.0,1.0);//Background Color of Viewport
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-200,200,-200,200,-50,50);
glMatrixMode(GL_MODELVIEW);
}

void wheel()
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0.2,0.2);
glLoadIdentity();
glViewport(0,0,200,200);
glutSolidCube(100);
glFlush();
}
void main(int argc,char** argv)
{
glutInit(&argc,argv);
glutInitWindowSize(400,400);
glutInitWindowPosition(400,400);//Position from the top left corner
glutCreateWindow("Car");
init();

glutDisplayFunc(wheel);//Shape to draw
glutMainLoop();
}

当我将立方体的大小更改为 200 时,它会消失,为什么?那是因为它比 z 剪辑大吗?当我删除 glMatrixMode(GL_MODELVIEW) 时,立方体为什么会消失?如果我在显示函数结束时不刷新,立方体也会消失,为什么?当我缩小视口(viewport)时,对象变小是否意味着对象坐标是相对于视口(viewport)而不是世界坐标?

最佳答案

当您将立方体大小更改为 200 时,它的面会延伸到您在 glOrtho 调用中设置为 -50 和 50 的近端和远端裁剪平面之外。从技术上讲,您随后正在查看立​​方体的内部,但立方体的远侧也在远裁剪平面之外,因此您看不到它的背面。

删除将矩阵模式设置为 GL_MODELVIEW 的调用意味着您的 glLoadIdentity 调用在固定功能投影矩阵上运行(我很确定),因此立方体直接转换为标准化设备坐标, 它再次延伸到所有裁剪平面之外。

最后,glViewport 定义了您应该渲染到的缓冲区的大小,因此通常与您的屏幕大小相匹配。使其更小有效地使您的屏幕尺寸更小,但不会改变实际的 GLUT 窗口尺寸。用数学术语来说,它改变了片段从标准化设备坐标投影到屏幕坐标的方式。

关于c++ - Opengl:视口(viewport)、裁剪、矩阵模式困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10356784/

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