Ну, що таке тіньова карта? Карта тіней - це текстура, яка текселями відповідає на просте запитання: на якій відстані від світла, вздовж напрямку, представленого текселем, окулюється світло? Координати текстур формуються за допомогою різних проективних засобів текстурування, залежно від конкретного алгоритму тіньового відображення.
Проекційне текстурування - це просто спосіб перетворення об'єкта в простір текстури (і так, я знаю, що це звучить назад. Але так це працює). Алгоритми тіньового відображення використовують кілька різних видів перетворень. Але в кінцевому підсумку це лише перетворення з одного простору в інший.
Візуалізуючи тіньову карту, ви берете вершини своєї геометрії та перетворюєте їх за допомогою стандартного конвеєра рендерінгу. Але матриці камери та проекції розроблені для вашого положення та напрямку світла, а не для положення та орієнтації огляду.
Роблячи рендерінг вперед із тіньовою картою, ви виводите об'єкт як нормальний, перетворюючи вершини в простір камери перегляду та через матрицю перегляду проекції. Однак ви також трансформуєте вершини через матрицю світлової камери та проекцію, передаючи їх у вигляді даних вершин в шейдер фрагмента. Він використовує їх за допомогою проективного текстурування для доступу до текстури тіні.
Тут важливий момент. Проективний доступ до текстури розроблений таким чином, що розташування, до якого він звертається на текстурі, відображає напрямок між цією точкою на поверхні (точкою, яку ви надаєте у фрагменті шейдера) та світлом. Отже, він витягує тексель, який представляє глибину, на яку відбувається оклюзія, для фрагмента, що виводиться.
Але в цьому трубопроводі немає нічого особливого . Вам не доведеться перетворювати позиції вершин в текстуру тіні і передавати їх до фрагменту шейдера. Ви можете передати позиції вершини світового простору до фрагмента шейдера, а потім змусити фрагмент шейдера перетворити їх у проективний простір тіньової текстури. Зрозуміло, ви будете викидати велику продуктивність, оскільки вам підійдуть ті самі координати текстури. Але це математично життєздатно.
Дійсно, ви могли передати позиції вершин камери-простору огляду в фрагмент шейдера. Потім це може перетворити їх у світ, потім у світлий простір камери, потім у простір текстурного тіньового простору. Ви можете помістити все це перетворення в одну матрицю (залежно від алгоритму тіньового проектування). Знову ж таки, це дає вам саме те, що ви мали раніше, тому при передаванні вперед, цього немає ніяких причин.
Але при відкладеному візуалізації ви вже маєте позиції вершин перегляду в просторі камери. Ви повинні, інакше не можна займатися освітленням. Ви або витратили багато пам’яті та пропускної здатності, записавши їх у буфер, або ви були розумні і перерахували їх, використовуючи буфер глибини та різну математику (про яку я не заходжу сюди, але висвітлюється в Інтернеті).
У будь-якому випадку ви маєте перегляд позицій у просторі камер. І, як було сказано вище, ми можемо застосувати матрицю, щоб перетворити їх з простору камери перегляду в тіньовий прожекторний простір текстури. Отже ... зроби це. Потім перейдіть до своєї тіньової карти.
Проблема вирішена.