Ну, что такое карта теней? Карта теней - это текстура, тексты которой отвечают на простой вопрос: на каком расстоянии от света, в направлении, представленном текселем, свет перекрыт? Координаты текстуры генерируются с использованием различных проективных средств текстурирования, в зависимости от конкретного алгоритма отображения теней.
Проективное текстурирование - это просто способ преобразования объекта в пространство текстуры (и да, я знаю, что это звучит задом наперед. Но так оно и работает). Алгоритмы отображения теней используют несколько различных видов преобразований. Но, в конечном счете, это просто превращения из одного пространства в другое.
При рендеринге карты теней вы берете вершины своей геометрии и трансформируете их с помощью стандартного конвейера рендеринга. Но матрицы камеры и проекции предназначены для вашего положения и направления света, а не для положения и ориентации вида.
При выполнении прямого рендеринга с картой теней вы визуализируете объект как обычно, трансформируя вершины в пространство камеры обзора и через матрицу проекционной проекции. Однако вы также трансформируете вершины с помощью вашей камеры освещения и проекционных матриц, передавая их как данные на каждую вершину фрагментному шейдеру. Он использует их с помощью проективного текстурирования для доступа к теневой текстуре.
Вот важный момент. Проекционный доступ к текстуре разработан таким образом, чтобы местоположение, к которому он обращается на текстуре, представляло направление между этой точкой на поверхности (точкой, которую вы рендерили в фрагментном шейдере) и источником света. Следовательно, он выбирает тексель, который представляет глубину, на которой происходит окклюзия для визуализируемого фрагмента.
Но нет ничего особенного об этом трубопроводе. Вы не должны преобразовать координаты вершин в тень текстуры и передавать их в пиксельный шейдер. Вы могли бы передать свои позиции мирового пространства вершин к пиксельный шейдер, а затем фрагмент Shader превратить их в проективное пространство теневой текстуры. Конечно, вы бы выбрасывая много производительности, так как вы подойдете с теми же координатами текстуры. Но это математически жизнеспособное.
В самом деле, вы могли бы передать свои позиции зрения камеры пространства вершин к пиксельный шейдер. Это может затем преобразовать их в мире, а затем в световую камеру пространства, то в проективное пространство тени текстуры. Вы можете поместить все эти преобразования в одну матрицу (в зависимости от алгоритма проекции тени). Опять же, это дает вам именно то, что вы были раньше, так что, когда вперед рендеринга, нет никаких причин, чтобы сделать это.
Но в отложенном рендеринге, вы уже в поле зрения камеры пространство вершинных позиций. Вы должны, в противном случае вы не можете сделать освещение. Вы либо впустую много памяти и пропускной способности, записывая их в буфер, или вы были умны и пересчитывается их , используя буфер глубины и различные математические (которые я не буду вдаваться в здесь, но покрыта онлайн).
В любом случае, у вас есть вид камеры космических позиций. И, как было сказано выше, мы можем применить матрицу, чтобы преобразовать их из вида камеры-пространства в тени проективного пространства текстуры. Так что ... сделать это. Тогда доступ к вашим картам теней.
Задача решена.