【发布时间】:2018-11-16 19:28:30
【问题描述】:
将可变数量的 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 以正确的顺序设置。纹理索引从顶点着色器传递到片段着色器。
【问题讨论】:
标签: macos metal fragment-shader