Основы построения 3-х мерных сцен с использованием библиотеки DirectX. Макушкина Л.А - 36 стр.

UptoLike

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