Как передать переменное число MTLTextures во фрагментный шейдер? - PullRequest
0 голосов
/ 16 ноября 2018

Каков правильный синтаксис для передачи переменного числа 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 в правильном порядке в начале прохода рендеринга. Индекс текстуры передается из вершинного шейдера в фрагментный шейдер.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы должны рассмотреть текстуру массива вместо массива текстуры. То есть текстура с типом MTLTextureType2DArray. Вы используете свойство arrayLength дескриптора текстуры, чтобы указать, сколько двумерных срезов содержит текстура массива.

Чтобы заполнить текстуру, вы указываете, в какой фрагмент вы пишете, такими методами, как -replaceRegion:... или -copyFrom{Buffer,Texture}:...toTexture:....

В шейдере вы можете указать, какой элемент выбрать или прочитать, используя параметр array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...