Каков правильный синтаксис для передачи переменного числа MTLTexture в виде массива во фрагментный шейдер?
Этот вопрос StackOverflow: «Как использовать массив texture2d_array в металле?» упоминает использование:
array<texture2d<half>, 5>
Однако для этого необходимо указать размер массива. В Metal Shading Language Specification.pdf (Sec. 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
в правильном порядке в начале прохода рендеринга. Индекс текстуры передается из вершинного шейдера в фрагментный шейдер.