My blog

Add intelligent tagline here

[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