什么是 OpenGL (OpenTK) 中顶点表示的 C# 结构的大小?
Whats the sizeof C# structs for vertex representation in OpenGL (OpenTK)?
目前我正在 C# 中试验 OpenGL(通过 OpenTK)。
我看了几个教程,经常发现,结构用于
描述一个顶点。
struct ColoredVertex
{
public const int Size = (3 + 4) * 4;
private readonly Vector3 position;
private readonly Color4 color;
public ColoredVertex(Vector3 position, Color4 color)
{
this.position = position;
this.color = color;
}
}
然后我问自己为什么他们不用C#的sizeof()函数
并注意到,由于打包等原因,它不适用于结构。
好的,但这不是问题吗?如果我的想法是正确的,使用 GL.BufferData 以 ColoredVertex.Size 的步长将 ColoredVertex 数组上传到 GPU 可能会导致错误的数据解释,因为 CLR 可能决定使用不同的包装结构数组,我说的对吗?
那么通知 OpenGL 关于顶点布局的最佳方式是什么?
使用 Marshal.sizeof 或编译器建议的不安全块?
CS0233 'Vec3' does not have a predefined size, therefore sizeof can
only be used in an unsafe context (consider using
System.Runtime.InteropServices.Marshal.SizeOf)
将 [StructLayout(LayoutKind.Explicit)]
属性应用于结构,然后将 [FieldOffset(n)]
应用于每个字段以将其定位在您选择的字节位置,n
。
这为您提供了对位置的细粒度控制,并且由于 C# 中基元类型的大小不依赖于平台(64 位与 32 位),它还告诉您大小和完整布局。
目前我正在 C# 中试验 OpenGL(通过 OpenTK)。 我看了几个教程,经常发现,结构用于 描述一个顶点。
struct ColoredVertex
{
public const int Size = (3 + 4) * 4;
private readonly Vector3 position;
private readonly Color4 color;
public ColoredVertex(Vector3 position, Color4 color)
{
this.position = position;
this.color = color;
}
}
然后我问自己为什么他们不用C#的sizeof()函数 并注意到,由于打包等原因,它不适用于结构。
好的,但这不是问题吗?如果我的想法是正确的,使用 GL.BufferData 以 ColoredVertex.Size 的步长将 ColoredVertex 数组上传到 GPU 可能会导致错误的数据解释,因为 CLR 可能决定使用不同的包装结构数组,我说的对吗?
那么通知 OpenGL 关于顶点布局的最佳方式是什么? 使用 Marshal.sizeof 或编译器建议的不安全块?
CS0233 'Vec3' does not have a predefined size, therefore sizeof can
only be used in an unsafe context (consider using
System.Runtime.InteropServices.Marshal.SizeOf)
将 [StructLayout(LayoutKind.Explicit)]
属性应用于结构,然后将 [FieldOffset(n)]
应用于每个字段以将其定位在您选择的字节位置,n
。
这为您提供了对位置的细粒度控制,并且由于 C# 中基元类型的大小不依赖于平台(64 位与 32 位),它还告诉您大小和完整布局。