Qt3D унифицированный массив int - PullRequest
1 голос
/ 27 апреля 2020

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

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

uniform int data[4];

Эта униформа будет обновляться очень часто (тысячи раз за кадр). Я использовал QParameter для униформы с одним значением. В документации говорится, что для регистрации QParameter имя униформы должно быть «data [0]». Какой-либо / самый быстрый способ установить единый массив? Данные для установки хранятся в массиве 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?

1 Ответ

0 голосов
/ 27 апреля 2020

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

uniform ivec4 data;

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

...