2

我尝试通过 Google 在 GDC 2011 上的演讲中介绍的方法加载原始的、未压缩的 VBO 数据。该方法使用 MappedByteBuffer 在随后调用 glBufferData 时快速加载数据。不幸的是,对我来说,它只是行不通。我能够为它找到一个 hacky 工作(它在下面的代码中注释掉了),但我想在没有那个 hack 的情况下让它工作。这是我的代码示例:

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

1 回答 1

1

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

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

这就像谷歌在提供的示例中所做的那样:点是使用 sphere.c 生成的,所以如果我运行他们的程序,我会得到小端的值,这就是他们的演示工作的原因。当我尝试使用 DataOutputStream 从 Java 存储值时,我得到了大端序。

于 2013-09-20T20:32:32.143 回答