【问题标题】:Sending a byte[] to the GPU? [closed]向 GPU 发送一个字节 []? [关闭]
【发布时间】:2016-11-23 08:20:18
【问题描述】:

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

【问题讨论】:

  • 为什么我的反对票太多???有什么我错过的吗?
  • 你的问题并没有真正表明/你试图解决你的问题。 (我认为这就是原因)
  • 这个问题完全合法。想知道这么多反对票。
  • 我同意,公平的问题

标签: c# arrays unity3d gpgpu hlsl


【解决方案1】:

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

着色器代码:

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

在 C# 方面,您有一个与您的着色器对应的材质,我们将其命名为 mat,以及您的字节数组 bArr。此外,您必须创建一个 gpu 缓冲区,然后您可以将其绑定到您的着色器:ComputeBuffer dataBuf = new ComputeBuffer(bArr.Length, sizeof(int))

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

编辑

我想在我的计算着色器中有一个 StructuredBuffer

根据我的阅读,你不能。 HLSL 中没有 byte 数据类型(也没有 CG,这是 unity 使用的)。上面的示例是一个标准的顶点/片段着色器,对于使用计算着色器,我会在您的其他问题上向您推荐我的answer。根据您的需要进行扩充。正如我已经在评论中写的那样,如果您不想将 int 用于您的 byte 数据并因此浪费 24 位,您可以通过位移将 4 bytes 插入 1 int。使用4以上的shader模型(DX10.1之类的)时,shader中应该可以进行移位操作

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

//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;

【讨论】:

  • 我知道如何使用结构化缓冲区,也知道如何将整数发送到 GPU。我想知道如何将“字节”发送到 GPU @xyLe_
  • 在 HLSL 和 CG 中都没有 byte 数据类型(这是 unity 默认使用的)。在 CG 中你可以使用 char,但你不能只使用 int 吗?
  • 如果你真的拥有已用空间,那么只需将 4 个字节打包成 1 个 int 并使用位移
  • @None 我已经更新了我的答案
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-21
  • 2015-02-12
相关资源
最近更新 更多