我想从我的应用程序中获取非常大的截图,如20000x20000,用于在横幅上打印。首先,由于最大的GPU纹理大小限制,我无法创建如此大的帧缓冲区。任何人都可以帮助我如何捕获不同块的帧缓冲区?
答案 0 :(得分:3)
正如您已经指出的那样,在多次通过中捕获它是可行的方法。在最简单的形式中,您可以使用多个过程,每个过程渲染一部分场景。
要获得更合适的图像子区域,您需要做的就是将另一个变换应用于顶点的剪辑空间位置。这归结为x
和y
中的简单翻译和缩放:
当考虑剪辑空间的euclidiean 解释 - 规范化的设备空间 - 观察体积在所有3个维度中由立方体[-1,1]表示。
要仅渲染该立方体的轴对齐子区域,我们必须将其放大,以便只有子区域适合[-1,1]区域,我们必须正确翻译它。
假设我们想要将图像划分为m
次n
个图块的统一网格,我们可以在渲染图块i
,j
时执行以下转换:< / p>
将图块的左下角移动到原点。该平铺位置将位于(-1 + 2*i/m, -1 + 2*j/n)
,因此我们必须使用否定值进行翻译:
x' = x + 1 - 2*i/m
,
y' = y + 1 - 2*j/n
这只是帮助您轻松完成最终翻译的一个辅助步骤。
按x和y方向按因子m
和n
进行缩放:
x'' = m * x' = x * m + m - 2*i
,
y'' = y' * n = y * n + n - 2*j
瓷砖现在已对齐,使其左下角(仍然)位于原点,而右上角位于(2,2),因此只需将其翻译为{{1所以我们再次进入视图voulme:
(-1, -1)
,
x''' = x'' - 1 = x * m + m - 2*i - 1
这可以表示为简单的仿射变换矩阵:
y''' = y'' - 1 = y * n + n - 2*j - 1
在大多数情况下,您可以简单地将该矩阵预先乘以投影矩阵(或您使用的任何矩阵),并且在渲染过程中不必更改任何其他内容。