无内存纹理是否可与多个 MTLRenderCommandEncoder 一起使用?例如(理论上)我创建命令编码器 #1 和无内存纹理 #1 并将其用作渲染目标,然后创建命令编码器 #2 和无内存纹理 #2 作为渲染目标,但使用纹理 #1 作为片段着色器中的参数(读只能访问)。这行得通吗?
最佳答案
简短回答:不,这行不通。您必须在单个渲染命令编码器中完成此操作。
我猜测您想要读取渲染编码器 #2 中的整个纹理的内容,这在基于图 block 的 Apple GPU 上是不可能的(唯一运行 Metal 且实际上支持无内存渲染目标的 GPU)。如果您想读取当前图 block 内容之外的任何内容,则必须将附件存储到系统内存中,这就是基于图 block 的延迟渲染器的工作原理。欲了解更多信息,请参阅this talk以及其他有关图 block 着色器和游戏优化的 WWDC 讨论。
长答案:在渲染编码器的末尾,Metal必须执行您通过MTLRenderPassDescriptor
传递的选择的存储操作。它必须这样做的原因是,存在大量内部同步,包括栅栏和屏障,确保下一个实际使用前一个编码器的附件作为渲染目标或采样纹理的编码器可以读取那里写入的任何内容。
希望这能回答您的问题。
关于swift - 具有多个命令编码器的无内存纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65410247/