Войти
Gamedev LectureСтатьи

Лекция #32. R.E.N.D.E.R. (3 стр)

Автор:

[21:09] <Zeux> Итак, вариации.

[21:09] <Zeux> 1. скиннинг
[21:10] <Zeux> для скиннинга все в общем похоже, только текстурной координаты для лайтмапа нет в вершине
[21:10] <Zeux> используются матрицы 3x4
[21:10] <Zeux> максимум 78 штук
[21:10] <Zeux> (vs.2.0)
[21:10] <Zeux> (vs.3.0 точнее даже, да)
[21:10] <Zeux> важное отличие
[21:10] <Zeux> максимум 2 кости на вершину.
[21:11] <Zeux> либо 1 кость, тогда в вершине хранится ее индекс
[21:11] <Zeux> и вершина занимает 24 байта
[21:11] <Zeux> либо 2 кости, тогда 2 индекса и 1 вес (второй считается как 1 - первый)
[21:11] <Zeux> тогда 28 байт
[21:12] <Zeux> позиция при скиннинге хранится в short4
[21:12] <Zeux> и распаковывается до range в [-12, +12]
[21:12] <Zeux> текс. координата - до [-16, +16] без трюков
[21:12] <Zeux> больше интересного в скиннинге нет.

[21:12] <Zeux> 2. ландшафт
[21:13] <Zeux> ландшафт рисуется патчами, размер патча - 50-200 треугольников
[21:13] <Zeux> в кадре - 30-40 патчей где-то в среднем, если далеко не смотреть
[21:13] <Zeux> патчи все одного размера, алгоритм точно не знаю, т.к. перфхуд отказывался показывать сетку для мешей
[21:13] <Zeux> но скорее всего никакого lod нет :) хотя и не уверен.

[21:14] <MiF> есть
[21:14] <MiF> на глаз видно
[21:14] <Zeux> ок, whatever

[21:14] <Zeux> на ландшафт - 10 текстур.
[21:14] <Zeux> т.е. на патч
[21:14] <Zeux> 1 текстура - диффузный цвет всего уровня
[21:14] <Zeux> 2048х2048
[21:15] <Zeux> 1 текстура - RGBA маска для сплаттинга с весами
[21:15] <Zeux> тоже 2048х2048 - они все 2048х2048.
[21:15] <Zeux> и 4 слоя
[21:15] <Zeux> на каждый слой - diffuse и normal map
[21:16] <Zeux> результирующий цвет считается как семпл из текстуры для всего уровня, умноженный на 2 и на взвешенную сумму диффузных цветов слоев
[21:16] <Zeux> т.е. diffuse * 2 * (mask.r * diffuse0 + mask.g * diffuse1 + mask.b * diffuse2 + mask.a * diffuse3)
[21:16] <Zeux> gloss хранится в альфа каналов normal map, считается аналогично
[21:16] <Zeux> нормаль считается как взвешенная сумма нормалей
[21:17] <Zeux> ну и делается более контрастный бамп делением .z компоненты нормали пополам.

[21:18] <Zeux> [21:18] <Dale_ee> Вопрос: зачем нормал мап на каждый слой сплаттинга?
[21:19] <Zeux> ну, каждый слой представляет собой разный материал. Скажем, на одном - это песок с небольшими камнями
[21:19] <Zeux> камни - выступы
[21:19] <Zeux> на другом - трава какая-нибудь, там рельеф другой
[21:19] <Zeux> т.е. это именно не общая приблизительная нормаль для ландшафта, а нормаль для каждого материала, причем на высоко детализированной текстуре

[21:18] <Zeux> 3. деревья, трава
[21:18] <Zeux> тут два момента
[21:18] <Zeux> во-первых, поддерживается инстансинг
[21:18] <Zeux> shader-based
[21:20] <Zeux> на каждый инстанс модели отводится 4 float4
[21:21] <Zeux> 3 - world матрица
[21:21] <Zeux> последний - дополнительные коэффициенты
[21:21] <Zeux> (тот самый hemi, индекс материала)
[21:21] <Zeux> всего 200 коэффициентов отводится, т.е. можно по 50 инстансов за раз рисовать
[21:22] <Zeux> вершины - по 20 байт, позиция, текс. координата
[21:22] <Zeux> номер инстанса
[21:22] <Zeux> (индекс в табличке матриц)
[21:22] <Zeux> и доп. коэффициент
[21:23] <Zeux> показывающий, насколько вершина подвержена анимации (ветер)
[21:23] <Zeux> анимация делается следующим образом - вершина в плоскости XZ сдвигается на вектор wind (направление вектора + сила), умноженный на коэффициент из вершины
[21:23] <Zeux> и на время
[21:24] <Zeux> поэтому анимация травы в сталкере такая... страшненькая.
[21:24] <Zeux> впрочем, мне рассказали, что такое бывает в жизни. Может быть. :)

[21:25] <Zeux> теперь еще, спасибо MiF, напомнил
[21:25] <Zeux> тут спрашивали про alpha blend
[21:25] <Zeux> замечу, что alpha blend является реальной проблемой в deferred shading
[21:25] <Zeux> когда у вас есть полупрозрачный объект
[21:25] <Zeux> то в одном пикселе у вас есть 2 точки.
[21:25] <Zeux> точка полупрозрачного объекта
[21:25] <Zeux> и находящаяся ЗА ней
[21:25] <Zeux> точка сплошного объекта
[21:26] <Zeux> (или, не дай бог, еще одного полупрозрачного, и т.д.)
[21:26] <Zeux> поскольку G-buffer должен хранить всю информацию о видимой части сцены, то все очень плохо
[21:26] <Zeux> можно пытаться делать несколько слоев G-buffer
[21:26] <Zeux> но
[21:26] <Zeux> есть еще одна проблема deferred shading, о которой я не сказал.
[21:26] <Zeux> память.
[21:26] <Zeux> в сталкере используются 3 текстуры
[21:27] <Zeux> каждый пиксель занимает 8 байт.
[21:27] <Zeux> получаем 30 мегабайт в 1280x1024
[21:27] <Zeux> только на G-buffer.
[21:27] <Zeux> это и так - очень много
[21:27] <Zeux> а если делать даже два слоя - будет просто неподъемно
[21:27] <Zeux> есть разные техники, позволяющие подправить положение с занимаемой памятью, я о них говорить не буду
[21:28] <Zeux> но в целом - с  полупрозрачными объектами deferred shading работать практически не умеет.
[21:28] <Zeux> В сталкере они рисуются отдельно.

