Voor een Android applicatie probeer ik geometrie uit een binair bestand te lezen om vervolgens als buffers voor OpenGL ES (1.1) te gebruiken. Ik schrijf de getallen door middel van een DataOutputStream en writeFloat() naar het bestand.
Wanneer ik het bestand echter wil uitlezen loop ik tegen iets vreemd aan.
Wanneer ik een ByteBuffer maak en direct omzet naar een FloatBuffer waar ik vervolgens per float de waardes overzet gaat het goed. Ik kan de buffers netjes in OpenGL weergeven.
Deze methode is echter vrij traag, zelfs wanneer mijn DataInputStream wrap met een BufferedInputStream. Wanneer ik alle waardes echter in een keer inlees gaat het veel sneller:
Het probleem is echter dat OpenGL deze buffer niet weergeeft. Wanneer ik de individuele getallen bekijk dmv 'readFloat()' krijg ik de juiste waarden terug, OpenGL tekent echter niks.
Wat zie ik over het hoofd? Is het uberhaupt mogelijk om een byte[] om te zetten naar een FloatBuffer zonder het per waarde te doen?
Wanneer ik het bestand echter wil uitlezen loop ik tegen iets vreemd aan.
Wanneer ik een ByteBuffer maak en direct omzet naar een FloatBuffer waar ik vervolgens per float de waardes overzet gaat het goed. Ik kan de buffers netjes in OpenGL weergeven.
Java:
1
2
3
4
5
| FloatBuffer vertexBuffer = ByteBuffer.allocateDirect(vertexCapacity) .order(ByteOrder.nativeOrder()).asFloatBuffer(); for(int i = 0; i < vertexFloatCount; i++) vertexBuffer.put(input.readFloat()); vertexBuffer.position(0); |
Deze methode is echter vrij traag, zelfs wanneer mijn DataInputStream wrap met een BufferedInputStream. Wanneer ik alle waardes echter in een keer inlees gaat het veel sneller:
Java:
1
2
3
4
5
| ByteBuffer buffer = ByteBuffer.allocateDirect(vertexCapacity).order(ByteOrder.nativeOrder); byte[] values = new byte[vertexCapacity]; input.readFully(values); buffer.put(values, 0, vertexCapacity); FloatBuffer vb = buffer.asFloatBuffer(); |
Het probleem is echter dat OpenGL deze buffer niet weergeeft. Wanneer ik de individuele getallen bekijk dmv 'readFloat()' krijg ik de juiste waarden terug, OpenGL tekent echter niks.
Wat zie ik over het hoofd? Is het uberhaupt mogelijk om een byte[] om te zetten naar een FloatBuffer zonder het per waarde te doen?