Как я могу кодировать четыре неподписанных байта (0-255) в число с плавающей запятой и обратно, используя HLSL? - PullRequest
3 голосов
/ 23 мая 2010

Передо мной стоит задача, когда одному из моих шейдеров hlsl требуется несколько поисков текстуры на пиксель. Мои 2d текстуры зафиксированы на 256 * 256, поэтому двух байтов должно быть достаточно для адресации любого данного текселя с учетом этого ограничения. Моя идея состоит в том, чтобы поместить две xy-координаты в каждое число с плавающей точкой, давая мне восемь xy-координат в пиксельном пространстве, когда они упакованы в изображение формата Vector4. Эти восемь координат затем используются для выборки другой текстуры.

Причиной этого является сохранение графической памяти и попытка оптимизировать время обработки, поскольку тогда мне не требуется многократный поиск текстур.

Кстати: кто-нибудь знает, медленнее ли кодирование / декодирование 16 байтов из / до 4 с плавающей запятой с использованием 1 выборки по сравнению с 4 выборками с некодированными данными?


Редактировать: Это для Модель шейдера 3

1 Ответ

1 голос
/ 23 мая 2010

Если вы нацеливаетесь на SM 4.0-SM 5.0, вы можете использовать Binary Casts и Bitwise operations:

uint4 myUInt4 = asuint(myFloat4);

uint x0 = myUInt4.x & 0x000000FF; //extract two xy-coordinates (x0,y0), (x1,y1)
uint y0 = (myUInt4.x & 0x0000FF00) >> 8;
uint x1 = (myUInt4.x & 0x00FF0000) >> 16;
uint y1 = (myUInt4.x & 0xFF000000) >> 24;

//repeat operation for .y .z and .w coordinates

Для предыдущих моделей шейдеров, я думаю, что это может быть сложнее, поскольку это зависит от точности FP.

...