steps3D - Tutorials - Расширение ARB_multi_draw_indirect

Расширение ARB_multi_draw_indirect

Расширение ARB_draw_indirect (входящее в OpenGL 4.0) позволяет командам рендеринга получать все необходимые аргументы из буфера с новым типом - GL_DRAW_INDIRECT. Для этой цели вводятся команды glDrawArraysIndirect и glDrawElementsIndirect. При этом содержимое соответствующего буфера задавалось при помощи одной из следующих структур:

struct DrawArraysIndirectCommand
{
    GLuint count;
    GLuint instanceCount;
    GLuint firstIndex;
    GLuint baseInstance;
};

struct DrawElementsIndirectCommand
{
    GLuint count;
    GLuint instanceCount;
    GLuint firstVertex;
    GLuint baseVertex;
    GLuint baseInstance;
};

Однако каждая из этих команд моглы вывести за раз только одну группу примитивов (batch). Расширение ARB_multi_draw_indirect вводит новые функции, позволяющие за один вызов вывести сразу много групп примитивов, при этом данные для каждой группы примтивов по-прежнему берутся из буфера, только на этот раз буфер содержит не одну структуру, а целый массив таких структур. Ниже приводятся соответствующие команды:

void glMultiDrawArraysIndirect ( GLenum mode,
                 const void * indirect,
                 GLsizei primCount, GLsizei stride );

void glMultiDrawElementsIndirect ( GLenum mode,
                 GLenum type, const void * indirect,
                 GLsizei primCount, GLsizei stride );

Команда glMultiDrawArraysIndirect рассматривает параметр indirect как смещение в буфере, содержащем массив из primCount структур DrawArraysIndirectCommand. Параметр stride задает расстояние в байтах между началами последовательно идущих структур. Если этот параметр равен нулю, то считаем что эти структуры идут подряд (плотная упаковка)ю Обратите внимание, что параметр stride должен быть кратен четырем.

Команда glMultiDrawElementsIndirect ведет себя аналогично glDrawElementsIndirect, но при этом трактует параметр indirect как смещение в буфере, содержащим массив из primCount структур DrawElementsIndirectCommand. Параметр stride имеет тот же самый смысл, что и в команде glMultiDrawArraysIndirect.

По этой ссылке можно скачать весь исходный код к этой статье. Также доступны для скачивания откомпилированные версии для M$ Windows, Linux и Mac OS X.