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

时间:2018-11-16 19:28:30

标签: macos metal fragment-shader

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

此StackOverflow问题:"How to use texture2d_array array in metal?"提到了以下用途:

array<texture2d<half>, 5>

但是,这需要指定数组的大小。在Metal Shading Language Specification.pdf(第2.11节)中,他们还演示了这种类型。但是,它们也引用了array_ref,但我不清楚如何使用它,或者对于以下语句,是否甚至允许将它作为共享片段的参数类型使用:

  

“ array_ref类型不能作为参数传递给图形   和内核功能。”

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

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。这似乎对我有用,但是我做错了吗?


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

1 个答案:

答案 0 :(得分:0)

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

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

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