Установка gl_FragDepth вызывает отставание?

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

#version 330 core

in vec3 FragPos;
uniform vec3 lightPos;
uniform float farPlane;

void main()
{
    float depth = length(FragPos - lightPos);
    depth /= farPlane;
    gl_FragDepth = depth;
}

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

Код работает без ошибок. Я тестировал рендерер всего с двумя объектами в сцене и одним точечным источником света. Позже я натянул большую внутреннюю сцену, и FPS упал где-то с 60-70 до 30-40.

Я попытался выполнить профилирование графического процессора с помощью Nvidia Nsights и обнаружил, что glDrawElements для моего теневого прохода тратит 4 мс. Я обнулил проблему до последней строки кода фрагментного шейдера, написанного выше, gl_FragDepth = depth.

Я обнаружил, что если я уберу выражение gl_FragDepth = depth, FPS подскочит до 70 с, а вызов отрисовки займет всего 1 мс. Обратите внимание, все остальное осталось нетронутым.

Как установка значения gl_FragDepth может привести к снижению производительности?


person skeelz    schedule 20.10.2020    source источник


Ответы (1)


Запись в gl_FragDepth отключит ранние тесты фрагментов:

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

person genpfault    schedule 20.10.2020
comment
Ох! Вот так. переопределение глубины во фрагментном шейдере отключает раннее тестирование глубины. Спасибо. - person skeelz; 21.10.2020