2016-11-23 21 views
-5

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

+0

为什么我得到太多的低票?有什么我错过了吗? – None

+0

你的问题并没有真正表明/你试图解决你的问题。 (我想这就是为什么) – TheDjentleman

回答

1

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

shader代码:

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

在C#的一面,你必须对应于您的着色器材料,让我们把它叫做mat,和你的字节数组bArr。此外,你必须创建一个gpu缓冲区,然后你可以绑定到你的着色器:ComputeBuffer dataBuf = new ComputeBuffer(bArr.Length, sizeof(int))

最后,加载您的阵列到GPU dataBuf.SetData(bArr)和缓冲绑定到你的shader mat.SetBuffer("_Data", dataBuf);

编辑

我想在我的计算着色器StructuredBuffer <字节>。

从我读过的,你不能。 HLSL中没有byte数据类型(也就是CG,这是统一使用的)。上面的例子是一个标准的顶点/片段着色器,为了使用计算着色器,我会在您的其他问题上将您引用到我的answer。将其扩展到您的需求。正如我已经写了评论,如果你不想为你的byte数据使用int并因此浪费24位,你可以通过位移将4 bytes打到1 int。当使用高于4的着色器模型(DX10.1或某物)时,移位操作应该在着色器中可用

+0

我知道如何使用结构化缓冲区,并且我知道如何将ints发送到GPU。我想知道如何发送“字节”到GPU @xyLe_ – None

+0

在HLSL和CG中都没有'byte'数据类型(这是默认情况下统一使用的)。在CG中你可以用'char'去,但是你不能只用'int'去吗? – TheDjentleman

+0

如果你真的拥有已使用的空间,那么只需将4个字节装入1个int并使用位移 – TheDjentleman