如何在 HLSL 中处理 8 位字符数据?

WillWorkForPizza

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

似乎可以通过将数据视为一系列“uint”类型并使用位移、与运算等对其进行解包来传递数据,但这似乎会导致不必要的开销。什么是正确的方法?

WillWorkForPizza

我找到了两种方法来做到这一点,尽管它们都需要在 HLSL 中使用 int/uint 值,因为我还没有找到 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 位值,但至少它们对应于单个字符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在HLSL中获得纹理大小?

来自分类Dev

如何在C ++中处理大于8字节或大于20位的大整数数据

来自分类Dev

如何在Java 8中处理Currency?

来自分类Dev

如何在HLSL中呈现没有内插错误的球体贴图?

来自分类Dev

我如何在 HLSL 中设置没有噪声的纹理值的 UV 协调

来自分类Dev

如何在visual studio中多次编译hlsl着色器?

来自分类Dev

如何在python中处理重音字符?

来自分类Dev

HLSL中的流控制

来自分类Dev

如何在Angular中处理大数据

来自分类Dev

如何在Android中处理大数据?

来自分类Dev

如何在代码中建立或处理数据?

来自分类Dev

如何在使用中处理获取的数据

来自分类Dev

如何在Android中处理大数据?

来自分类Dev

如何在Swift中处理JSON数据

来自分类Dev

如何在javascript中处理json数据

来自分类Dev

如何在Koa中处理GET数据

来自分类Dev

如何处理带有UTF-8标记字符串的R包中的示例数据

来自分类Dev

如何在Angular 8中的JSON响应中访问数据?

来自分类Dev

如何在JSoup中打印UTF-8编码的字符

来自分类Dev

如何在Angular 8中检测文件的字符集?

来自分类Dev

如何在VIM中查看UTF-8 Unicode字符

来自分类Dev

如何在 ncurses 中打印 UTF-8 字符?

来自分类Dev

在Ruby中,如何处理PDF内容中的非UTF 8字符?

来自分类Dev

如何在wp8中更新数据文件

来自分类Dev

Coldfusion 8如何在cfscript标签中获取数据日志?

来自分类Dev

如何在Xcode8中“删除派生数据”?

来自分类Dev

Angular 8:如何在localStorage中过滤JSON数据

来自分类Dev

如何在Windows Phone 8中解析Json数据

来自分类Dev

如何在xml文件wp8中写入数据