Я разработал очень простой набор шейдеров глубины для рендеринга глубины текстур глубины моей карты теней. Это код фрагментного шейдера глубины, который я использовал:
#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 может привести к снижению производительности?