2011-07-15 25 views
2

我試圖通過Google在GDC 2011上演講的方法加載原始的,未壓縮的VBO數據。此方法使用MappedByteBuffer快速加載數據隨後調用glBufferData。不幸的是,對我來說,這只是不工作。我能夠找到一個hacky的工作(它在下面的代碼中註釋掉了),但是我希望在沒有這種攻擊的情況下實現這個工作。這裏是我的代碼示例:通過MappedByteBuffer將原始VBO數據加載到OpenGL中(不工作)

FileInputStream fis = new FileInputStream(new File(location)); 
FileChannel fc = fis.getChannel(); 
MappedByteBuffer mbb = fc.map(MapMode.READ_ONLY, 0, fc.size()); 

// Hackery because passing mbb to glBufferData isn't working. 
//FloatBuffer fb = mbb.asFloatBuffer(); 
//float triangles[] = new float[fb.capacity()]; 
//for(int i = 0; i < triangles.length; i++) { 
// triangles[i] = fb.get(i); 
//} 
//fb = FloatBuffer.wrap(triangles); 

bufferInfo = new int[3]; 
bufferInfo[0] = newBufferID(); 
int size = (int)fc.size(); 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, bufferInfo[0]); 
GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, size, mbb, GLES20.GL_STATIC_DRAW); 
+0

具有相同的問題。我不認爲示例代碼實際上適用於所有設備/實現。 – HRJ

+0

是的,在這一點上,我同意這一點。 FWIW,我的「黑客」仍然比使用InputStream更快。對於一些相當大的網格數據,這部分代碼會執行很多次,並且不會導致任何可見的減速。 – user8709

回答

1

兩年,因爲您的文章過去了,但是這是對堆棧溢出有關MappedByteBuffer和加載數據到VBO的唯一入口,我想我找到了解決辦法。

在我看來,問題不在於此代碼,而在於您嘗試加載的數據。在我的情況下,當我將存儲的頂點數據的字節順序更改爲小端時,它有所幫助。

這就像谷歌在提供的例子中所做的那樣:point是使用sphere.c生成的,所以如果我運行他們的程序,我會得到little endian的值,這就是他們的演示的原因。當我嘗試使用DataOutputStream存儲來自Java的值時,我得到了較大的端序。

+1

需要嘗試一下......從來沒有找到原始問題的解決方案。也許就是這樣! – user8709

+0

由於類似的問題,通過'ByteBuffer#asFloatBuffer'寫入'ByteBuffer'與浮點數存在類似的問題!=每個傳遞給'glBufferData'時的'FloatBuffer'的字節序。多麼可怕的感覺。 – nmr