1

我正在阅读 OpenGL SuperBible 第 4 版。有一个描述,在一个又高又薄的窗口中,如果视口与窗口的尺寸匹配,但它被映射到一个方形的裁剪体积,图像将显得扭曲(像视口一样高而薄)。

保持图像正方形的解决方案是以下代码:

// Establish clipping volume (left, right, bottom, top, near, far) 
aspectRatio = (GLfloat)w / (GLfloat)h; 
if (w <= h)       
    glOrtho (-100.0, 100.0, -100 / aspectRatio, 100.0 / aspectRatio, 1.0, -1.0);
else       
    glOrtho (-100.0 * aspectRatio, 100.0 * aspectRatio, -100.0, 100.0, 1.0, -1.0);

这段代码有一个解释,但我就是无法理解。为什么我们要根据 aspectRatio 来扩展裁剪体积的高度?

4

1 回答 1

2

OpenGL 中有两个纵横比需要注意:

  1. viewport的纵横比,在调用时指定glViewport
  2. 锥体的纵横比,通过投影变换指定,无论是正交(例如,由 设置glOrtho)还是透视(由 设置glFrustum,或gluPerspective最常见)。

现在,为了保持正方形渲染为正方形,两个纵横比需要匹配。当您调整窗口大小时,您通过调用隐式设置视口的纵横比glViewport( 0, 0, width, height );

指定投影变换的纵横比是显式的,就像调用 时一样gluPerspective,因为它的第二个参数是视锥体的纵横比。glOrtho但是,对于或之类的调用glFrustum,视锥体的纵横比由查看体积的宽度和高度控制。以您提到的正交情况为例(对于透视投影,同样的讨论也适用),此处查看体积的宽度right-left,同样,高度是top-bottom,这两个量的比率是查看体积的纵横比.

现在,请记住我们需要两个纵横比来匹配。我们不太可能修改视口,因为通常情况下您想使用窗口中的所有像素,或者不冒被裁剪对象的风险,因此我们被迫修改查看体积的纵横比以获得它们匹配。我们通过根据视口的纵横比修改查看体积的宽度或高度来做到这一点,这就是您在提供的代码中看到的内容。特别是,如果视口的纵横比大于 1.0(即宽大于高),那么我们需要让我们的可视体积更宽,这就是为什么我们将左右相乘通过纵横比。同样,如果视口的纵横比小于 1.0,我们需要将查看体积调高。在这种情况下,我们使用纵横比的倒数(将大于 1.0),为topbottom提供适当的缩放。

于 2013-03-20T23:26:10.037 回答