想象一下 GPU 无法直接渲染图像。想象一下,它只能渲染到特殊的帧缓冲区内存存储,这与常规图像内存完全分开。您无法直接与该帧缓冲区内存通信,也无法从中进行分配。但是,在渲染操作期间,您可以将图像中的数据复制到其中,将其中的数据读取到图像中,当然还可以渲染到该内部存储器。
现在想象一下,您的特殊帧缓冲区内存的大小是固定的,该大小小于您想要渲染到的整个帧缓冲区的大小(也许much更小)。为了能够渲染大于帧缓冲区内存的图像,您基本上必须多次执行这些目标的所有渲染命令。为了避免多次运行顶点处理,您需要一种方法来存储顶点处理阶段的输出。
此外,在生成渲染命令时,您需要了解如何分配帧缓冲区内存。如果渲染一幅 32-bpp 图像与渲染两幅图像,则可能需要以不同的方式划分帧缓冲区内存。您分配帧缓冲区内存的方式会影响片段着色器代码的工作方式。毕竟,在渲染操作期间,片段着色器可以直接访问该帧缓冲区渲染内存。
这是渲染通道模型的基本思想:渲染到大小不确定的特殊帧缓冲区内存。渲染通道系统复杂性的每个方面都基于此概念模型。
子通道是您准确确定当前要渲染哪些内容的部分。由于这会影响帧缓冲区内存排列,因此始终通过引用渲染通道的子通道来构建图形管道。类似地,要在子通道内执行的辅助命令缓冲区必须提供将在其中使用的子通道。
当渲染通道实例开始在队列上执行时,它(概念上)将我们打算渲染的附件图像复制到帧缓冲区渲染内存中。在渲染过程结束时,我们渲染的数据将被复制回附件图像。
在渲染通道实例的执行期间,附件图像的数据被认为是“不确定的”。虽然模型表示我们正在复制到帧缓冲区渲染内存中,但 Vulkan 并不希望强制实现在直接渲染到图像时实际复制内容。
因此,Vulkan 只是声明任何操作都无法访问用作附件的图像,except对于那些访问图像的人作为附件。例如,您无法将附件图像读取为纹理。但您可以将其作为输入附件进行阅读。
这是基于图块的渲染器工作方式的概念描述。这是作为 Vulkan 渲染通道架构基础的概念模型。渲染目标是不可访问的内存;它们是特殊的东西,只能通过特殊的方式访问。
您不能“仅”从 G 缓冲区读取,因为当您渲染到该 G 缓冲区时,它存在于特殊的帧缓冲区内存中isn't在图像中。