【问题标题】:Best way to send an array of textures to Metal将纹理数组发送到 Metal 的最佳方式
【发布时间】:2015-06-22 02:08:40
【问题描述】:

我有下面的着色器(为了长度和清晰度而删除了部分),并希望找到一种更好的方法来做到这一点。我想将一组大小可变的纹理发送到我的金属着色器。我将对顶点位置进行一些计算,然后找出要使用的纹理。

目前我只是硬编码了一些东西并使用了几个 if 语句,但这很难看(而且我猜速度不快)。有什么方法可以计算i,然后使用i 作为纹理下标(如tex[i].sample)?

// Current code - its ugly
fragment half4 SimpleTextureFragment(VertextOut inFrag [[stage_in]],
                                   texture2d<half>  tex0   [[ texture(0) ]]
                                   texture2d<half>  tex1   [[ texture(1) ]]
                                   texture2d<half>  tex2   [[ texture(2) ]]
                                   ...
                                   texture2d<half>  texN   [[ texture(N) ]]
                                     )
{
   constexpr sampler quad_sampler;
   int i = (Compute_Correct_Texture_to_Use);
   if(i==0)
   {
      half4 color = tex0.sample(quad_sampler, inFrag.tex_coord);
   }
   else if(i==1)
   {
      half4 color = tex1.sample(quad_sampler, inFrag.tex_coord);
   }
   ...
   else if(i==n)
   {
      half4 color = texN.sample(quad_sampler, inFrag.tex_coord);
   }
   return color;
}

【问题讨论】:

    标签: ios metal


    【解决方案1】:

    你是对的,你的方法不会很快。最好的情况是,着色器会有很多分支(这不好),更坏的情况是,着色器实际上会从所有纹理中采样,然后丢弃它不使用的结果(这会更慢)。

    这不是 GPU 处理得特别好的情况,因此我的建议是稍微重构您的方法,使其对 GPU 更友好。在不了解您在更高级别上所做的更多信息的情况下,我的第一个建议是考虑使用 2d 数组纹理

    2d 数组纹理本质上将 X 个 2D 纹理合并为一个带有 X 个切片的纹理。您只需将单个纹理传递给 Metal,您就可以完全按照您已经在做的那样计算从着色器中采样的切片,但是通过这种方法,您将摆脱所有“if”分支,只需要调用像这样采样一次:tex.sample( my_sampler, inFrag.tex_coord, i );

    如果您的纹理大小和格式都相同,那么这将很容易工作。您只需将每个 2D 纹理复制到数组纹理的切片中。如果您的纹理在大小或格式上不同,您可能需要通过拉伸一些纹理来解决这个问题,以使它们最终都具有相同的尺寸。

    请参阅此处获取文档:https://developer.apple.com/library/ios/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Mem-Obj/Mem-Obj.html#//apple_ref/doc/uid/TP40014221-CH4-SW10 (寻找“纹理切片”)

    也在这里:https://developer.apple.com/library/prerelease/ios/documentation/Metal/Reference/MTLTexture_Ref/index.html#//apple_ref/c/econst/MTLTextureType2DArray

    此处的金属着色器语言文档:https://developer.apple.com/library/ios/documentation/Metal/Reference/MetalShadingLanguageGuide/std-lib/std-lib.html#//apple_ref/doc/uid/TP40014364-CH5-SW17(查找“2D 纹理阵列”)

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 2019-06-11
      • 2018-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多