Графічне обладнання може здійснити раннє вибивання фрагментів на основі глибини, перш ніж обчислити їх значення кольору (іншими словами, перед запуском шейдера фрагмента). Отже, якщо ви використовуєте будь-які функції, які вплинули б на це, наприклад discard
, альфа-тестування або маніпулювання gl_FragDepth
здатністю апаратних засобів зробити цю оптимізацію, буде порушено, оскільки справжня глибина фрагмента не може бути припущена і повний шейдер повинен бути запущений.
Незалежно від того, чи використовує будь-яка з цих компрометуючих функцій чистий ефект, який можна спостерігати, залежить від ситуації. Оптимізація раннього z може підвищити продуктивність, наприклад, якщо у вас є дуже дорогі шейдери для фрагментів, але якщо вартість вашого трубопроводу знаходиться у вершинній шейдері (або в іншому місці), це вам не принесе користі, і, отже, ви можете побачити мало або відсутність погіршення продуктивності за допомогою використанняdiscard
.
Якщо вимкнути тест на глибину повністю через API, слід також запобігти запуску оптимізації, оскільки це може призвести до неправильно відображених сцен. Тоді у вашому випадку не має значення, яким ви користуєтесьdiscard
.
Недавнє обладнання може змусити тести (включаючи раннє тестування трафаретів), використовуючи layout(early_fragment_tests)
- на цій сторінці на сторінці, на яку я пов’язаний на початку відповіді, є додаткова інформація (та застереження).