GL.BufferSubData 使用 64 位构建时不正确

GL.BufferSubData working incorrectly with a 64bit build

我正在为我的体素游戏引擎使用 OpenTK。使用 x86 作为平台目标一切正常,但一旦我切换到 64 位构建,我的网格就会全部乱码。我将它缩小到 GL.BufferSubData - 只要我只为每个 VAO 上传一个大块网格(显然在位置 0),世界渲染就很好,但是一旦我添加更多网格(not 显然在位置 0)到 VAO 故障开始 - 对我来说,它看起来非常像新的网格覆盖以前上传的网格。

以下是我上传顶点、索引、rgbas 和索引的方法:

GL.BindBuffer(BufferTarget.ArrayBuffer, vao.xyzVboId);
GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)data.xyzOffset, sizeof(float) * data.XyzCount, data.xyz);

GL.BindBuffer(BufferTarget.ArrayBuffer, vao.uvVboId);
GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)data.uvOffset, sizeof(float) * data.UvCount, data.uv);

GL.BindBuffer(BufferTarget.ArrayBuffer, vao.rgbaVboId);
GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)data.rgbaOffset, sizeof(byte) * data.RgbaCount, data.rgba);

GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, vao.vboIdIndex);

GL.BufferSubData(BufferTarget.ElementArrayBuffer, (IntPtr)data.indicesOffset, sizeof(int) * data.indicesCount, data.indices);
GL.BindBuffer(BufferTarget.ElementArrayBuffer, 0);

我在内部跟踪数量数据(vertexPosition、indexPosition)并根据插入的顶点和索引的数量设置 xyzOffset、uvOffset、rgbaOffset 和 indicesOffset。

很明显我的偏移量有问题?但这怎么可能?

[编辑:] gDebugger 和查询 GL.GetError() 均未显示任何错误

[Edit2:] 这部分代码在过去几个月里 运行 非常稳定,所以我不怀疑任何与 64 位构建无关的错误

[Edit3:] 我如何初始化 VBO 的例子

GL.BufferData(BufferTarget.ArrayBuffer, xyzCount, IntPtr.Zero, BufferUsageHint.StaticDraw);

[Edit4:]如果我做任何奇异的不安全指针算法,我也梳理了我的代码,我找不到任何

[Edit5:] 截图:http://imgur.com/a/YnVYZ

[Edit6:] 这发生在我的集成 gpu (intel hd4000) 上,如果我告诉 nvidia 使用我的 GT630M,屏幕会闪烁很多次,我的游戏就会以某种方式强行退出。第一次发生时,nvidia 给了我错误信息 "To many errors"

事实证明这是由 2 个错误引起的

  • 删除网格时,我错误地设置了当前位置,我不知道为什么它在 32 位版本中没有显示

  • 我正在使用 MultiDrawElements 绘制网格,它在 OpenTK 中接受一个 int[] 数组作为索引开始。然而,该参数实际上是 "const GLvoid * const * indices" 类型 - 因此 OpenGL 似乎在 64 位上以 8 字节的增量对其进行迭代。我通过将 int[] 数组的大小加倍并将每个第二个位置留空来解决此问题。同时在 OpenTK 问题跟踪器上发布条目:https://github.com/opentk/opentk/issues/423

通过这两个修复,Intel HD4000 上的混乱绘图和 GT630m 上的闪烁都消失了。