我正在将一些 OpenCL 代码转换为 DirectCompute,需要在计算着色器中处理 8 位字符串,但找不到"字节"或"字符"的 HLSL 数据类型。OpenCL 支持"char"类型,所以我期待一个等效的。定义和访问数据的最佳方式是什么?
似乎可以通过将其视为一系列"uint"类型并使用位移、AND-ing 等将其解压缩来传递数据,但这似乎会导致不必要的开销。正确的方法是什么?
我找到了两种方法,尽管它们都需要在 HLSL 中使用 int/uint 值,因为我还没有找到 8 位数据类型:
选项 1 是让"视图"处理翻译:
- 将原始数据作为字节/字符缓冲区传递。
- 设置着色器资源视图格式 (D3D11_SHADER_RESOURCE_VIEW_DESC。格式(到DXGI_FORMAT_R8_UINT
- 将 HLSL 数据类型定义为
Buffer<uint>
- 使用字节偏移量引用每个字节(即,将其视为字节缓冲区而不是 uint 缓冲区(。每个角色都是自动提升为 uint 值。
选项 2 是使用格式 DXGI_FORMAT_R32_UINT 将每个 4 字节序列视为 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 位值,但至少它们对应于单个字符。