【问题标题】:Equivalent of glColorMask in Metal for a kernel program?内核程序的Metal中的glColorMask等价物?
【发布时间】:2018-06-14 05:22:49
【问题描述】:

我正在尝试将我的 iOS 应用程序从 OpenGL 迁移到 Metal。在我的 OpenGL 代码中,我在很多地方都使用了 glColorMask(如果我只想写入选定的通道,例如只写入纹理的 Alpha 通道)。

在 Metal 中,对于渲染管线(虽然是顶点和片段着色器),MTLColorWriteMask 似乎等同于 glColorMask。我可以在通过 MTLRenderPipelineDescriptor 创建 MTLRenderPipelineState 时进行设置。

但我找不到用于计算管道的类似选项(通过内核函数)。每次写入输出纹理时,我总是需要写入所有通道(红色、绿色、蓝色和 alpha)。如果我想保留 alpha(或任何其他通道)并且只想修改颜色通道怎么办?我可以创建输出纹理的副本并将其用作输入之一并从中读取 alpha 以保留值,但这很昂贵。

【问题讨论】:

  • 而不是创建一个重复的纹理并将其作为另一个输入提供,似乎我可以在 acess::read_write 中使用输出纹理更多并从中读取 alpha 并将其写回输出纹理。这似乎有效,但不确定是否总是能保证有效。

标签: ios opengl-es interop metal


【解决方案1】:

计算机内存架构不喜欢只写入一些字节的数据。写入 4 个字节中的 1 个通常涉及将这四个字节读入缓存,修改缓存中的一个,然后将这四个字节写回内存。好吧,大多数计算机一次读取/写入 很多个字节超过 4 个字节,但你明白了。

帧缓冲区也会发生这种情况。如果您执行部分写入掩码,硬件仍将在该纹理上执行相当于读取/修改/写入的操作。它只是没有改变它读取的所有字节。

因此,您可以通过计算着色器执行相同的操作。读取 4 向量值,修改所需的通道,然后将其写回。只要读取和写入来自同一个着色器调用,就应该没有同步问题(假设没有其他调用试图读取/写入相同的位置,但如果是这种情况,无论如何你都会遇到问题)。

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    相关资源
    最近更新 更多