Составители:
Рубрика:
38
Шаг 1. Отрисовка сцены
Отрисовать всю сцену без теней. Главное - правильно заполненный Z-buffer.
Отключить текстурирование. Следующие два шага повторяются для каждого
источника света в сцене.
Шаг 2. Отрисовка волюмов в стенсил.
Очистить стенсил значением 1.
Выставить:
Стенсил-тест - никакого.
Запись в frame buffer - выключить.
Запись в ZBuffer - выключить.
При прохожденнии Z-Test'a - увеличить стенсил.
Выставить куллинг -против часовой стрелки.
Отрисовать все волюмы от данного источника света.
Выставить:
Стенсил-тест - никакого.
Запись в frame buffer - выключить.
Запись в ZBuffer - выключить.
При прохожденнии Z-Test'a - уменьшить стенсил.
Выставить отсечение лицевых граней - по часовой стрелке.
Отрисовать все волюмы от данного источника света.
Шаг 3. Отобразить тень на экране.
Выставить:
Стенсил-тест - проходит только если значение в стенсиле больше единицы.
Запись в frame buffer - включить.
ZBuffer - отключить совсем, не только запись.
Блендинг - включить MUL.
Отрисовать квад во весь экран с цветом яркости затененного участка (то
есть например цвет (127, 127, 127) означает, что в тени в два раза темнее).
Этот алгоритм не универсален. Самый большой его недостаток - он не будет
правильно работать если камера находится внутри волюма. Другие недостатки -
не совсем правильное затенение. Правильная модель освещения должна быть
такой - если какая-то точка находится в тени от источника света, то в ней должен
отсутствовать его вклад в освещение, а не просто уменьшение общей
освещенности. Единственный способ убрать этот недостаток - накладывать
освещение от каждого источника за отдельный проход с предварительной
отрисовкой волюмов в стенсил и включенным стенсил-тестом.
Полезные ссылки на тему –
http://developer.nvidia.com/docs/IO/2585/ATT/CarmackOnShadowVolumes.txt
http://developer.nvidia.com/docs/IO/2585/ATT/RobustShadowVolumes.pdf
Шаг 1. Отрисовка сцены Отрисовать всю сцену без теней. Главное - правильно заполненный Z-buffer. Отключить текстурирование. Следующие два шага повторяются для каждого источника света в сцене. Шаг 2. Отрисовка волюмов в стенсил. Очистить стенсил значением 1. Выставить: Стенсил-тест - никакого. Запись в frame buffer - выключить. Запись в ZBuffer - выключить. При прохожденнии Z-Test'a - увеличить стенсил. Выставить куллинг -против часовой стрелки. Отрисовать все волюмы от данного источника света. Выставить: Стенсил-тест - никакого. Запись в frame buffer - выключить. Запись в ZBuffer - выключить. При прохожденнии Z-Test'a - уменьшить стенсил. Выставить отсечение лицевых граней - по часовой стрелке. Отрисовать все волюмы от данного источника света. Шаг 3. Отобразить тень на экране. Выставить: Стенсил-тест - проходит только если значение в стенсиле больше единицы. Запись в frame buffer - включить. ZBuffer - отключить совсем, не только запись. Блендинг - включить MUL. Отрисовать квад во весь экран с цветом яркости затененного участка (то есть например цвет (127, 127, 127) означает, что в тени в два раза темнее). Этот алгоритм не универсален. Самый большой его недостаток - он не будет правильно работать если камера находится внутри волюма. Другие недостатки - не совсем правильное затенение. Правильная модель освещения должна быть такой - если какая-то точка находится в тени от источника света, то в ней должен отсутствовать его вклад в освещение, а не просто уменьшение общей освещенности. Единственный способ убрать этот недостаток - накладывать освещение от каждого источника за отдельный проход с предварительной отрисовкой волюмов в стенсил и включенным стенсил-тестом. Полезные ссылки на тему – http://developer.nvidia.com/docs/IO/2585/ATT/CarmackOnShadowVolumes.txt http://developer.nvidia.com/docs/IO/2585/ATT/RobustShadowVolumes.pdf 38