将可变数量的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
以正确的顺序设置纹理。纹理索引从顶点着色器传递到片段着色器。
答案 0 :(得分:0)
您应该考虑使用阵列纹理而不是纹理阵列。即,类型为MTLTextureType2DArray
的纹理。您可以使用纹理描述符的arrayLength
属性来指定数组纹理包含多少个二维切片。
要填充纹理,请使用-replaceRegion:...
或-copyFrom{Buffer,Texture}:...toTexture:...
之类的方法指定要写入的切片。
在着色器中,您可以使用array
参数指定要采样或读取的元素。