从场景中截取非常大的屏幕截图
Taking very large screenshot from scene
我想从我的 OpenGL 应用程序中截取非常大的屏幕截图,例如 20000x20000,以便打印在横幅上。首先,由于最大 GPU 纹理大小限制,我无法创建如此大的帧缓冲区。任何人都可以帮助我如何捕获不同块中的帧缓冲区?
正如您已经指出的那样,在多个通道中捕获它是可行的方法。在最简单的形式中,您可以使用多个通道,每个通道渲染场景的一部分。
要获得正确的图像子区域,您需要做的就是对顶点的 clip-space 位置应用另一个变换。这归结为 x
和 y
:
中的简单平移和缩放
当考虑剪辑的欧几里得解释时space - 归一化设备space - 观看体积由立方体[-1, 1] 在所有 3 个维度中。
要仅渲染该立方体的一个轴对齐的子区域,我们必须对其进行放大,以便只有该子区域适合 [-1,1] 区域,并且我们必须正确地平移它。
假设我们想把图像分成m
次n
个tiles的均匀网格,我们可以在渲染tile i
,j
时做如下变换:
将图块的左下角移到原点。该图块位置将在 (-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),因此只需使用 [=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 )
在大多数情况下,您可以简单地将该矩阵预乘到投影矩阵(或您使用的任何矩阵),而无需在渲染过程中更改任何其他内容。
我想从我的 OpenGL 应用程序中截取非常大的屏幕截图,例如 20000x20000,以便打印在横幅上。首先,由于最大 GPU 纹理大小限制,我无法创建如此大的帧缓冲区。任何人都可以帮助我如何捕获不同块中的帧缓冲区?
正如您已经指出的那样,在多个通道中捕获它是可行的方法。在最简单的形式中,您可以使用多个通道,每个通道渲染场景的一部分。
要获得正确的图像子区域,您需要做的就是对顶点的 clip-space 位置应用另一个变换。这归结为 x
和 y
:
当考虑剪辑的欧几里得解释时space - 归一化设备space - 观看体积由立方体[-1, 1] 在所有 3 个维度中。
要仅渲染该立方体的一个轴对齐的子区域,我们必须对其进行放大,以便只有该子区域适合 [-1,1] 区域,并且我们必须正确地平移它。
假设我们想把图像分成m
次n
个tiles的均匀网格,我们可以在渲染tile i
,j
时做如下变换:
将图块的左下角移到原点。该图块位置将在
(-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),因此只需使用 [=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 )
在大多数情况下,您可以简单地将该矩阵预乘到投影矩阵(或您使用的任何矩阵),而无需在渲染过程中更改任何其他内容。