Как работать с 8-битными символьными данными в HLSL?

Я конвертирую некоторый код OpenCL в DirectCompute, и мне нужно обработать 8-битные строки символов в вычислительном шейдере, но я не нахожу тип данных HLSL для «byte» или «char». OpenCL поддерживает тип «char», поэтому я ожидал эквивалент. Каков наилучший способ определения и доступа к данным?

Кажется, что данные можно передать, обрабатывая их как серию типов «uint» и распаковывая их с помощью битового сдвига, операции «И» и т. д., но похоже, что это вызовет ненужные накладные расходы. Каков правильный путь?


person WillWorkForPizza    schedule 16.07.2019    source источник


Ответы (1)


Я нашел два способа сделать это, хотя они оба требуют работы со значениями int/uint в HLSL, так как я не нашел 8-битный тип данных:

Вариант 1 — позволить «представлению» обрабатывать перевод:

  • Передайте исходные данные в виде буфера байтов/символов.
  • Установите для формата представления ресурсов шейдера (D3D11_SHADER_RESOURCE_VIEW_DESC.Format) значение DXGI_FORMAT_R8_UINT.
  • Определите тип данных HLSL как Buffer<uint>
  • Ссылайтесь на каждый байт, используя его байтовое смещение (т. е. рассматривайте его как буфер байтов, а не буфер uint). Каждому символу автоматически присваивается значение uint.

Вариант 2 состоит в том, чтобы рассматривать каждую 4-байтовую последовательность как uint, используя формат DXGI_FORMAT_R32_UINT, и вручную извлекать каждый символ, используя что-то вроде этого:

Buffer<uint> buffer;
uint offset = ...;    
uint ch1, ch2, ch3, ch4;
ch1 =  buffer[offset] >> 24;
ch2 = (buffer[offset] & 0x00ff0000) >> 16;
ch3 = (buffer[offset] & 0x0000ff00) >> 8;
ch4 = (buffer[offset] & 0x000000ff);

В любом случае вы в конечном итоге будете работать с 32-битными значениями, но, по крайней мере, они будут соответствовать отдельным символам.

person WillWorkForPizza    schedule 18.07.2019
comment
Мне это кажется правильным. Существуют также ByteAddressBuffers, но они имеют такое же ограничение детализации uint32. developer.download.nvidia.com/compute/ DevZone/docs/html/ - person fifoforlifo; 20.07.2019