"GluOrtho2D"和"glViewport"之间的实际区别是什么?

3
我创建了一个窗口大小为800x600。我称其为:
gluOrtho2D(-400,400,-300,300);
glViewport(400,300,400,300);

我从(-100,-100)画了一条线到(100,100)。我认为我应该看到从(0,0)(100,100)的直线,但是我得到了整条线。这是为什么?

2个回答

10

理论上,glViewport不会造成任何裁剪(参见第10节)。通常情况下,所有绘制都被裁剪到窗口内。由于您已经要求OpenGL绘制到窗口的某个区域,因此您还需要告诉OpenGL在此视口之外剪辑坐标。为此,您需要使用glScissor。但是,一些实现确实将其绘图剪切到视口(有关详细信息,请参见我的注释)。

此外,您的计算错误了。您的投影矩阵宽度为800个单位,高度为600个单位,位于(0,0)处。然后将其映射到窗口的右上角400像素宽,300像素高的部分。

如果您从(-100,-100)到(100,100)画一条线,则仅跨越观看棱锥的一小部分。棱锥大小适合视口。

在图像中,蓝色框是窗口,红色框表示视口。黑色线应该是您画的线。

描述该段内容的图像。 http://img696.imageshack.us/img696/6541/opengl.png

希望对您有所帮助!


是的。这些东西一开始可能会很棘手。最终,你会发现它变得自然而然。 - Daniel Yankowsky
1
我一直在尝试证明glViewport不进行任何剪裁,但每次尝试时都会看到它进行剪裁。例如,从(0,3),(3,-3),(-3,3)绘制一个三角形。看到一个被剪裁的三角形。设置glViewport(windowWidth / 4,windowHeight,windowWidth / 2,windowHeigth / 2); 在显示器中央实际上看到相同的被剪裁的三角形。如果glViewport没有进行任何剪裁,我期望能看到更多的三角形,但我看不到。我错过了什么吗? - gman
你说对了,我在发布之前应该进行测试。至少在MacOS 10.7上的Chrome中的WebGL中,您设置的视口也用于剪裁片段。但这并不是保证的行为。请参见我的答案顶部的编辑。 - Daniel Yankowsky
对于“glScissor”的评论点赞。我已经搜索了一段时间关于它的信息。每个人都说“glScissor定义了一个剪切框”。 - Derek

0

glViewport描述了OpenGL绘制的窗口区域。 glOrtho或gluOrtho2D定义了一个单位系统(OpenGL单位),适合于通过glViewport定义的区域。 因此,您的线条将在视口中从-100, -100到100, 100绘制。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接