我试图通过Google在GDC 2011上的演讲中提供的方法加载原始的,未压缩的VBO数据。此方法使用MappedByteBuffer在随后的glBufferData调用中快速加载数据。不幸的是,对我来说,它只是不起作用。我能够为它找到一个hacky工作(它在下面的代码中注释掉了),但是我想让它在没有那个黑客的情况下工作。以下是我的代码示例:
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 :(得分:1)
自你发布以来已过去两年,但这是Stack Overflow关于MappedByteBuffer并将数据加载到VBO的唯一条目,我想我找到了解决方案。
在我看来,问题不在于此代码,而在于您尝试加载的数据。在我的情况下,当我将存储的顶点数据的字节序更改为小端时,它有所帮助。
这就像谷歌在提供的示例中所做的那样:使用sphere.c生成点,所以如果我运行他们的程序,我会得到小端的值,这就是他们的演示工作的原因。当我尝试使用DataOutputStream从Java存储值时,我得到了大端序。