Подтвердить что ты не робот

Отказывается плохо для производительности программы в OpenGL?

Я читал эту статью, и автор пишет:

Здесь, как писать высокопроизводительные приложения на каждой платформе в два простых шага:
[...]
Следуйте рекомендациям. В случае Android и OpenGL это включает в себя такие вещи, как "вызовы пакетной розыгрыши", "не использовать отбрасывание в фрагментарных шейдерах" и т.д.

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

Может ли кто-нибудь объяснить, почему и когда использовать отбрасывание можно считать плохой практикой, и как отбрасывать + depthtest сравнивается с альфой + blend?

Изменить:. Получив ответ по этому вопросу, я провел некоторое тестирование, создав фоновый градиент с текстурированным квадратом.

  • Использование GL_DEPTH_TEST и фрагмента-шейдера, заканчивающегося строкой "if( gl_FragColor.a < 0.5 ){ discard; }", дало о 32 кадра в секунду.
  • Удаление инструкции if/discard из фрагмента-шейдера увеличено скорость рендеринга примерно 44 fps.
  • Использование GL_BLEND с функцией смешивания "(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) "вместо GL_DEPTH_TEST также привело к 44 fps.
4b9b3361

Ответ 1

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

Обратите внимание, что вы получите ту же проблему от включения альфа-теста.

Ответ 2

"отказаться" плохо для каждого метода ускорения графики - IMR, TBR, TBDR. Это связано с тем, что видимость фрагмента (и, следовательно, глубина) определяется только после обработки фрагментов, а не во время раннего Z или PowerVR HSR (удаление скрытой поверхности) и т.д. Дальше вниз по графическому конвейеру что-то получает до удаления, как правило, указывает на его влияние на представление; в этом случае больше обработки фрагментов + нарушение обработки глубины других полигонов = плохой эффект

Если вы должны использовать discard, убедитесь, что только трис, который ему нужен, визуализируется с помощью шейдера, содержащего его, и, чтобы минимизировать его влияние на общую производительность рендеринга, отображает ваши объекты в порядке: непрозрачный, отбрасываемый, смешанный.

Кстати, только аппаратное обеспечение PowerVR определяет видимость на отложенном шаге (следовательно, это единственный графический процессор, называемый "TBDR" ). Другие решения могут быть основаны на плитке (TBR), но все еще используют методы раннего Z в зависимости от порядка подачи, как это делает IMR. TBR и TBDR делают смешение на чипе (быстрее, меньше энергопотребления, чем в основной памяти), поэтому смешивание должно благоприятствовать прозрачности. Обычная процедура правильного отображения смешанных полигонов - это отключить запись глубины (но не тесты) и визуализировать tris во внешнем порядке глубины (если операция смешивания не зависит от порядка). Часто примерная сортировка достаточно хороша. Геометрия должна быть такой, чтобы избегать больших площадей полностью прозрачных фрагментов. Таким образом, более одного фрагмента обрабатывается на каждый пиксель, но оптимизация глубины HW не прерывается, как с отброшенными фрагментами.

Ответ 3

Кроме того, просто наличие инструкции "if" в вашем шейдере фрагмента может привести к большому замедлению работы некоторых аппаратных средств. (В частности, графические процессоры, которые в значительной степени конвейерны или имеют одну команду/несколько данных, будут иметь большие штрафы за производительность от инструкций от ветки.) Таким образом, ваши результаты теста могут быть комбинацией оператора "if" и эффектов, упомянутых другими.

(Для того, что стоит, тестирование на моем Galaxy Nexus показало огромное ускорение, когда я переключился на сортировку по глубине своих полупрозрачных объектов и отрисовку их назад, вместо рендеринга в произвольном порядке и отбрасывания фрагментов в шейдере.)

Ответ 4

Объект A находится перед объектом B. Объект A имеет шейдер, использующий "discard". Таким образом, я не могу выполнить "Раннее Z" должным образом, потому что мне нужно знать, какие разделы объекта B будут видны через Object A. Это означает, что Object A должен пройти весь путь через конвейер обработки до тех пор, пока он не будет почти последним (пока обработка фрагмента не будет выполнена), прежде чем я смогу определить, действительно ли объект B виден или нет.

Это плохо для HSR и "Early-Z", поскольку потенциально закрытые объекты должны сидеть и ждать, пока информация о глубине будет обновлена ​​до того, как они будут обработаны. Как было сказано выше, это плохо для всех или, немного более дружелюбно, "Друзья не позволяют друзьям использовать Discard".