OpenGL - копирующий рендер

Опубликовано Igor - вт, 06/20/2017 - 16:37

В OpenGL для уменьшения нагрузки на шину обмена данными с графическим буфером при рендере большого количества однотипных элементов применяется техника копирующего рендера - "Instanced Rendering". Она позволяет уменьшить объем передаваемых данных за счет применения однотипных элементов. На вход шейдера передется массив вершин одного объекты (the instance) из группы и изменения его атрибутов для каждой из копий. Простейший копирующий рендер реализуется вызовом функции

void glDrawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primCount);

Функция рисует primCount экземпляров геометрического примитива, указанного параметрами mode, first, и count так, как они бы рисовались при помощи вызовов функции glDrawArrays(). В вершинном шейдере доступна встроенная переменная gl_InstanceID, которая увеличивается на единицу для каждого последующего экземпляра геометрического объекта. Обратите внимание на то, что параметры функции glDrawArraysInstanced() идентичны параметрам glDrawArrays() кроме аргумента primCount. Этот параметр используется для указания количества копий (инстансов) исходного объекта.

Для функции glDrawElements(), использующей индексированные массивы, тоже существует дублирующая версия:

void glDrawElementsInstanced(GLenum mode, GLsizei count, GLenum type, const void* indices, GLsizei primCount);

Тут снова мы видим аналогичный набор параметров, кроме одного дополнительного primCount, который определяет количество копий, которые будут сгенерированы.

В Сети можно найти немало ресурсов с описанием данной техники. Вот примеры:

Теги