我正试图从我的iOS应用程序从OpenGL迁移到Metal。在我的OpenGL代码中,我在很多地方使用glColorMask(如果我只想写入选定的通道,例如只写到纹理的alpha通道)。
在Metal中,对于渲染管道(虽然顶点和片段着色器)看起来像MTLColorWriteMask相当于glColorMask。我可以在通过MTLRenderPipelineDescriptor创建MTLRenderPipelineState时进行设置。
但是我找不到计算管道的类似选项(通过内核函数)。每次写入输出纹理时,我总是需要写入所有通道(红色,绿色,蓝色和alpha)。如果我想保留alpha(或任何其他通道)并且只想修改颜色通道怎么办?我可以创建输出纹理的副本,并将其用作输入之一并从中读取alpha以保留值,但这很昂贵。
答案 0 :(得分:3)
计算机内存架构不像只写一些字节的数据。写入4个字节中的1个通常涉及将这4个字节读入缓存,在缓存中修改其中一个,然后将这4个字节写回内存。好吧,大多数计算机一次读/写一个 lot 超过4个字节,但你明白了。
这也发生在帧缓冲区。如果执行部分写掩码,硬件仍将在该纹理上执行相当于读/修改/写入的操作。它只是没有改变它读取的所有字节。
因此,您可以从计算着色器中执行相同的操作。读取4向量值,修改所需的通道,然后将其写回。只要读取和写入来自相同的着色器调用,就不应该存在同步问题(假设没有其他调用尝试读取/写入同一位置,但如果是这种情况,那么您将拥有问题无论如何)。