Каков правильный синтаксис для передачи переменного числа MTLTexture в виде массива фрагментному шейдеру?
В этом вопросе StackOverflow: «Как использовать массив texture2d_array в металле?» упоминается использование:
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. Похоже, это работает для меня, но я делаю это неправильно?
Мой вариант использования - это рисование двухмерной плоскости, которая разделена на несколько плиток. Содержимое каждой плитки выбирается из указанной текстуры в массиве на основе предварительно вычисленного индекса текстуры. Текстуры устанавливаются с помощью setFragmentTexture:atIndex
в правильном порядке в начале прохода рендеринга. Индекс текстуры передается из вершинного шейдера во фрагментный шейдер.