从场景中截取非常大的屏幕截图

Taking very large screenshot from scene

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

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

要获得正确的图像子区域,您需要做的就是对顶点的 clip-space 位置应用另一个变换。这归结为 xy:

中的简单平移和缩放

当考虑剪辑的欧几里得解释时space - 归一化设备space - 观看体积由立方体[-1, 1] 在所有 3 个维度中。

要仅渲染该立方体的一个轴对齐的子区域,我们必须对其进行放大,以便只有该子区域适合 [-1,1] 区域,并且我们必须正确地平移它。

假设我们想把图像分成mn个tiles的均匀网格,我们可以在渲染tile i,j时做如下变换:

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

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

    这只是使最终翻译更容易的辅助步骤。

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

    x'' = m * x' = x * m + m - 2*i, y'' = y' * n = y * n + n - 2*j

  3. 图块现在已对齐,左下角(仍)位于原点,右上角中心位于 (2,2),因此只需使用 [=24 将其平移回来=] 这样我们就可以再次进入 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     )

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