Opengl:视口,剪辑,matrixtmode混淆

时间:2012-04-27 19:34:42

标签: c++ opengl graphics

我一直在研究计算机图形学,我对视口,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)时,立方体消失了为什么? 如果我没有在显示功能结束时刷新,那么立方体也会消失,为什么? 当我使视口变小时,对象变小是否意味着对象坐标相对于视口而不是世界坐标?

1 个答案:

答案 0 :(得分:4)

当您将立方体大小更改为200时,其面将延伸到近距离和远距剪裁平面,您已在glOrtho调用-50和50中设置了这些平面。从技术上讲,您可以查看在立方体内部,但立方体的远侧也在远剪裁平面之外,因此您无法看到它的背面。

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

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