用于计算着色器步幅的sizeof自定义结构

时间:2018-05-29 21:43:07

标签: c# unity3d

我试图用Unity编写一个计算着色器,为一个体素地形生成网格数据(顶点,法线,紫外线)。因此,我有一个定义如下的自定义结构:

[StructLayout(LayoutKind.Sequential, Pack = 0)]
private struct VertexData
{
    public Vector3 position;

    public Vector3 normal;

    public Vector2 uv;
}

然后,我按如下方式为ComputeShader创建ComputeBuffer:

vecterDataCBuf = new ComputeBuffer(ChunkSize * ChunkSize * ChunkSize, sizeof(VertexData));

我收到CS0233错误,表明我无法在自定义结构上使用sizeof运算符为计算缓冲区提供步幅,尽管我添加了包装属性。

所以我的问题是,如何在没有硬编码的情况下获得结构的大小?谢谢。

2 个答案:

答案 0 :(得分:2)

sizeof仅适用于预定义类型,除非您处于unsafe上下文中。 From the reference on sizeof

  

下表显示了用于替换sizeof表达式的常量值,这些表达式具有某些内置类型作为操作数。 [...]对于所有其他类型,包括结构,sizeof运算符只能用于不安全的代码块。

请将您的来电换成unsafe,如:

int sizeOfVertexData;
unsafe
{
    sizeOfVertexData = sizeof(VertexData);
}

您还必须启用不安全的代码。 In Unity it's apparently a checkbox

答案 1 :(得分:1)

您可以通过添加每个属性的大小来计算结构的总大小。

Vector3等效于3个浮点数。 Vector2等于2个浮点数。

//int stride  = sizeof(position) + sizeof(normal) + sizeof(uv)
//int stride  = sizeof(Vector3) + sizeof(Vector3) + sizeof(Vector2)
int stride = sizeof(float) * 3 + sizeof(float) * 3 + sizeof(float) * 2

您不需要不安全的东西。