Могу ли я переосмыслить приведение в GLSL? - PullRequest
0 голосов
/ 03 мая 2018

В C ++ вы можете взять указатель на целое число без знака и привести его к указателю на целое число со знаком (reinterpret_cast).

unsigned int a = 200;
int b = *(reinterpret_cast<int *>(&a));

Мне нужно сохранить int, сгенерированный в шейдере, как unsigned int, чтобы записать его в текстуру с целым внутренним форматом без знака. Есть ли похожая альтернатива C ++ reinterpret_cast в GLSL?

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

В C ++ (до 20) целые числа со знаком и без знака разрешено представлять совершенно по-разному. C ++ не требует, чтобы целые числа со знаком были дополнением до двух; реализациям разрешено использовать одно дополнение или другое представление. Единственное требование, которое C ++ предъявляет к знаковым и беззнаковым, заключается в том, что возможно преобразование всех неотрицательных (или прерывистых) знаковых значений в беззнаковые.

И к вашему сведению: ваш код выдает UB за нарушение правила строгого алиасинга (доступ к объекту типа X через указатель на несвязанный объект типа Y). Хотя это несколько распространено в низкоуровневом коде, объектная модель C ++ на самом деле не позволяет этого. Но я отвлекся.

Я поднял все вещи со знаком-против-без знака, потому что GLSL на самом деле определяет представление целых чисел со знаком. В GLSL целое число со знаком является дополнением до двух. Вследствие этого GLSL может определять, как преобразование из всего диапазона значений без знака переходит к знаковым значениям и наоборот, просто сохраняя битовый шаблон значения.

И это именно то, что он делает. Поэтому вместо того, чтобы использовать литейную гимнастику, вы просто делаете преобразование без знака в подпись, так же, как если бы вы использовали метод с плавающей точкой в ​​подпись или что-то еще:

int i = ...
uint j = uint(i);

Это преобразование сохраняет битовый шаблон.

О, и C ++ 20, похоже, тоже получает на борту это .

0 голосов
/ 03 мая 2018

GLSL не поддерживает этот тип приведения (и вообще не поддерживает указатели). Вместо этого в GLSL вы создаете значения другого типа с синтаксисом в стиле конструктора:

int a = 5;    // set an int to a constant
uint b = uint(a);   // "cast" that int to a uint by constructing a uint from it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...