Pixar
Значить, так... Сперва отрисовываем сцену с позиции источника света и сохраняем нарисованное в текстуру. А потом полученную текстуру со стороны источника света пытаемся как бы "натянуть" на объекты сцены. Т.е. генерируем новые текстурные координаты. Можно, кстати, с такими координатами и такой текстурой отрисовать сцену. Получится стильная чёрно-белая картинка, всё что на свету абсолютно белое, всё что в тени абсолютно чёрное.
Executor
> Что значит снова?
Ну, вот в первый раз вершина (пусть будет v0) проходит стадии преобразования в шейдере depth.vs:
// переводим координаты вершины в однородные gl_Position = transform.modelViewProjection * vec4(position, 1.0);
Во второй раз всё та же вершина v0 проходит СНОВА те же стадии преобразования уже в шейдере shadowmap.vs вот так:
Vert.smcoord = transform.light * vertex;
Выходит, что с позиции источника света каждая вершина рендерится ДВА раза.
Кроме этого, ещё ТРЕТИЙ раз эта же вершина v0 рендерится уже для камеры. В шейдере shadowmap.vs это вот так:
gl_Position = transform.viewProjection * vertex;
Значит, для рендера полноценной сцены каждая вершина претерпевает всего ТРИ преобразования modelViewProjection.
.Scotina
> Т.е. генерируем новые текстурные координаты.
То есть повторно рендерим сцену со стороны источника освещения, только в этот раз мы передаём все вершины, которые видит камера, а не источник света (возможно источник видит что-то ещё, но ему не дают отрендерить эти вершины; вернее преобразования modelViewProjection источника освещения во второй раз выполняются для всех вершин, но потом те вершины, которые не видны со стороны камеры, отбрасываются). И в этот раз вершины, которые находятся ближе к источнику освещения, не затирают z координату той вершины, которую мы рендерим, потому что полученная проекция не сохраняется в z-buffer, а используется напрямую, чтобы быть сравнённой с z координатой, хранящейся в shadowmap. То есть, например, если есть прямоугольник, нормаль которого перпендикулярна направлению источника освещения, то, при обычном рендеринге, задние по отношению к источнику вершины затрутся в z буффере и останутся только ближние вершины. А при втором рендеринге этого же прямоугольника, не смотря на то, что он рендерится все той же матрицей источника освещения, мы будем знать z координаты всех четырёх вершин прямоугольника, а не только ближайших двух. Под этим я имел в виду, что во второй раз z координаты не затираются.
Возможно, это для вас настолько банально и просто, что даже не понятно, но я описываю именно те моменты, которые были не понятны мне =)
Pixar
Бррр, я чот ничо не понял, что у тебя за преобразования такие. :)
Помоему у тебя какая-то каша в голове. Рендерится два раза! Ничего нигде НЕ затирается.
Есть же моя статья, я там надеюсь доступно объяснил что и куда множится и зачем:
http://www.gamedev.ru/code/articles/ShadowMapGLSL
Как рассчитывать параметры для проекции (l,r,t,b, near, far) для произвольной сцены?. Я правильно понимаю что надо стараться минимизировать объём который попадает в SM?
us
> Как рассчитывать параметры для проекции (l,r,t,b, near, far) для произвольной
> сцены?. Я правильно понимаю что надо стараться минимизировать объём который
> попадает в SM?
Да, параметры теневой карты получаются исходя из текущего фрустума, это вообще отдельная тема.
>Одним из полезных свойств построения теневой карты является то, что ее построение не зависит от сложности геометрии на сцене,
Пожалуй лучше писать так :
что для ее построения, необходимо, лишь, получить буфер глубины для каждого из обсчитываемых источников освещения.
Т.к. от геометрии все же зависит тормоза или нет.
fzr125
> Т.к. от геометрии все же зависит тормоза или нет.
Ох, следует отличать рендер сцены и получение данных для расчета теней, мы говорим о теневой карте. Есть техники которые требуют например построения силуэта геометрии, вот там надо обсчитывать всю геометрию на сцене дополнительно, с теневыми картами же все проще - никаких дополнительных расчетов - следовательно техника не зависит от сложности геометрии. Так понятно? :)
Тема в архиве.
| Winrating.ru/stats/player/760185 winrating.ru/stats/player/760185 winrating.ru |