Учитывая фрагментарный шейдер, который изменяет исходную глубину фрагмента и записывает в gl_FragDepth
. Будет ли выполняться код после записи до gl_Fragdepth
, если тест глубины завершится с ошибкой в этой точке?Выполнение шейдера после записи в gl_FragDepth
Пример:
in float depth;
layout(depth_less) out float gl_FragDepth;
void main() {
float newDepth = depth - someModification;
gl_FragDepth = newDepth;
A();
}
Будет A
быть выполнена, если newDepth
больше, чем текущее значение в gl_FragDepth
?
Если да, то какова была бы альтернатива, чтобы остановить шейдер от выполнения ненужных вычислений в A
- без использования настраиваемого буфера глубины?
Благодарим вас за ответ. Модификация зависит от фрагмента. Ваше предлагаемое решение работало для меня при рисовании геометрии с помощью glDraw *(). Поскольку мне нужно рисовать одну и ту же геометрию несколько раз, я использую glDraw * Instaced(), но в этом случае ручной анализ глубины вызывает артефакты. В любом случае, что A() всегда будет выполняться до тех пор, пока он вносит вклад в любой выход, отвечает на мой главный вопрос. – nils
Да ... тест против gl_FragDepth может произойти в любое время после его появления. Карта может вычислять перекрывающиеся фрагменты в любом порядке, а глубины фрагментов от каждого вычисления в конечном итоге определяют, какой из них «выигрывает». –