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

标签 hlsl directcompute

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

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

最佳答案

我找到了两种方法来做到这一点,尽管它们都需要在 HLSL 中使用 int/uint 值,因为我还没有找到 8 位数据类型:

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

  • 将原始数据作为字节/字符缓冲区传递。
  • 将着色器资源 View 格式 (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 位值,但至少它们对应于单个字符。

    关于hlsl - 如何在 HLSL 中处理 8 位字符数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57048531/

    相关文章:

    c++ - 添加几何着色器会导致 “shader linkage error”

    c++ - HLSL 在代码中获取线程组数和线程数

    multithreading - GPU 上的线程和线程组

    gpgpu - GPU 和决定论

    c++ - DirectCompute 着色器数据输入/输出

    hlsl - 如何使用顶点缓冲区将计算着色器结果输入顶点着色器?

    shader - SetInputLayout、VertexShader 和 PixelShader 之间不匹配

    hlsl - 了解 ComputeShaders 中的 "sampler array index must be a literal expression"错误

    c++ - 如何取消绑定(bind) RenderTarget 纹理,以便它可以用作下一个 channel 的输入

    c++ - 为什么连续开始的 Dispatches 需要不同的时间?