向 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;
我正在使用 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;