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

UptoLike

36
Естественно, во время отрисовки никакие такие цвета не рисуются, все эти
значения - только в стенсиле.
Еще одна важная деталь - во время отрисовки волюмы необходимо
выключить запись в Z-буфер. То есть сам Z-буфер по-прежнему работает, но если
точка волюма прошла Z-test, то ее координата не записывается в Z-буфер.
После того как в стенсиле были получены ненулевые значения только там где
есть тень, то наложить эту тень уже несложно. Самый простой метод - нарисовать
черный полупрозрачный квад во весь экран и выводить его с блендингом там, где
стенсил-тест пройден. Тогда там где есть тень освещение станет меньше.
Для более сложных объектов все построения становятся гораздо запутанней
из-за того что по одному месту может проходить больше граней волюмов, но
прицип остается тем же.
1. Построение теневого объема.
Собственно, волюм - это все силуэтные ребра объекта вытянутые в квад по
направлению от источника света, вопрос - как эти ребра находить.
Ребра, как известно, находятся на стыке треугольников, и в этой реализации
предполагается, что у любого ребра всегда можно выделить ровно 2
треугольника, между которыми оно находится. Это налагает некоторые
ограничения на модель - во-первых, она должна быть замкнута, во-вторых, не
должно быть ребер, на которых пересекаются больше 2-х треугольников.
Если все эти условия выполнены, то условие того, что ребро принадлежит
силуэту - если один из треугольников ребра лицевой стороной повернут к свету, а
второй - нет. Понятно, что для сетки, для которой хранятся вершины и индексы
находить ребра и соответствующие им треугольники каждый раз при построении
- медленно и незачем. Все эти данные можно просчитать заранее, тем более
обсчет этого не быстрый. В принципе, эта информация эквивалентна так
называемой adjacency - информации о соседях каждого треугольника по каждому
ребру. То есть существует структура:
struct ADJ
{
DWORD face1;
DWORD face2;
DWORD face3;
};
    Естественно, во время отрисовки никакие такие цвета не рисуются, все эти
значения - только в стенсиле.
    Еще одна важная деталь - во время отрисовки волюмы необходимо
выключить запись в Z-буфер. То есть сам Z-буфер по-прежнему работает, но если
точка волюма прошла Z-test, то ее координата не записывается в Z-буфер.
    После того как в стенсиле были получены ненулевые значения только там где
есть тень, то наложить эту тень уже несложно. Самый простой метод - нарисовать
черный полупрозрачный квад во весь экран и выводить его с блендингом там, где
стенсил-тест пройден. Тогда там где есть тень освещение станет меньше.




    Для более сложных объектов все построения становятся гораздо запутанней
из-за того что по одному месту может проходить больше граней волюмов, но
прицип остается тем же.

   1. Построение теневого объема.

    Собственно, волюм - это все силуэтные ребра объекта вытянутые в квад по
направлению от источника света, вопрос - как эти ребра находить.
    Ребра, как известно, находятся на стыке треугольников, и в этой реализации
предполагается, что у любого ребра всегда можно выделить ровно 2
треугольника, между которыми оно находится. Это налагает некоторые
ограничения на модель - во-первых, она должна быть замкнута, во-вторых, не
должно быть ребер, на которых пересекаются больше 2-х треугольников.
    Если все эти условия выполнены, то условие того, что ребро принадлежит
силуэту - если один из треугольников ребра лицевой стороной повернут к свету, а
второй - нет. Понятно, что для сетки, для которой хранятся вершины и индексы
находить ребра и соответствующие им треугольники каждый раз при построении
- медленно и незачем. Все эти данные можно просчитать заранее, тем более
обсчет этого не быстрый. В принципе, эта информация эквивалентна так
называемой adjacency - информации о соседях каждого треугольника по каждому
ребру. То есть существует структура:
struct ADJ
{
   DWORD face1;
   DWORD face2;
   DWORD face3;
};

                                         36