从场景拍摄非常大的截图

时间:2015-10-17 13:45:39

标签: opengl opengl-3 opengl-4

我想从我的应用程序中获取非常大的截图,如20000x20000,用于在横幅上打印。首先,由于最大的GPU纹理大小限制,我无法创建如此大的帧缓冲区。任何人都可以帮助我如何捕获不同块的帧缓冲区?

1 个答案:

答案 0 :(得分:3)

正如您已经指出的那样,在多次通过中捕获它是可行的方法。在最简单的形式中,您可以使用多个过程,每个过程渲染一部分场景。

要获得更合适的图像子区域,您需要做的就是将另一个变换应用于顶点的剪辑空间位置。这归结为xy中的简单翻译和缩放:

当考虑剪辑空间的euclidiean 解释 - 规范化的设备空间 - 观察体积在所有3个维度中由立方体[-1,1]表示。

要仅渲染该立方体的轴对齐子区域,我们必须将其放大,以便只有子区域适合[-1,1]区域,我们必须正确翻译它。

假设我们想要将图像划分为mn个图块的统一网格,我们可以在渲染图块ij时执行以下转换:< / p>

  1. 将图块的左下角移动到原点。该平铺位置将位于(-1 + 2*i/m, -1 + 2*j/n),因此我们必须使用否定值进行翻译:

    x' = x + 1 - 2*i/my' = y + 1 - 2*j/n

    这只是帮助您轻松完成最终翻译的一个辅助步骤。

  2. 按x和y方向按因子mn进行缩放:

    x'' = m * x' = x * m + m - 2*iy'' = y' * n = y * n + n - 2*j

  3. 瓷砖现在已对齐,使其左下角(仍然)位于原点,而右上角位于(2,2),因此只需将其翻译为{{1所以我们再次进入视图voulme:

    (-1, -1)x''' = x'' - 1 = x * m + m - 2*i - 1

  4. 这可以表示为简单的仿射变换矩阵:

    y''' = y'' - 1 = y * n + n - 2*j - 1

    在大多数情况下,您可以简单地将该矩阵预先乘以投影矩阵(或您使用的任何矩阵),并且在渲染过程中不必更改任何其他内容。