2014-10-03 56 views
0

我開始將我的遊戲從iOS移植到Android,並且遇到了問題。將Java頂點對象的數組傳遞給OpenGL入口點

在我的標準的工作流在iOS上我會存儲我的頂點信息的結構數組:

typedef struct{ 
    float x, y, z; 
} Vector3; 

Vector3 verts[]; 

這種事情。

然後,當我將頂點數據發送給GL時,我只需指向verts數組,並將它視爲浮點數組。

glVertexAttribPointer(Vertex_POSITION, 3, GL_FLOAT, 0, 0, (void *)verts); 

如何在Java中執行此操作?

我試着製作一個Vector3類,並將其中的一些放入數組中,但當我嘗試將該數組填充到GL時,會引發錯誤。

+2

AFAIK漂浮物數組應該做得很好。 – 2014-10-03 19:03:52

+0

[這些](http://stackoverflow.com/questions/15380491/glvertexattribpointer-in-opengl-and-in-opengles)[questions](http://stackoverflow.com/questions/9954759/using-glvertexattribpointer-and -gldrawelements-to-draw-from-a-packed-vertex-buff)顯示使用GL_FLOAT []或FloatBuffer;我不知道,我自己。 – 2014-10-03 19:19:28

+0

所以在Java中沒有辦法做到這一點?我在iOS中這樣做的好處是,它更容易,更高效地獲取和設置值。 – Bananable 2014-10-03 20:10:08

回答

1

隨着你要走的方向,我不認爲這可以直接工作。當您有一組Java對象(如Vector3類的數組)時,該陣列包含一個引用序列這些對象,並且每個對象都分配在一個單獨的內存塊中。

需要傳遞到OpenGL的入口點像glVertexAttribPointer()glBufferData()什麼是包含數據存儲器一個連續塊。一組對象沒有這種佈局,所以根本無法直接使用它。

你有多種選擇:

  • 不要使用對象數組來存儲你的數據。相反,使用將數據存儲在連續內存塊中的數據結構。對於浮點值,這可以是float[]FloatBuffer。 Android中的Java入口點將緩衝區作爲參數,因此使用緩衝區是最直接的方法。您應該能夠在Android OpenGL示例中找到大量示例。
  • 在進行API調用之前將數據複製到臨時緩衝區。這顯然不太吸引人,因爲額外的數據副本會導致非生產性開銷。
  • 用C++編寫你的OpenGL代碼,並用NDK進行編譯。如果你從另一個平臺移植C++代碼,這也可以爲你節省很多工作。如果在iOS上將OpenGL代碼與Objective-C混合使用,它仍然會起作用。
+0

看起來我可能不得不採取NDK路線。無論如何,我的大部分代碼都是標準C,因此實現這一點不應該太困難。我很驚訝Java雖然沒有結構,但我發現數據存儲方式非常有用。任何人,謝謝你! – Bananable 2014-10-04 05:37:29

相關問題