Использование геометрического шейдера для создания экземпляров - PullRequest
4 голосов
/ 14 февраля 2011

Итак, я хочу нарисовать много квадратов (или даже кубов) и наткнулся на эту прекрасную вещь, называемую геометрическим шейдером.

Теперь я понимаю, как это работает, и я, вероятно, мог бы манипулировать им, чтобы нарисовать куб для каждой вершины в буфере вершин, но я не уверен, что это правильный способ сделать это. Геометрический шейдер происходит между вершинным шейдером и фрагментным шейдером, поэтому он работает с вершинами в экранном пространстве . Но они нужны мне в мировом пространстве, чтобы делать преобразования.

Итак, нормально ли, чтобы мой вершинный шейдер просто передавал входные данные в геометрический шейдер, а геометрический шейдер умножался на матрицу modelviewproj после создания примитивов? Не должно быть никаких проблем с унифицированной архитектурой шейдеров, но я все еще чувствую тошноту, когда делаю вершинный шейдер избыточным.

Есть ли альтернативы? Или это действительно «правильный» способ сделать это?

1 Ответ

3 голосов
/ 14 февраля 2011

Это совершенно нормально.

Кроме того, рассмотрите возможность использования инстансированного рендеринга (glDrawArraysInstanced, glDrawElementsInstanced) с делителем атрибута вершины (glVertexAttribDivisor). Таким образом, вы можете выполнить ту же задачу вообще без геометрического шейдера.

Например, у вас может быть привязана правильная геометрия куба. Затем у вас есть специальный атрибут вершины, содержащий позиции куба, которые вы хотите для каждого экземпляра. Вы должны связать его с делителем = 1, что будет продвигать его для каждого нарисованного экземпляра. Затем нарисуйте куб, используя glDraw*Instanced, указав количество экземпляров.

Вы также можете выбрать входные данные из текстур, используя gl_VertexID или gl_InstanceID для координат.

...