【问题标题】:Opengl: Viewport, clipping, matrixtmode confusionOpengl:视口、裁剪、矩阵模式混淆
【发布时间】:2012-05-08 13:33:26
【问题描述】:

我一直在学习计算机图形学,我对视口、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();
}

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

【问题讨论】:

    标签: c++ opengl graphics


    【解决方案1】:

    当您将立方体大小更改为 200 时,它的面会超出您在 glOrtho 调用中设置为 -50 和 50 的近剪裁平面和远剪裁平面。从技术上讲,您将看到内部立方体,但立方体的远端也在远剪裁平面之外,所以你看不到它的背面。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 2015-12-17
      • 2020-10-01
      • 2012-01-20
      • 2019-11-23
      相关资源
      最近更新 更多