openGL中glOrtho和glViewPort之间的区别[重复]
Posted
技术标签:
【中文标题】openGL中glOrtho和glViewPort之间的区别[重复]【英文标题】:the difference between glOrtho and glViewPort in openGL [duplicate] 【发布时间】:2014-07-02 18:19:26 【问题描述】:我正在努力找出一些东西,比如说我正在渲染一些高度为 100,宽度为 100 的图像。
在场景 A
当 glOrthois 定义为 (left,right,bottom,top,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 中,图像将被渲染到比它需要的更低的宽度和高度(即每两个像素渲染一次)。在原始图像中将映射到目标“表面”中的一个,但仍会看到整个图像。
然而,在场景 B 中,图像将被剪裁,因此只有左上角的四分之一可见。我对么? - 为了清楚起见,这是一个来自明天的 CG 测试的问题,我想确保我正确获得了 openGL...(已经阅读了 API...=\
)
【问题讨论】:
【参考方案1】:glViewPort 以屏幕像素为单位: 就是这样,它与显卡“内部”的 3D 世界无关。它只是告诉窗口的哪一部分将用于渲染(或者只是可见)。
glOrtho 而是改变了“内部”世界并且是 OpenGL 单位: 更多的 OpenGL 单元将适合屏幕的可见部分,因此如果您增加正交大小,“更大”的对象将很容易适合可见区域。
修改视口不会改变截锥体,实际上相同的图像只会被拉伸以适应新的视口。
解释性图片:
图一:视口是半个窗口
图片 2:如果我只是将视口加倍,图像就会被拉伸(相同的平截头体填充不同的表面)
因此,保持纵横比的唯一解决方案也是将正交尺寸加倍(在这种情况下,我将左右值加倍)
图 3: 最终结果(请注意,现在可以看到更大的 3d 世界):
更多详情请访问quite familiar site on OpenGL NeHe productions。
【讨论】:
【参考方案2】:这两件事会影响 GL 坐标转换管道的不同阶段。 OpenGL 使用视锥体,它在标准化设备空间中是沿所有 3 个维度在 [-1,1] 范围内的立方体。 glOrtho()
调用通常用于设置投影矩阵,它将眼睛空间坐标转换为剪辑空间。 GL 将在内部从剪辑空间转换为 NDC。在正交情况下,您甚至可以假设剪辑空间和 NDC 是同一件事。视口描述了从 NDC 到窗口空间的转换,这是光栅化发生的地方。
我说的对吗? - 为了清楚起见,这是一个来自 CG 测试的问题。 有明天,我想确保我正确获得了 openGL...
对于案例 A,您可能正确。在案例 B 中,可能看到 底部左四分之一。但实际上,如果没有提供进一步的信息,这个问题是无法回答的。您说图像的“宽度”和“高度”为 100。通常,这些尺寸被解释为每个方向上的像素数。但在这种情况下,这个问题似乎暗示着与图像一起纹理化的 quad 以这样一种方式呈现,即它最终会出现在从 (0,0) 到 (100,100) 的眼睛空间中) (通过直接将其用作对象坐标,或通过使用另一个模型和/或视图变换)。也没有指定图像是如何映射的,即它可以旋转(这使得无法确定在场景 B 中看到图像的哪个部分有任何合理的信心)。
另一件值得注意的事情是glOrtho()
将将当前矩阵乘以正交投影矩阵。因此,如果该矩阵的初始状态未知,则无法说出最终的变换将是什么。
我希望真正的测试不会包含这种指定错误的问题。
【讨论】:
以上是关于openGL中glOrtho和glViewPort之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章