[21:28] <Zeux> Итак, я вроде все сказал про G-buffer. Давайте те, у кого остались вопросы именно по этой фазе
[21:28] <Zeux> зададут их.
[21:28] <Zeux> и двинемся дальше

[21:29] <vshabanov> а максимум 2 кости на вершину -- это не маловато?
[21:29] <Zeux> с моей точки зрения - можно было бы и больше
[21:29] <Zeux> с другой стороны - персонажи в сталкере не настолько выразительные
[21:29] <Zeux> наверное, им хватило :)
[21:29] <Zeux> подозреваю
[21:29] <Zeux> что изначально в старом рендере (dx8) было такое ограничение
[21:29] <MiF> артистов на это уламывали 5 лет назад ;)
[21:29] <Zeux> да
[21:30] <Zeux> а новый арт делать не будешь

[21:29] <_ShaMan_> для всего скелета нормально. а вот для лицевой анимации =\
[21:30] <Zeux> _ShaMan_, там ее нет:)
[21:30] <_ShaMan_> Zeux угу. я в общем :)

[21:30] <paladinrus> небольшое имхо по траве
[21:31] <paladinrus> можно было бы сделать норм и при движении в одной плоскости
[21:31] <Zeux> безусловно
[21:31] <paladinrus> просто видимо плоскость двигается как-то дёргано
[21:31] <Zeux> у них просто линейное движение, одинаковое на все травинки видимо
[21:31] <paladinrus> потому-что сам видел

[21:31] <vshabanov> полупрозрачные объекты рисуются отдельно -- это, по старинке, уже после всего DS?
[21:31] <Zeux> vshabanov, да

[21:32] <WhiteWind> Мне показалось, или у них там плохо с отсечением невидимых объектов?
[21:32] <Zeux> смотря что тебе показалось :)
[21:32] <Zeux> occlusion culling у них нет
[21:32] <Zeux> насколько я понимаю, в индорах у них порталы
[21:33] <Zeux> в остальном - у них с ним нормально
[21:33] <Zeux> точнее, Олесь в статье в GPU Gems 2 писал, что есть (occlusion culling) с использованием OQ, но я не заметил - мб убрали, мб это опция в конфиге, которую решили не ставить по-умолчанию.
[21:34] <WhiteWind> А, мне так казалось, когда я не знал про DS. Торможу

[21:34] <paladinrus> можешь формулу расчёта нормали для ландщафта привечти
[21:35] <paladinrus> как для цвета привёл %)
[21:35] <Zeux> float3 normal = mask.r * normal0 + mask.g * normal1 + mask.b * normal2 + mask.a * normal3;
[21:35] <Zeux> normal.z /= 2;
[21:36] <Zeux> если точнее
[21:36] <Zeux> normal.z /= 2; //. make bump twice as contrast (fake, remove me if possible)

[21:36] <Zeux> ну что
[21:36] <Zeux> у нас есть G-buffer - те самые три текстуры.
[21:36] <Zeux> теперь хочется получить освещение от большого-большого количества источников :)

[21:37] <Zeux> сначала - чуть-чуть о тенях.
[21:37] <Zeux> О тенях информация не очень полная по очевидным для тех, кто делал shadow maps причинам - нет доступа к коду
[21:37] <Zeux> а основное - там :)
[21:37] <Zeux> (к С++)
[21:37] <Zeux> тем не менее.
[21:37] <Zeux> Во-первых, используются несколько SM 2k x 2k
[21:38] <Zeux> они работают как пул, т.е. в них размещаются шадовмапы меньшего размера (ну и иногда такого же)
[21:38] <Zeux> для солнца вроде выделяется 1 2k x 2k
[21:38] <Zeux> для остальных - меньшие
[21:38] <Zeux> т.е. в итоге шадовмапа побита на куски
[21:38] <Zeux> в каждом - шадовмапа для отдельного источника
[21:38] <Zeux> картинок нет, к сожалению
[21:39] <Zeux> форматы шадовмапов зависят от платформы
[21:39] <Zeux> либо R32F (одноканальный float)
[21:39] <Zeux> либо D24X8
[21:39] <Zeux> (текстура глубины) - это на NVidia
[21:39] <Zeux> либо DF16/24 (какой - не знаю :)) - это на ATi
[21:40] <Zeux> как происходит чтение из них.
[21:40] <Zeux> сначала определяется примитив - "прочитать значение затененности с билинейным PCF 2x2"
[21:40] <Zeux> т.е. - прочитать 4 текселя
[21:40] <Zeux> как в билинейной фильтрации
[21:40] <Zeux> произвести сравнение с глубиной
[21:40] <Zeux> смешать полученные 4 значения билинейно.
[21:40] <Zeux> На NV этот примитив реализован в железе
[21:41] <Zeux> поэтому это просто семпл из текстуры

Страницы: 1 2 3 4 5 6 7 Следующая »

#GSC, #render, #reverse engineering, #S.T.A.L.K.E.R.

10 мая 2007 (Обновление: 17 сен. 2009)