我正在通过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扩展剪裁体积的高度?
答案 0 :(得分:2)
您需要注意OpenGL中有两个宽高比:
glViewport
glOrtho
设置)还是透视(由{{1设置)最常见的是,或glFrustum
。现在,为了将正方形渲染保持为正方形,两个纵横比需要匹配。调整窗口大小时,通过调用gluPerspective
指定投影变换的宽高比要么是显式的,就像调用glViewport( 0, 0, width, height );
时一样,因为它的第二个参数是视锥体的宽高比。但是,对于gluPerspective
或glOrtho
等来电,观看视锥体的纵横比由观看音量的宽度和高度控制。根据您提到的拼写案例(同样的讨论适用于透视投影),观看体积的宽度左 - 右,类似地,高度顶部 - 底部 ,这两个量的比例是观察量的纵横比。
现在,请记住我们需要两个宽高比才能匹配。我们不太可能修改视口,因为通常情况下你想要使用窗口中的所有像素,或者没有夹住物体的风险,所以我们不得不修改观察体积的纵横比以获得它们匹配。我们通过根据视口的宽高比修改查看体积的宽度或高度来实现这一点,这是您在所提供的代码中看到的。特别是,如果视口的宽高比大于1.0(即宽度大于高),那么我们需要使观看量更宽,这就是为什么我们将左和对等强>由纵横比。同样,如果视口的方面小于1.0,我们需要使查看量更高。在这种情况下,我们使用宽高比的倒数(大于1.0),为顶部和底部提供适当的缩放。