我想从OpenGL中的应用程序中截取非常大的屏幕截图(如20000x20000),以便在横幅上进行打印。首先,由于最大的GPU纹理大小限制,我无法创建这么大的帧缓冲区。任何人都可以帮助我如何捕获不同块中的帧缓冲区?
如您已经提到的,多遍捕获是您的方法。以最简单的形式,您可以使用多个遍,每个遍渲染场景的一部分。
要获得适当的图像子区域,您需要做的就是对顶点的剪辑空间位置应用另一种变换。这归结为简单的翻译和定标x
和y
:
考虑剪辑空间-规范化的设备空间的欧洲风俗解释-观看空间在所有3个维度上均由立方体[-1,1]表示。
要仅渲染该立方体的与轴对齐的子区域,我们必须对其进行放大,以便仅该子区域适合[-1,1]区域,并且必须对其进行适当的平移。
假设我们希望将图像分割成的均匀网格m
倍n
瓷砖,瓷砖渲染时,我们可以做到以下几点转换i
,j
:
将图块的左下角移至原点。该图块位置将位于(-1 + 2*i/m, -1 + 2*j/n)
,因此我们必须使用取反的值进行翻译:
x' = x + 1 - 2*i/m
, y' = y + 1 - 2*j/n
这只是使最终翻译更容易的帮助步骤。
按因子m
并n
沿x和y方向缩放:
x'' = m * x' = x * m + m - 2*i
, y'' = y' * n = y * n + n - 2*j
现在,将图块对齐,使其左下角在原点处(仍然),右上中心在(2,2)处,因此只需将其平移回去,(-1, -1)
以使我们再次进入视图voulme:
x''' = x'' - 1 = x * m + m - 2*i - 1
, y''' = y'' - 1 = y * n + n - 2*j - 1
可以将其表示为简单的仿射变换矩阵:
( m 0 0 m - 2*i - 1)
( 0 n 0 n - 2*j - 1)
( 0 0 1 0 )
( 0 0 0 1 )
在大多数情况下,您可以将该矩阵简单地预乘到投影矩阵(或您使用的任何矩阵)上,而在渲染过程中无需更改任何其他内容。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句