在Metal中,colorAttachment[n]是什么?

9

我对图形技术一窍不通,现在需要使用Metal,不久会尝试使用OpenGL。

请问这个问题用通俗易懂的语言解释是什么意思?另外,“n”代表什么范围?在我制作的2D三角形中,我只将其设为0。

1个回答

23
一般来说,颜色附件是渲染图像(至少是暂时存储)的位置。通常只使用索引为0的一个颜色附件,所以你正在做的没问题。同时,也可以同时渲染到多个颜色附件,这就是为什么有一个数组的原因。这是一种高级技术,直到你看到需要它时才需要担心,此时应该很容易知道如何做。
在Metal中,colorAttachments[n]出现在两个地方。首先是在MTLRenderPipelineDescriptor中。另一个是在MTLRenderPassDescriptor中。
在这两种情况下,范围都在Metal Implementation Limits表格中给出,在“渲染目标”部分中,行标签为“每个渲染通过描述符的最大颜色渲染目标数”。
对于MTLRenderPipelineDescriptorcolorAttachments[n]是一个指向MTLRenderPipelineColorAttachmentDescriptor的引用。在此处,您配置像素格式、写掩码和颜色混合操作。
对于MTLRenderPassDescriptorcolorAttachments[n]是一个指向MTLRenderPassColorAttachmentDescriptor的引用。这是MTLRenderPassAttachmentDescriptor的子类,该类定义了大部分属性。在此处,您可以配置要呈现到哪个纹理的哪个部分,当渲染通道开始和结束时该纹理的数据应该发生什么变化,以及如果需要清除,则应将其清除为什么颜色。

关于颜色附件的信息根据更改的成本分布在这两个对象之间。渲染管线状态对象从管线描述符中创建比较昂贵。通常情况下,您会在运行时创建所有的管线状态对象,并在应用程序的整个生命周期内重复使用它们。

相比之下,您会经常从渲染通道描述符中创建渲染命令编码器;至少每帧一次。它们的创建成本相对较低,因此您可以更改描述符并创建一个新的描述符以在其他地方进行渲染。

渲染管线状态的颜色附件像素格式必须与渲染命令编码器的颜色附件纹理的像素格式匹配。


谢谢您的投诉,我有另一个问题,关于清除操作和存储操作,如果GPU正在工作,则每帧生成图像,因此数据将始终覆盖colorAttachment,我是对的吗?那么,clear actionstore action如何工作? - krosshj
通常情况下,每个渲染通道都应该配置一个不同的渲染目标(颜色附着纹理)。如果您正在使用 MTKViewCAMetalLayer,这些对象会管理它们自己的可绘制/纹理池。您可以分别使用 currentDrawablenextDrawable 方法为给定的渲染通道获取其中一个。 - Ken Thomases

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接