保持方形剪裁体积方块,而不管opengl中的视口大小?

时间:2013-03-20 22:54:50

标签: opengl

我正在通过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扩展剪裁体积的高度?

1 个答案:

答案 0 :(得分:2)

您需要注意OpenGL中有两个宽高比:

  1. viewport 的宽高比,在您致电glViewport
  2. 时指定
  3. 查看视锥体的纵横比,它是通过投影变换指定的,无论是正交(例如,由glOrtho设置)还是透视(由{{1设置)最常见的是,或glFrustum
  4. 现在,为了将正方形渲染保持为正方形,两个纵横比需要匹配。调整窗口大小时,通过调用gluPerspective

    隐式设置视口的宽高比

    指定投影变换的宽高比要么是显式的,就像调用glViewport( 0, 0, width, height );时一样,因为它的第二个参数是视锥体的宽高比。但是,对于gluPerspectiveglOrtho等来电,观看视锥体的纵横比由观看音量的宽度和高度控制。根据您提到的拼写案例(同样的讨论适用于透视投影),观看体积的宽度左 - 右,类似地,高度顶部 - 底部 ,这两个量的比例是观察量的纵横比。

    现在,请记住我们需要两个宽高比才能匹配。我们不太可能修改视口,因为通常情况下你想要使用窗口中的所有像素,或者没有夹住物体的风险,所以我们不得不修改观察体积的纵横比以获得它们匹配。我们通过根据视口的宽高比修改查看体积的宽度或高度来实现这一点,这是您在所提供的代码中看到的。特别是,如果视口的宽高比大于1.0(即宽度大于高),那么我们需要使观看量更宽,这就是为什么我们将对等由纵横比。同样,如果视口的方面小于1.0,我们需要使查看量更高。在这种情况下,我们使用宽高比的倒数(大于1.0),为顶部底部提供适当的缩放。