有人给我一个使用 glMultiDrawArraysIndirect 和 JOGL 的例子吗?

Anyone offer me an example using glMultiDrawArraysIndirect with JOGL?

我从 OpenGL 学到了 glMultiDrawArraysIndirect() 方法,我想在 JOGL 中使用这个方法调用。在示例代码中,使用了一个 C++ 结构,该结构中的数据通过使用 glMapBufferRange() 存储在缓冲区中。我想知道 JOGL 是怎么回事?如果有例子就好了

以下是使用 OpenGL 的示例代码:

struct DrawArraysIndirectCommand
{
    GLuint  count;
    GLuint  primCount;
    GLuint  first;
    GLuint  baseInstance;
};

load_shaders();

object.load("media/objects/asteroids.sbm");

glGenBuffers(1, &indirect_draw_buffer);
glBindBuffer(GL_DRAW_INDIRECT_BUFFER, indirect_draw_buffer);
glBufferData(GL_DRAW_INDIRECT_BUFFER,
             NUM_DRAWS * sizeof(DrawArraysIndirectCommand),
             NULL,
             GL_STATIC_DRAW);

DrawArraysIndirectCommand * cmd = (DrawArraysIndirectCommand *)
    glMapBufferRange(GL_DRAW_INDIRECT_BUFFER,
                     0,
                     NUM_DRAWS * sizeof(DrawArraysIndirectCommand),
                     GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

for (i = 0; i < NUM_DRAWS; i++)
{
    object.get_sub_object_info(i % object.get_sub_object_count(),
                               cmd[i].first,
                               cmd[i].count);
    cmd[i].primCount = 1;
    cmd[i].baseInstance = i;
}

glUnmapBuffer(GL_DRAW_INDIRECT_BUFFER);

你可以看到这个struct只是一个接一个的4个gluint,你需要模仿一下:

ByteBuffer cmd = gl.glMapBufferRange(GL_DRAW_INDIRECT_BUFFER,
                 0,
                 NUM_DRAWS * 4 * 4,
                 GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);

for (int i = 0; i < NUM_DRAWS; i++)
{
    int first = object.get_sub_object_info_first(i % object.get_sub_object_count());
    int count = object.get_sub_object_info_count(i % object.get_sub_object_count());
    int primCount = 1;
    int baseInstance = i;

    cmd.putInt(count);
    cmd.putInt(primCount);
    cmd.putInt(first);
    cmd.putInt(basInstance);

}