如何在HLSL中使用8位char数据?

时间:2019-07-16 00:10:11

标签: hlsl directcompute

我正在将一些OpenCL代码转换为DirectCompute,并且需要在计算着色器中处理8位字符串,但找不到“字节”或“字符”的HLSL数据类型。 OpenCL支持“ char”类型,因此我期待有一个等效的类型。定义和访问数据的最佳方法是什么?

似乎可以通过将数据视为一系列“ uint”类型并使用位移,AND-ing等将其解包来传递数据,但这似乎会引起不必要的开销。正确的方法是什么?

1 个答案:

答案 0 :(得分:1)

我找到了两种方法来执行此操作,尽管它们都需要使用HLSL中的int / uint值,因为我还没有找到8位数据类型:

选项1是让“视图”处理翻译:

  • 将原始数据作为字节/字符缓冲区传递。
  • 将“着色器资源视图”格式(D3D11_SHADER_RESOURCE_VIEW_DESC.Format)设置为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位值,但至少它们对应于各个字符。