Рендеринг спереди назад против шейдеров

Давайте рассмотрим такую ​​ситуацию. Сцена содержит данные объекты: ABCDE

Где заказать с камеры (от ближайшего к дальнему) AEBDC

И объекты AC используют shader1,ED shader 2,B shader3

Объекты AC используют Shader Shade, но различную текстуру.

Что теперь делать с такой ситуацией?

  • Рендеринг всего спереди назад (5 перестановок)
  • Рендеринг по группам шейдеров, которые отсортированы (3 шейдерных перестановки).
  • Marge все шейдерные программы в одну (1 своп).

Как инструкции glUniform,glBindTexture и т. д., чтобы изменить значение в уже используемой программе, что вызывает накладные расходы?

2 ответа

Решение

На этот вопрос нет единого ответа. Влияет ли изменение состояния OpenGL на издержки? Конечно, они делают; нет ничего бесплатного Вопрос в том, будут ли издержки, вызванные изменением состояния, хуже, чем менее эффективная поддержка теста глубины.

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

Вот почему профилирование перед оптимизацией важно.

Профиль, профиль и даже больше профиля:)

Я хотел бы добавить одну вещь, хотя:

В вашей ситуации вы можете использовать идею очереди рендеринга. Это своего рода менеджер для рисования объектов. Вместо того, чтобы рисовать объект, который вы называете renderQueue.add(myObject), Потом, когда ты add() все необходимые объекты вы можете вызвать renderQueue.renderAll(), Этот метод может обрабатывать всю сортировку (по расстоянию, по шейдеру, по материалу и т. Д.) И таким образом он может быть более полезен при профилировании (а затем при изменении способа рендеринга).

Конечно, это только грубая идея.

Другие вопросы по тегам