[Android][OpenGL] Indirect Buffer
E/OpenGLES( 351): Application (SDK target 0) called a GL11 Pointer method with an indirect Buffer.
というエラーが出ました。
これは、描画にbufferがdirectである必要があるのにindirect Bufferを使っているから起きることらしいです。 Direct Bufferは、ヒープ(Javaアプリケーション用に確保されるメモリ領域)外のメモリを使うものであり、パフォーマンスが高くなります。ただ、割り当てや開放にはコストがかかるようです。
direct bufferを作るには、ByteBuffer.allocateDirect() を使えばいいようです。
具体的には、以下のようにしました。
import java.nio.ByteBuffer;
import java.nio.FloatBuffer;
private float vertices[] = {
-1.0f, 1.0f, 0.0f, // 0, Top Left
-1.0f, -1.0f, 0.0f, // 1, Bottom Left
1.0f, -1.0f, 0.0f, // 2, Bottom Right
1.0f, 1.0f, 0.0f, // 3, Top Right
};
private FloatBuffer vertexBuffer;
private void createBuffer()
{
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); // square
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
}
一度ByteBufferを作ってから、それをFloatBufferなどに変換するという感じでしょうか。
このサンプルも参考になります。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/TriangleRenderer.html