c# - 什么是 OpenGL (OpenTK) 中顶点表示的 C# 结构的大小?

标签 c# opengl struct sizeof vertex-buffer

目前我正在 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 数组上传到 GPU 的 ColoredVertex.Size 可能会导致错误的数据解释,因为 CLR 可能决定对结构数组使用不同的包装,我对吗?

那么通知 OpenGL 关于顶点布局的最佳方式是什么? 使用 Marshal.sizeof 或编译器建议的不安全 block ?

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) 中顶点表示的 C# 结构的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52335166/

相关文章:

c# - FormsAuthentication.SetAuthCookie 在 MVC 5 中没有 [Authorize]

c# - 序列化为 XML 并压缩结果 - 如何添加 XML 文件类型?

c++ - 使用动态长度的字符串初始化具有 char 数组成员的结构

c - 在结构指针中引用结构指针

c# - 创建快捷方式修改目标路径

C# 透明背景与 GTK#

c++ - 如何确定更新图形驱动程序后缺少 OpenGL 入口点的原因

c++ - glCreateShader失败并返回0

c++ - OpenGL 红皮书 - LoadShaders 坏了?

c - 只将一个基本字段封装到 C 中的结构中有什么好处?