我正在将一些OpenCL代码转换为DirectCompute,并且需要在计算着色器中处理8位字符串,但找不到“字节”或“字符”的HLSL数据类型。 OpenCL支持“ char”类型,因此我期待有一个等效的类型。定义和访问数据的最佳方法是什么?
似乎可以通过将数据视为一系列“ uint”类型并使用位移,AND-ing等将其解包来传递数据,但这似乎会引起不必要的开销。正确的方法是什么?
答案 0 :(得分:1)
我找到了两种方法来执行此操作,尽管它们都需要使用HLSL中的int / uint值,因为我还没有找到8位数据类型:
选项1是让“视图”处理翻译:
Buffer<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位值,但至少它们对应于各个字符。