1

我有三个代码片段,它们的行为应该相似,或者可能不相似,我仍在研究 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;请注意,与前一个的唯一区别在于 allocate 调用而不是 allocateDirect:

        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) 有效,这真的让我感到惊讶,因为它再次调用 allocate 而不是 allocateDirect:

        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

答案似乎在JOGL Javadoc page,在接口 GL 的文档中,方法:

void glGenBuffers(int n, IntBuffer buffers)

这里说缓冲区应该是直接 OR 数组支持的IntBuffer,并且在 (B) 中创建的缓冲区都不是这些,而 (A) 是直接的但它没有支持,并且 (C) 不是直接的但它是支持。

现在我想知道是否有官方的谷歌文档将 OpenGL 绑定到 Dalvik 系统,或者我应该假设它完全是 JOGL?它不应该相同,因为接口名称不同(例如 JOGL 的 GLES2 与 Android GLES20)。

于 2012-09-10T08:35:08.160 回答