Потеряю ли я производительность при отбрасывании пикселей, даже если я не использую тестирование глубины?

22

Когда я впервые искал инструкцию по сбросу, я обнаружил, что эксперты говорят, что использование отклонения приведет к снижению производительности. Они сказали, что отбрасывание пикселей нарушит способность GPU правильно использовать zBuffer, потому что GPU должен сначала запустить шейдер Fragment для обоих объектов, чтобы проверить, сброшен ли один из них ближе к камере или нет. Для 2D-игры, над которой я сейчас работаю, я отключил тест глубины и запись глубины. Я рисую все объекты, отсортированные по глубине, и все, нет необходимости в GPU, чтобы делать причудливые вещи. теперь я задаюсь вопросом, все еще плохо, если я отбрасываю пиксели в моем фрагментном шейдере?

Ali1S232
источник

Ответы:

20

Графическое оборудование может выполнять ранний отбор фрагментов на основе глубины до вычисления их значения цвета (другими словами, до запуска шейдерного фрагмента). Следовательно, если вы используете какие-либо функции, которые могут повлиять на это, такие как discardальфа-тестирование или манипулирование gl_FragDepthспособностью аппаратного обеспечения выполнить эту оптимизацию, это будет скомпрометировано, поскольку нельзя предположить истинную глубину фрагмента и необходимо запустить полный шейдер.

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

Полное отключение теста глубины через API также должно препятствовать запуску оптимизации, поскольку это может привести к некорректно отображаемым сценам. В таком случае, не должно иметь значения, что вы используетеdiscard .

Последние аппаратные средства могут форсировать тесты (в том числе ранние трафаретные тесты) с использованием layout(early_fragment_tests)- есть больше информации (и предостережений) по этому вопросу на странице, на которую я ссылался в начале ответа.


источник
3

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

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

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

На https://fgiesen.wordpress.com/2011/07/08/a-trip-through-the-graphics-pipeline-2011-part-7/ есть пост в блоге, в котором подробно описывается, как может работать раннее углубленное тестирование. в аппаратном обеспечении, и какие могут быть ограничения.

Адам
источник
1
На самом деле после тестирования я думаю, что можно с уверенностью предположить, что я не теряю и не набираю производительности, но я искал ответ, в котором подробно объяснялось бы, что и почему произойдет.
Ali1S232