有人给我一个使用 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);
}
我从 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);
}