【发布时间】:2019-11-02 02:47:28
【问题描述】:
我正在尝试使用 Unity 编写一个计算着色器,为体素地形生成网格数据(顶点、法线、uvs)。因此,我有一个自定义结构定义如下:
[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 运算符来为计算缓冲区提供步幅,尽管我添加了打包属性。
所以我的问题是,如何在不进行硬编码的情况下获得结构的大小?谢谢。
【问题讨论】:
-
我相信 unity 有一个特定的辅助方法:
UnsafeUtility.SizeOf<T>()。要么这样,要么您必须使用 unsafe 标志进行编译才能使用 sizeof 运算符。 -
@mikez 那seems to be correct。这不应该是一个答案吗?
-
@CamiloTerevinto 我几乎不是统一的专家,所以这可能不是正确的方法。我在 google 上相对较快地找到了它,但是在他们的 github repo 中查看示例代码,他们几乎总是使用 sizeof 或 System.Runtime.InteropServices.Marshal.SizeOf。
-
有兴趣知道!谢谢。
-
我遇到了这个问题,我也在我的结构中使用
using System.Runtime.InteropServices;和public static int SizeOf = Marshal.SizeOf(typeof(MyStructType));。它正在编辑器中工作,尚未尝试构建。我也没有收到不安全的警告。考虑到我可以手动计算它,这似乎有点矫枉过正,但当我积极更改结构时,它对开发人员来说非常方便。