Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# GL.BufferSubData在64位构建中工作不正常_C#_Opengl_Opentk - Fatal编程技术网

C# GL.BufferSubData在64位构建中工作不正常

C# GL.BufferSubData在64位构建中工作不正常,c#,opengl,opentk,C#,Opengl,Opentk,我正在使用OpenTK作为我的体素游戏引擎。使用x86作为平台目标,一切都很好,但一旦我切换到64位构建,我的网格就会乱七八糟。我将其缩小到GL.BufferSubData-只要我每个VAO只上载一个块网格(显然在位置0处),世界就会渲染得很好,但只要我向VAO添加更多网格(显然在位置0处不),就会出现小故障-对我来说,新网格看起来很像是覆盖了以前上载的网格 以下是我上传顶点、索引、RGBA和索引的方式: GL.BindBuffer(BufferTarget.ArrayBuffer, vao.x

我正在使用OpenTK作为我的体素游戏引擎。使用x86作为平台目标,一切都很好,但一旦我切换到64位构建,我的网格就会乱七八糟。我将其缩小到GL.BufferSubData-只要我每个VAO只上载一个块网格(显然在位置0处),世界就会渲染得很好,但只要我向VAO添加更多网格(显然在位置0处不),就会出现小故障-对我来说,新网格看起来很像是覆盖了以前上载的网格

以下是我上传顶点、索引、RGBA和索引的方式:

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);
在内部,我跟踪数量数据(顶点显示、索引显示),并根据插入顶点和索引的数量设置xyzOffset、uvOffset、rgbaOffset和INDICEOSOFFSET

所以很明显我的补偿有点错误?但这怎么可能呢

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

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

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

GL.BufferData(BufferTarget.ArrayBuffer, xyzCount, IntPtr.Zero, BufferUsageHint.StaticDraw);
[Edit4:]如果我做了任何不安全的指针算法,我也会仔细检查我的代码,但我找不到任何

[Edit5:]屏幕截图:


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

,因为它是由两个错误引起的

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

  • 我使用multidrawerelements绘制网格,在OpenTK中,multidrawerelements采用int[]数组作为索引开始。然而,该参数实际上是“const GLvoid*const*index”类型的,因此OpenGL似乎以8字节的增量在64位上对其进行迭代。我通过将int[]数组的大小增加一倍,并将第二个位置留空来解决问题。此外,OpenTK问题跟踪程序上的问题条目:


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

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

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

  • 我使用multidrawerelements绘制网格,在OpenTK中,multidrawerelements采用int[]数组作为索引开始。然而,该参数实际上是“const GLvoid*const*index”类型的,因此OpenGL似乎以8字节的增量在64位上对其进行迭代。我通过将int[]数组的大小增加一倍,并将第二个位置留空来解决问题。此外,OpenTK问题跟踪程序上的问题条目:


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

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