1

私は、同じように動作するはずの 3 つのコードの断片を持っていますが、OpenGL ES が Java for Android にどのようにバインドされているかをまだ調査中です。ただし、フラグメント B と C の動作が異なる理由を知りたいです。

次の (A) は機能します。

        ByteBuffer bb = ByteBuffer.allocateDirect(8);
        bb.order(ByteOrder.nativeOrder());
        IntBuffer ib = bb.asIntBuffer();
        Log.d("Info", "Generating buffers...");
        GLES20.glGenBuffers(2, ib);
        Log.d("Info", "Done!");
        int buff1 = ib.get();
        int buff2 = ib.get();
        Log.d("A) buff1", String.format("%d", buff1));
        Log.d("A) buff2", String.format("%d", buff2));

次の (B) は機能せず、glGenBuffers で SIGSEGV が発生します。前のものとの唯一の違いは、allocateDirect ではなく、allocate 呼び出しにあることに注意してください。

        ByteBuffer bb = ByteBuffer.allocate(8);
        bb.order(ByteOrder.nativeOrder());
        IntBuffer ib = bb.asIntBuffer();
        Log.d("Info", "Generating buffers...");
        GLES20.glGenBuffers(2, ib);
        Log.d("Info", "Done!");
        int buff1 = ib.get();
        int buff2 = ib.get();
        Log.d("B) buff1", String.format("%d", buff1));
        Log.d("B) buff2", String.format("%d", buff2));

次の (C) は機能しますが、これもまた、allocateDirect ではなく、allocate の呼び出しであるため、本当に驚きました。

        IntBuffer ib = IntBuffer.allocate(2);
        Log.d("Info", "Generating buffers...");
        GLES20.glGenBuffers(2, ib);
        Log.d("Info", "Done!");
        int buff1 = ib.get();
        int buff2 = ib.get();
        Log.d("C) buff1", String.format("%d", buff1));
        Log.d("C) buff2", String.format("%d", buff2));

「動作する」という言葉は、ログにエラーが表示されず、buff1 と buff2 が 70001、140002、または 210004 のような正の「妥当な」値を取得することを意味します。これらは名前のように見えます。

4

1 に答える 1

0

答えは、インターフェースGLメソッドのドキュメントのJOGL Javadocページにあるようです:

void glGenBuffers(int n, IntBuffer buffers)

ここでは、バッファーは直接 または 配列に裏打ちされた IntBuffer である必要があり、(B) で作成されたバッファーはこれらのどちらでもなく、(A) は直接的でしたが裏打ちされておらず、(C) は直接的ではありませんでしたが、支持した。

OpenGL を Dalvik システムにバインドするための公式の Google ドキュメントがあるかどうかを知りたいのですが、それとも JOGL であると仮定しますか? インターフェイス名が異なるため (たとえば、JOGL の GLES2 と Android GLES20)、同じである必要はありません。

于 2012-09-10T08:35:08.160 に答える