2016-11-30 2 views
2

Я не могу найти никаких документов или примеров того, как получить длину массива в HLSL.Длина массива в HLSL?

Я нажимаю массив огней на hlsl-шейдер, и я хочу сделать for(int i=0; i<foo.length; i++) (- не правильный синтаксис).

Невозможно ли получить длину массива? Должен ли я нажимать целое число длины массива в hlsl-шейдер со стороны C++?

Кроме того, как я могу узнать, что является максимальным допустимым числом циклов, которое может быть у меня в моем шейдере? (Поскольку петли разворачиваются, должен быть предел.)

ответ

2

Насколько мне известно, вы должны объявить массивы с заданной длиной (Array syntax needs a positive integer as size). Если вы теперь заполняете этот фиксированный массив из extern произвольным количеством данных, HLSL не имеет никакого способа узнать об этом. Поэтому вам нужно передать длину массива в шейдер.

Loop не разворачиваются автоматически, если вы работаете с шейдерной моделью 3.0+ и не указываете до [unroll]. (doc)

При отсутствии атрибута не указано компилятор сначала попытается испускают свернутую версию цикла, и если это не удается, или если некоторые операции было бы проще, если цикл был развернут, будет падать обратно развернутая версия цикла.

Так есть нет максимально допустимого счетчика цикла, но в зависимости от использованной шейдерной модели, существует максимальная казнено число инструкций (wiki) и, кроме того есть сторожевые окна переустановки вашего графическое устройства, если это нужно больше, чем 2 секунды для рендеринга (doc), например с бесконечными циклами.

+0

Да, это имеет большой смысл. Массив hlsl не является структурой, которая магически содержит значение длины. В моем случае я отправлял ресурсы в шейдер с помощью Unreal Engine C++, что делает эти конкретные массивы «волшебными» и невидимыми в шейдерном коде. – Spectraljump

Смежные вопросы