为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
SMILET 2021-06-29 13:59:02
我正在尝试使用 Unity 编写一个计算着色器,为体素地形生成网格数据(顶点、法线、UV)。因此,我有一个自定义结构定义如下:[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 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

sizeof除非您在unsafe上下文中,否则仅适用于预定义的类型。从参考sizeof:


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


所以把你的电话包装成unsafe这样:


int sizeOfVertexData;

unsafe

{

    sizeOfVertexData = sizeof(VertexData);

}

您还必须启用不安全代码。在 Unity 中,它显然是一个复选框。


查看完整回答
反对 回复 2021-07-11
?
慕标5832272

TA贡献1966条经验 获得超4个赞

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


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

你不需要不安全的东西。


查看完整回答
反对 回复 2021-07-11
  • 2 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信