Так, але вам потрібна зміна парадигми.
Те, до чого ви звикли, називається переданням вперед. Ви подаєте свою геометрію, а потім продовжуєте негайно проходити затінення. У базовій візуалізації вперед ви можете або зафіксувати цикл всередині шейдера для кожного світла, або виконати один прохід на світло і поєднати результат разом (з додатковою сумішшю).
Але справи склалися досить багато. Входить: відкладене надання
Тепер, коли існує так багато варіантів, які описують їх усі докладно, тут буде більш ніж прийнятним для відповіді. Тож ось я просто опишу суть відкладеного затінення, є безліч інших ресурсів, які ви можете легко знайти за допомогою Google, сподіваємось, прочитавши це, у вас будуть потрібні ключові слова, щоб знайти те, що вам потрібно.
Основна ідея полягає у відкладенні затінення після закінчення трубопроводу. У вас є два основні етапи:
- Надайте геометрію та всю інформацію, необхідну для затінення в кілька цілей візуалізації. Це означає, що зазвичай в базовій реалізації ви маєте буфер глибини, буфер, що містить норми вашої геометрії та колір альбедо. Незабаром ви побачите, що вам потрібна інша інформація про матеріали (наприклад, шорсткість, "металевий" фактор тощо).
На цьому зображенні із вікіпедії показано три буфера (колір, глибина та нормалі)
Знову ж таки, кількість, тип та вміст використовуваних буферів досить різниться між різними проектами. Ви знайдете набір буферів з назвою GBuffers.
- Після цього настає час застосування власне освітлення. Під час проходження освітлення для кожного світла потрібно намалювати об'єм світла, який залежить від типу світла:
- Для спрямованого світла ви показуєте повноекранний квадроцикл.
- Для точкового світла ви представляєте сферу, де радіус заснований на ослабленні точкового світла.
- Для точкового світла ви надаєте конус, розміри якого знову залежать від характеристик вашого світла.
У піксельній шейдері цього проходу ви передаєте ваші GBuffers та виконуєте своє освітлення та затінення, використовуючи інформацію в них. Таким чином ви обробляєте лише пікселі, на які впливає кожне з вогнів, що мають значну швидкість, порівняно з класичною візуалізацією вперед.
Він також має різні недоліки, зокрема, поводження з прозорими об'єктами та більше споживання пропускної здатності та відеопам'яті. Але також складніше обробляти різні моделі матеріалів.
У вас є й інші побічні переваги (як наявність великої кількості інформації, готової до післяобробки), а також вона досить проста у виконанні. Але це вже не найкрутіша річ для багатьох вогнів.
Більш новітні методи - це, наприклад, плиткові візуалізації . Основна ідея їх - розподілити сцену на екрані екрану на "плитки" і призначити кожній плитці вогні, що впливають на неї. Це існує як у відкладеному, так і в прямому напрямку. Ці методи призводять до деяких проблем, коли у вас є різні розриви глибини в плитці, але, як правило, швидше, ніж класичне відкладене, і воно вирішує різні проблеми. Наприклад, серед переваг, із відкладеною плиткою, ви читаєте GBuffers один раз на освітлений фрагмент, а пікселі в одній плитці послідовно обробляють одні й ті ж світильники.
Подальша еволюція на цій стороні - це кластерне затінення, яке концептуально схоже на підходи, засновані на кахельній плитці, і має замість плитки екрану простір, кластери з 3D-розміром. Цей метод вирішує проблему глибоких розривів глибше і, як правило, краще, ніж кахельні методи.
ВАЖЛИВО ПРИМІТКА: Я описав основи відкладеного затінення. Існує кілька варіацій, оптимізацій та вдосконалень, тому я закликаю вас експериментувати з простою версією, а потім виконати деякі дослідження інших методів, таких, як я згадував вище.