如何将可变数量的 MTLTextures 传递给片段着色器?

How to pass a variable number of MTLTextures to a fragment shader?

将可变数量的 MTLTexture 作为数组传递给片段着色器的正确语法是什么?

这个 Whosebug 问题: 提到使用:

array<texture2d<half>, 5>

但是,这需要指定数组的大小。在 Metal Shading Language Specification.pdf(第 2.11 节)中,他们也展示了这种类型。然而,他们也提到了 array_ref 但我不清楚如何使用它,或者是否允许它作为片段共享的参数类型给定这个声明:

"The array_ref type cannot be passed as an argument to graphics and kernel functions."

我目前正在做的只是将参数声明为:

fragment float4 fragmentShader(RasterizerData in [[ stage_in ]],
                               sampler s [[ sampler(0) ]],
                               const array<texture2d<half>, 128> textures [[ texture(0) ]]) {

  const half4 c = textures[in.textureIndex].sample(s, in.coords);
}

因为限制是 128 个片段纹理。在任何渲染过程中,我可能会使用 1..n 个纹理,其中我确保 n 不超过 128。这似乎对我有用,但我 做错了吗?


我的用例是绘制一个二维平面,该平面被细分为一堆图块。每个图块的内容都是根据预先计算的纹理索引从数组中的指定纹理中采样的。在渲染通道开始时以正确的顺序使用 setFragmentTexture:atIndex 设置纹理。纹理索引从顶点着色器传递到片段着色器。

您应该考虑数组纹理而不是纹理数组。即类型为MTLTextureType2DArray的贴图。您使用纹理描述符的 arrayLength 属性 来指定数组纹理包含多少个二维切片。

要填充纹理,您可以使用 -replaceRegion:...-copyFrom{Buffer,Texture}:...toTexture:... 等方法指定要写入的切片。

在着色器中,您可以使用 array 参数指定要采样或读取的元素。