【发布时间】: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,您要求查看我如何计算偏移量,这让我进一步研究了我的代码并找到了解决方案。