c# - OpenGL (OpenTK) 中顶点表示的 C# 结构的大小是多少?
问题描述
目前我正在 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 或编译器建议的不安全块?
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# - 具有动态 groupBy 的动态对象列表
- php - 从 url 获取值并在 sql 查询中使用它
- javascript - AngularJS Socketio 工厂错误我无法修复
- php - PHP - mail() 函数在我的 localhost(127.0.0.1) 上不起作用
- c# - 何时以及如何使用 DataSource 而不是直接的 SqlConnection
- html - div 中的文本不适合
- javascript - 如何在ionic3中的内容滚动上隐藏页眉和页脚
- node.js - 将身份验证从 passport.js 传递给 puppeteer
- python - 在 RMarkdown html 文档中显示 python 绘图图
- javascript - 从 URL 显示 YouTube 视频