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