向 GPU 发送一个 byte[]?

Sending a byte[] to the GPU?

我正在使用 unity,我想使用 HLSL 将字节数组发送到 GPU。我知道 ByteAddressBuffer,但我不知道如何使用它。我有点只想知道如何将 "byte"s 发送到 GPU。我想在我的计算着色器中有一个 StructuredBuffer<byte>

对于着色器部分,您可以使用StructuredBuffer。我不知道 HLSL 中是否有字节数据类型,所以我在这个例子中只使用整数。

着色器代码:

Shader "Name" {
    SubShader {
        ...
        StructuredBuffer<int> _Data;
        ...
    }
}

在 C# 端,您有一个 Material 对应于您的着色器,我们称它为 mat 和您的字节数组 bArr。此外,您必须创建一个 gpu 缓冲区,然后您可以将其绑定到您的着色器:ComputeBuffer dataBuf = new ComputeBuffer(bArr.Length, sizeof(int)).

最后,将数组加载到 gpu dataBuf.SetData(bArr) 并将缓冲区绑定到着色器 mat.SetBuffer("_Data", dataBuf);

编辑

I want to have a StructuredBuffer<byte> in my compute shader.

据我所知,你不能。 HLSL 中没有 byte 数据类型(也没有 CG,这是统一使用的)。上面的示例是一个标准的 vertex/fragment 着色器,对于使用计算着色器,我建议您参考我的 关于您的其他问题。根据您的需要增强它。正如我已经在评论中写的那样,如果您不想将 int 用于您的 byte 数据并因此浪费 24 位,您可以将 4 bytes 打入 1 int 与移位。当使用 4 以上的着色器模型(DX10.1 或其他)时,着色器中应该可以进行移位操作

如何执行此操作的示例如下:

//encoding on the cpu

int myInt = 0;
myInt += (int)myByte1;
myInt += (int)(myByte2 << 8);
myInt += (int)(myByte3 << 16);
myInt += (int)(myByte4 << 24);

//decoding on the gpu

myByte1 = myInt & 0xFF;
myByte2 = (myInt >> 8) & 0xFF;
myByte3 = (myInt >> 16) & 0xFF;
myByte4 = (myInt >> 24) & 0xFF;