2012-09-08 37 views
1

我有三段代碼應該表現相似,或者不是,我仍在研究OpenGL ES如何綁定到Java的Android版本。不過我真的想知道爲什麼片段B和C表現不同:IntBuffer,ByteBuffer,ByteOrder和GLES20 for Android

以下(A)工作原理:

 ByteBuffer bb = ByteBuffer.allocateDirect(8); 
     bb.order(ByteOrder.nativeOrder()); 
     IntBuffer ib = bb.asIntBuffer(); 
     Log.d("Info", "Generating buffers..."); 
     GLES20.glGenBuffers(2, ib); 
     Log.d("Info", "Done!"); 
     int buff1 = ib.get(); 
     int buff2 = ib.get(); 
     Log.d("A) buff1", String.format("%d", buff1)); 
     Log.d("A) buff2", String.format("%d", buff2)); 

以下(B)不工作,並導致SIGSEGV上glGenBuffers;注意,與以前唯一不同的是在分配呼叫,而不是allocateDirect:

 ByteBuffer bb = ByteBuffer.allocate(8); 
     bb.order(ByteOrder.nativeOrder()); 
     IntBuffer ib = bb.asIntBuffer(); 
     Log.d("Info", "Generating buffers..."); 
     GLES20.glGenBuffers(2, ib); 
     Log.d("Info", "Done!"); 
     int buff1 = ib.get(); 
     int buff2 = ib.get(); 
     Log.d("B) buff1", String.format("%d", buff1)); 
     Log.d("B) buff2", String.format("%d", buff2)); 

以下(C)的作品,這着實讓我吃驚,因爲這又是一個呼叫分配,而不是allocateDirect:

 IntBuffer ib = IntBuffer.allocate(2); 
     Log.d("Info", "Generating buffers..."); 
     GLES20.glGenBuffers(2, ib); 
     Log.d("Info", "Done!"); 
     int buff1 = ib.get(); 
     int buff2 = ib.get(); 
     Log.d("C) buff1", String.format("%d", buff1)); 
     Log.d("C) buff2", String.format("%d", buff2)); 

使用「works」這個詞,我的意思是沒有錯誤出現在日誌中,buff1和buff2得到正面的「合理」值,例如70001,140002或210004,看起來像是名字。

回答

0

答案似乎是在JOGL Javadoc page器,用於接口GL的文檔中,方法:

void glGenBuffers(int n, IntBuffer buffers) 

這裏是說,緩衝區應該是一個直接OR陣列支持 IntBuffer,和(B)中創建的緩衝區既不是這些,(A)是直接的,但它沒有支持,(C)不是直接的,但它是支持的。

現在我想知道他們將OpenGL綁定到Dalvik系統的官方Google文檔,還是我認爲它完全是JOGL?它不應該是相同的,因爲接口名稱是不同的(例如JOGL的GLES2與Android GLES20)。