GL.BufferSubData在64位构建时工作不正确

本文关键字:工作 不正确 构建 64位 BufferSubData GL | 更新日期: 2023-09-27 18:02:13

我使用OpenTK作为我的体素游戏引擎。使用x86作为平台目标时一切都很好,但是一旦我切换到64位构建,我的网格就都乱成一团了。我把它缩小到GL.BufferSubData -只要我在每个VAO上只上传一个块网格(显然在位置0),世界渲染得很好,但是一旦我添加更多的网格(不是在位置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相应插入的顶点和索引的数量。

所以显然我的偏移是错误的?但这怎么可能呢?

[Edit:] gDebugger和查询GL.GetError()都没有显示任何错误

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

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

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

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

[Edit5:]截图:https://i.stack.imgur.com/aFK9W.jpg

[Edit6:]这是发生在我的集成gpu(英特尔hd4000),如果我告诉英伟达使用我的GT630M的屏幕闪烁一堆时间,我的游戏只是强行退出某种方式。第一次发生这种情况时,nvidia给了我错误信息"To many errors"

GL.BufferSubData在64位构建时工作不正确

结果是由两个bug引起的

  • 当移除网格时,当前位置被我错误地设置,我不知道为什么它没有显示在32位构建

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

修复了在英特尔HD4000上混乱的绘图和GT630m上的闪烁。