openGL中glOrtho和glViewPort的区别

时间:2014-07-02 18:19:27

标签: opengl graphics 3d opengl-1.x

我正在努力找出一些东西,让我说我会渲染一些高度为100,宽度为100的图像。

在方案A

当glOrthois定义为(左,右,底部,顶部,zNear,zFar)并且定义了glViewPort时,我正在取glOrtho(0,100,0,100,-100,100)glViewPort(0,0,50,50) as(左下角x,左下角y,宽度,高度)。

在方案B中

我正在glOrtho(0,50,0,50,-100,100)glViewPort(0,0,100,100)glOrthois定义为(left,right,bottom,top,zNear,zFar)并定义glViewPort时 as(左下角x,左下角y,宽度,高度)

这基本上意味着在场景A中,图像将被渲染到比它需要的更低的宽度和高度(即每两个像素渲染一次)。在原始图像中将映射到目的地中的一个" surface"但仍然可以看到整个图像。

然而,在场景B中,图像将被剪裁,因此只能看到它的左上角。我对么? - 只是为了清楚,这是一个来自CG测试的问题我有一个tommorow并且我想确保我正确地获得了openGL ...(已经阅读了API ... =\

2 个答案:

答案 0 :(得分:25)

<强> glViewPort 是屏幕像素单位: 就是这样,它与你的显卡“内部”的3D世界无关。它只是告诉窗口的一部分将用于渲染(或只是可见)。

<强> glOrtho 相反,改变了“内部”世界,是OpenGL单位: 更多的OpenGL单元将适合屏幕的可见部分,因此如果增加正交尺寸,“更大”的对象将很容易进入可视区域。

修改视口不会改变平截头体,事实上,只需拉伸相同的图像以适应新的视口。

解释图片:

图片1:视口是半窗口

enter image description here

图片2:如果我只是将视口加倍,图像会变得拉伸(相同的平截头体会填充不同的表面)

enter image description here

因此保持纵横比的唯一解决方案是加倍正交尺寸(在这种情况下,我是左右两个值)

图片3:最终结果(请注意,现在可以看到3d世界的更大部分):

enter image description here

有关详细信息,请访问quite familiar site on OpenGL NeHe productions

答案 1 :(得分:1)

这两件事影响了GL的坐标转换管道的不同阶段。 OpenGL使用viweing视锥体,在规范化设备空间中是沿着所有3个维度在[-1,1]范围内的立方体。 glOrtho()调用通常用于设置投影矩阵,该矩阵将眼睛空间坐标转换为剪辑空间。 GL将在内部从剪辑空间转换为NDC。在正交情况下,您甚至可以假设剪辑空间和NDC是相同的。视口描述了从NDC到窗口空间的转换,这是光栅化发生的地方。

  

我说错了吗? - 只是要清楚,这是CG测试中的一个问题   有tommorow,我想确保我正确地得到openGL ...

对于案例A,你可能正确。在案例B中,可能 bootm 左边的四分之一。但实际上,如果没有给出进一步的信息,这个问题是无法回答的。你说图像有宽度&#34;和&#34;身高&#34;通常,这种尺寸被解释为每个方向上的像素数。但在这种情况下,这个问题似乎暗示着用图像纹理化的 quad 也会以这样一种方式呈现,即它会从(0,0)到(100,100)结束眼睛空间。 )(通过直接使用它作为对象坐标,或通过使用另一个mdoel和/或视图变换)。此外,没有说明图像是如何被映射的,即它可以被旋转(这使得无法确定情景B中哪个部分的图像具有任何合理的置信度。)

值得注意的另一件事是glOrtho()通过正交投影矩阵乘以当前矩阵。因此,如果该矩阵的初始状态未知,则无法确定所得到的变换将是什么。

我希望真正的测试不会包含这些不明确的问题。