2016-08-11 39 views
1

我使用OpenTK來處理我的體素遊戲引擎。一切工作正常使用x86作爲平臺的目標,但一旦我切換到64位構建我的網格都亂碼。我將其縮小到GL.BufferSubData--只要我每個VAO上傳一個塊網格(顯然位置0),世界呈現良好,但是一旦我添加更多網格(顯然,位置0處的而不是)到VAO的毛刺開始 - 對我來說,它看起來非常像新的網格覆蓋以前上傳的網格。GL.BufferSubData與64位版本不正確工作

這裏是我如何上傳我的頂點,索引,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(英特爾HD4000)發生的事情,如果我告訴NVIDIA用我的GT630M屏幕閃爍一堆的時間和我的比賽只是用力以某種方式退出。第一次發生NVIDIA給我的錯誤信息「錯誤很多,」

+0

在你初始化時,不應該是xyzCount * sizeof(float)嗎?另外,檢查你的代碼是否應該是sizeof(int)或類似的sizeof(IntPtr)。此外,計算偏移量的代碼會很有用,而且,您應該嘗試從nvidia驅動程序獲取一些控制檯輸出,它會在說出「太多錯誤」之前告訴您什麼是錯誤的。 – karyon

+0

非常感謝@karyon,你的要求,看看我如何計算我的偏移量,讓我學習我的代碼更多,並得出解決方案。 – Tyron

回答

0

事實證明它是由2條蟲子

  • 當取下網格當前位置是錯誤由我和我設置造成的不知道爲什麼它沒有在32位版本中顯示

  • 我正在使用MultiDrawElements繪製網格,OpenDK在索引啓動時需要一個int []數組。然而,參數實際上是「const GLvoid * const * indices」類型的 - 所以OpenGL似乎在64位上以8個字節爲增量迭代它。我通過加倍我的int []數組的大小並將每個第二個位置留空。還出具了OpenTK問題追蹤器條目:https://github.com/opentk/opentk/issues/423

與這兩個固定搞砸了英特爾HD4000和GT630M的閃爍消失了繪畫。