代码之家  ›  专栏  ›  技术社区  ›  Virus721

用于计算明暗器步幅的自定义结构的sizeof

  •  1
  • Virus721  · 技术社区  · 8 年前

    我正在尝试编写一个带有Unity的计算明暗器,它为体素地形生成网格数据(顶点、法线、UV)。因此,我有一个自定义结构定义如下:

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

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

    我得到的CS0233错误表明,尽管添加了packaging属性,但我不能在自定义结构上使用sizeof运算符来为计算缓冲区提供步幅。

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

    1 回复  |  直到 8 年前
        1
  •  2
  •   Joe Sewell    8 年前

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

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

    所以把你的电话包起来 不安全的 像:

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

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

        2
  •  0
  •   Zoe - Save the data dump 张群峰    6 年前
    public Vector3 position -> sizeof(float) * 3
    
    public Vector3 normal-> sizeof(float) * 3
    
    public Vector2 uv -> sizeof(float) * 2
    
    stride = sizeof(float) * 8
    

    不需要不安全的东西