Использование шейдера геометрии для создания экземпляров

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

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

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

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


person Hannesh    schedule 14.02.2011    source источник


Ответы (1)


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

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

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

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

person kvark    schedule 14.02.2011
comment
Спасибо за совет по инстансингу, но он был медленным. Это ограничило меня целыми кубами, поэтому я не мог отобрать скрытые грани, а создание экземпляров для каждого квадроцикла бессмысленно, потому что матрица 4x4, описывающая преобразование для каждого квадроцикла, почти больше, чем просто использование 4 вершин прямо вверх. - person Hannesh; 20.02.2011
comment
Какой подход будет быстрее с точки зрения производительности? Геометрический шейдер или создание экземпляров? Тоже примерно на сколько? - person Morgan Bengtsson; 15.11.2011