我试图通过Google在GDC 2011上的演讲中介绍的方法加载原始的,未压缩的VBO数据。此方法使用MappedByteBuffer来快速加载数据,此后再调用glBufferData。不幸的是,对我来说,它只是无法正常工作。我能够找到解决该问题的方法(在下面的代码中将其注释掉了),但是我想在没有该方法的情况下使其正常工作。这是我的代码示例:

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);

最佳答案

自您发布以来已经过去了两年,但这是关于MappedByteBuffer和将数据加载到VBO的Stack Overflow上的唯一条目,我想我找到了解决方案。

在我看来,问题不在于此代码,而在于您尝试加载的数据。就我而言,当我将存储的顶点数据的字节序更改为Little Endian时,这很有帮助。

就像Google在所提供的示例中所做的那样:point是使用sphere.c生成的,因此,如果我运行他们的程序,我会获得小端序的值,这就是他们的演示起作用的原因。当我尝试使用DataOutputStream存储来自Java的值时,得到了大字节序。

07-24 14:28
查看更多