Загрузка необработанных данных VBO через MappedByteBuffer в OpenGL (не работает) - PullRequest
2 голосов
/ 15 июля 2011

Я попытался загрузить необработанные несжатые данные VBO с помощью метода, представленного в докладе, который Google сделал на GDC 2011. Этот метод использует 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);

1 Ответ

1 голос
/ 21 сентября 2013

С момента вашего сообщения прошло два года, но это единственная запись в Stack Overflow, касающаяся MappedByteBuffer и загрузки данных в VBO, и я думаю, что нашел решение.

На мой взгляд, проблема не в этом коде, а в данных, которые вы пытаетесь загрузить. В моем случае это помогло, когда я изменил порядковый номер хранимых данных вершин на младший.

Это так же, как Google делает это в представленном примере: точки генерируются с использованиемphere.c, поэтому, если я запускаю их программу, я получаю значения с прямым порядком байтов, и поэтому их демонстрация работает. Когда я попытался сохранить значения из Java с помощью DataOutputStream, я получил порядок с прямым порядком байтов.

...