我试图用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运算符为计算缓冲区提供步幅,尽管我添加了包装属性。
所以我的问题是,如何在没有硬编码的情况下获得结构的大小?谢谢。
答案 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
您不需要不安全的东西。