Универсальный целочисленный массив Qt3D

я пытаюсь реализовать шейдер с однородным массивом int в Qt3D (C++, а не qml):

Униформа GLSL определяется следующим образом:

uniform int data[4];

Эта униформа будет обновляться очень часто (тысячи раз за кадр). Я использовал QParameter для униформ с одним значением. В документации указано, что имя униформы должно быть "data[0]" для регистрации QParameter. Какой/самый быстрый способ установить единый массив? Устанавливаемые данные хранятся в массиве uint32_t[4].

Буду очень признателен за любую помощь!

С наилучшими пожеланиями

Редактировать:

Спасибо за подсказку Rabbit76, поменял определение на ivec4. К сожалению, я до сих пор не знаю, как передать данные. Я пробовал что-то похожее на это

char data[4];
//*** set data to wanted values ***//
QByteArray dataArray;
dataArray.setRawData(data,4);
QParameter("data",dataArray, this); //*** this is a pointer to a subclassed QMaterial

но данные не установлены, и я получаю qWarning, например, например.

Unknown uniform type or value: QVariant(QByteArray, "\x80\xA7\x1D\x93;\x01\x00\x00\xDF\x88\x11\xA7\xFD\x7F\x00\x00") Please check your QParameters

для реальных данных.

Я попытался найти документацию и исходный код Qt3D, но не смог найти допустимый тип данных для передачи в аргумент QVariant. Есть ли возможность напрямую установить юниформ-переменную и обойти QVariant в QT3D?


person Florian Schnös    schedule 27.04.2020    source источник


Ответы (1)


Если размер массива равен 4, то я рекомендую использовать ivec4 вместо int[4].

uniform ivec4 data;

Доступ к элементам data можно получить с помощью синтаксиса массива (например, data[0]).

person Rabbid76    schedule 27.04.2020