【问题标题】:GL.BufferSubData working incorrectly with a 64bit buildGL.BufferSubData 在 64 位版本中无法正常工作
【发布时间】:2016-08-11 17:00:47
【问题描述】:

我将 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。

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

[编辑:] 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”

【问题讨论】:

  • 在你的初始化中,不应该是xyzCount * sizeof(float)吗?此外,检查您的代码是否有任何 sizeof(IntPtr) 应该是 sizeof(int) 或类似的东西。此外,您计算偏移量的代码会很有趣。此外,您应该尝试从您的 nvidia 驱动程序获取一些控制台输出,它应该在说“太多错误”之前告诉您出了什么问题。
  • 非常感谢@karyon,您要求查看我如何计算偏移量,这让我进一步研究了我的代码并找到了解决方案。

标签: c# opengl opentk


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2020-09-13
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多