Лекция #34. Top-secrets of projective grid. [Лектор - Denton]
Автор: Вячеслав Е.
Из лога вырезан мусор, некоторые места подправлены. Полный лог: http://www.everfall.com/paste/id.php?phy8s5l4zxe8
<Denton> Итак. сегодня я расскажу о том, чтоже такое projective grid
<Denton> и о том, как и где можно её использовать.
<Denton> данный способ был использован для реализации водной поверхности
<Denton> Projective grid, на русский язык переводится как проективная сетка, это сетка которая получается в результате проецирования вершин сетки с экраных координат в 3д пространство
<Denton> Основная идея проективной сетки заключается в достижении максимальной теселяции при приближении к виртуальной камере и уменьшении при удалении вершин от виртуальной камеры
<Denton> Для чего же можно её применить...
<Denton> В следствии того что сетка около камеры получается высокой плотности( количество вершин на квадратную единицу 3д пространства высокое), а с удалением от горизонта сетка становится более разреженная, её удобно использовать для рендеринга сетки меша, используемого для рендеринга водной поверхности
<Denton> Мной использовался данный способ лишь для рендеринга водной поверхности, но также предполагается, что возможно будет использовать данный способ и для рендеринга слоя облаков для открытых пространств
<Denton> Если данная лекция пройдёт успешно, и реализация слоя облаков удасться, по этому поводу будет ещё одна лекция
<Denton> хочется также сказать что данный способ был реализован в других играх жанра стратегии
<Denton> в частности не так давно вышедшей Supreme Commander
<Denton> но там она с некоторыми доработками
<Denton> Далее будет рассказано о том, как получить проективную сетку и как можно её использовать для рендеринга поверхности воды
<Denton> В начале напомню как происходит рендеринг воды в принципе
<Denton> а) Создаётся плоскоская сетка
<Denton> б) С использованием шумовой функции создаётся карта высот и в соответствие с ней сдвигаются вершины
<Denton> немного не точно выразился. Не с шумовой функцией, а с волновой.
<Denton> Спасибо washth
<Denton> в) Полученная геометрия выводится на экран
<Denton> с применением различных заранее подготовленных, либо отсчитаных в рендертаргет текстур и шейдеров
<Denton> В обычном случае сетка лежит в плоскости разбивается на треугольники, чем ближе к камере – тем мельче треугольники.
<Denton> Возможны применения различных способов тесселяции
<Denton> но в любом случае это делается вручную при изменении определённых параметров
<Denton> Для создания карты высот используются какие либо волновые функции, например шум Перлина
<Denton> Используется несколько октав, каждая из которых делает карту шума более мелкой и в итоге карты шумов всех октав сумируются
<Denton> На этом рисунке http://img444.imageshack.us/img444/3627/58435634rk6.jpg обозначены:
<Denton> Sbase - плоскость в которой расположена сетка
<Denton> Supper – верхний предел смещений вершин согласно карте высот
<Denton> Slower – нижний предел смещения вершин согласно карте высот
<Denton> Nbase – нормаль к плоскости Sbase
<Denton> Vdisplaceble - объём в котором будут смещатся вершины
<Denton> Тут http://img444.imageshack.us/img444/3671/64592334sq0.jpg отображено как смещаются вершины согласно карты шума
<Denton> это всё было известно и ранее. ничего нового тут нет. вопросы есть по этому?
<paladinrus> где происходит смещение?
<paladinrus> ведь не у всех есть геометрические шейдеры
<paladinrus> тогда программно?
<Denton> можно и на CPU их смещать
<Black_Phoenix> Есть вопрос
<NULL_PTR> вершины смещай в вертексном шейдере
<paladinrus> и ещё
<paladinrus> может я ошибаюсь но при дифферд шейдинге можно смещать в пиксельном шейдере?
<Denton> в пиксельном шейдере смещать вершины нельзя
<Denton> при дифер шейдинге в пиксельном происходил расчёт освещения
<Denton> а в текстурах были координаты вершин
<paladinrus> ну
<paladinrus> и что нам мешает поменять координаты
<Denton> можно и менять
<Denton> тогда для задания вершин в сетке необходимо использовать r2vb
<Denton> т.е. данные с текстуры использоваться как координаты вершин.
<Denton> а при деффер шейдинге, насколько мне известно мы зная координаты вершин получали текстуру
<paladinrus> ну я это и имел ввиду, ок, вопросов нет
<Denton> тогда поехали дальше
<Denton> Принцип построения проективной сетки для меша поверхности воды, состоит из следующих этапов
<Denton> а) создание плоскости расположенной перпендикулярно вектору направления взгляда виртуальной камеры
<Denton> б) проектирование угловых вершин полученой плоскости на плоскость Sbase
<Denton> проектирование в данном случае - с учётом матрицы проектора. в нашем случае - виртуальной камеры
<Denton> в) смещение вершин в соответствии с картой высот.
<Denton> г) вывод полученого меша на экран.
<Denton> также у меня дальше будут использоваться следующие обозначения:
<Denton> Vcam – объём занимаемый конусом камеры
<Denton> Vvisible – пересечение объёмов Vcam и Vdisplaceable
<Denton> также считаем что нормали к Supper и Slower равны
<Denton> и равны также нормали к Sbase
<Denton> Vcam - объём создаваемый ближней плоскостью отсечения, дальней, и гранями фрустума
<Denton> те части объёма Vdisplaceable которые попадаёт в Vcam и есть Vvisible
<Denton> Если сравнивать как и что должно получиться, то удобнее всего взять настольную лампу и тонкую прозрачную бумагу
<Denton> нарисовать на ней ручкой равномерную сетку, и закрыть этой бумагой конус настольной лампы
<Denton> После включения лампы можно будет увидеть что спроецированные нарисованные точки на бумаге, на стол уже не будут равномерно удалены друг от друга
<Denton> По мере их отдаления от лампы, они будут находится на более дальнем расстоянии друг от друга
<Denton> Примерно это будет выглядеть так:
<Denton> http://img528.imageshack.us/img528/9441/77454362vf8.jpg
<Denton> Как же создаётся плоскость расположенная перпендикулярно вектору направления взгляда виртуальной камеры…
<Denton> Для начала необходимо найти точки пересечения Vdisplaceable с конусом видимости камеры, с frustum’ом
<Denton> Полученые координаты будут находится в modelview matrix в пространстве виртуальной камеры.
<Denton> как находить пересечения я думаю не стоит объяснять.
<Denton> Далее для построения плоскости которая была бы параллельна вектору направления взгляда камеры, необходимо получить экранные координаты вершин
<Denton> Далее необходимо найти минимальный и максимальные координаты вершин на экране
<Denton> т.е. берётся каждая вершина и находится минимальный X, максимальный X среди них. И аналогично с Y
<Denton> С учётом этих значений строится матрица проектора, с помощью которой и будут найдены точки в мировой системе координат
<Denton> Матрица строится так: http://www.everfall.com/paste/id.php?y7hw8s2se8sl
<Denton> Теперь умножая на эту матрицу вершины (0,0) (1,0) (0,1) (1,1) можно получить 4 вершины трапеции, которая будет лежать в плоскости Sbase
<Denton> следует сказать, что полученные координаты будут гомогенными. иными словами 4д вектора
<Denton> Далее между данными вершинами строится сетка по тривиальному алгоритму – стороны трапеции делятся на равные участки и строится сетка.
<Denton> тут в принципе есть одна особенность
<Denton> при расчёте координат сетки используются гомогенные координаты.
<Denton> т.е. для расчёта ширины между двумя строками, берётся Yдальнее - Yближнее в гомогенных координатах
<Denton> это нужно для того, чтобы сетка была равномерной на экране виртуальной камеры
<Denton> а при переводе в декартовую системы координат получится что сетка рястягивается с увеличением расстояния от камеры
<Denton> После этих действий со стороны наблюдателя сетка будет иметь вид: http://img207.imageshack.us/img207/1530/23414408qp1.jpg
<Denton> а с вида камеры сетка будет абсолютно равномерна.
<Denton> что это даёт...
<Denton> если камера направлена в сторону горизонта, и у нас размер сетки 128х128, то большая часть вершин сетки будет около камеры что обеспечит хорошую детальность перед камерой.
<Denton> и если опустить камеру "под ноги", получим те же самые 128х128 вершин
<Denton> но использоваться они будут для более малой площади поверхности.
<Denton> т.е. фактически все вершины используются только для видимой части поверхности
<Denton> и совсем не важно - огромный у нас океан или маленькая лужа. количество вершин на водную поверхность не нужно делать сильно большим.
<Denton> так же есть некоторые особенности в реализации.
<Denton> в частности при нахождения матрица проектора.
<Denton> если смотреть в небо, то может получится так называемый эффект back firing
<Denton> когда у нас сетка будет отрисовываться с обратной стороны камеры.
<Denton> для борьбы с этим создаётся дополнительная виртуальная камера
<Denton> которая используется для перевода найденых вершин пересечения Vcam и Vdisplaceable
<Denton> в экранные координаты
<Denton> для получения экранных координат вершин
29 июля 2007
Комментарии [3]