Лекция #21. TES4: Oblivion без прикрас. Технологии рендера [Лектор - Zeux] (3 стр)
Автор: Арсений Капулкин
[21:10] <Zeux> дальше мы делаем bright pass, выкидывая слишком темные значения
[21:10] <Zeux> формула: result = 2.25 * max(tex - 0.225, 0)
[21:11] <Zeux> этот шейдер применяется, если я не ошибаюсь, к текстуре 256х256, полученной в рез-те уменьшения текстуры 800х600
[21:11] <Zeux> дальше мы берем то, что получилось (текстуру 256х256)
[21:11] <Zeux> и блурим ее в два прохода
[21:11] <Zeux> блурим мы ее по-пацански
[21:11] <Zeux> с 16 выборками
[21:12] <Zeux> матрица, насколько я помню, раскладывается в два прохода (вертикальный и горизонтальный блур)
[21:14] <Zeux> вот, а поскольку раскладывается, то можно было сделать 4 прохода по 4 выборки вместо двух проходов по 16
[21:14] <Zeux> впрочем, не думаю, что в блурринге хдр-текстуры был боттлнек
[21:15] <Zeux> осталось отрендерить на экран квад
[21:15] <Zeux> вычислив цвета по формуле:
[21:15] <Zeux> result = tex * 0.225 / max(lum.r + lum.g + lum.b, 0.225) + max(blurtex * c0.y / max(lum.r + lum.g + lum.b, 0.225), 0.015)
[21:15] <Zeux> tex - 800x600 текстура
[21:15] <Zeux> lum - значение adapted luminance
[21:15] <Zeux> blurtex - блурренная текстура 256x256
[21:15] <Zeux> c0.y - blur factor
[21:16] <Zeux> обычно он 0
[21:16] <Zeux> видимо, когда бьют по голове, он >0
[21:16] <Zeux> (для тех, кого не били по голове - изображение расплывается)
[21:17] <Zeux> вот шейдер, в котором считается эта формула: http://www.everfall.com/paste/id.php?zaqooi2qfvia
[21:17] <Zeux> замечу, что все константы (0.225, 0.015, 2.25 из формулы для bright pass)
[21:17] <Zeux> не зашиты в шейдер, а настраиваются дизайнером
[21:17] <Zeux> про gui я попозже скажу.
[21:18] <Anubis_> 1. расстояние до меша - это до центра? 2. нету резкого перехода от отсутствия спекулара к его присутствию? 3. то есть все всегда блуриццо по проходам, но тока когда бьют по голове это видно?
[21:18] <Zeux> 1. расстояние до меша - это, думаю, до центра. или до bbox.
[21:18] <Zeux> 2. есть, на самом деле, я забыл сказать
[21:18] <Zeux> в шейдере со спекуляром есть fade factor
[21:18] <Zeux> про который я говорил.
[21:18] <Zeux> 3. да, все всегда блурится
[21:18] <Zeux> но видно не всегда
[21:19] <Sark7> blurtex - это текстура из bright pass ?
[21:19] <Zeux> да
[21:20] <Zeux> ну, вернее, это текстура после bright pass и 2-ух блуров
[21:20] <Sark7> угу
[21:20] <Sark7> стандартный bloom
[21:21] <Sark7> на глаз заметен hdr вообще?
[21:21] <Zeux> да, безусловно
[21:21] <Zeux> на глаз не заметна адаптация
[21:25] <_TwilighT_> Zeux: скажи как ты сам оцениваешь арт-контент и технологию в обливионе :)
[21:25] <_TwilighT_> объективно
[21:26] <Zeux> _TwilighT_, арт-контент - модели - хорошо, даже очень, анимации - сакс. технологии - могло быть гораздо лучше по качеству исполнения технологий
[21:26] <Zeux> я об этом скажу в конце
[21:27] <Zeux> в целом - хорошо, картинка приятная очень
[21:28] <Zeux> часть 1 рендера закончена. Всего частей 4, 4-ая совсем коротенькая, там дополнения, 2-ая и 3-яя не очень длинные, короче первой :)
[21:29] <Zeux> т.к. дальше будут повторения.
[21:29] <Zeux> итак, часть 2.
[21:29] <Zeux> здесь меня интересовало две вещи
[21:29] <Zeux> 1) интерфейс (gui)
[21:29] <Zeux> 2) рендеринг персонажей
[21:29] <Zeux> поэтому не долго думая, я открыл in-game интерфейс (инвентарь), там справа показана модель человека.
[21:29] <Zeux> Итак, сначала о людях.
[21:30] <Zeux> Обливион - забавно сделанная игра по технологиям, вообще
[21:30] <Zeux> куда ни плюнь - там сделано вопреки стандартным рекомендациям
[21:30] <Zeux> итак, персонаж.
[21:30] <Zeux> он состоит из 19 частей
[21:31] <Zeux> (+-4)
[21:31] <Zeux> каждая рендерится за 1 dip
[21:31] <Zeux> части такие:
[21:31] <Zeux> 1. рот (2 челюсти без зубов, 109 тр)
[21:31] <Zeux> 2. нижняя челюсть (слабая детализация, 24 тр)
[21:31] <Zeux> 3. верхняя челюсть (достаточно подробные очертания зубов, 670 тр)
[21:31] <Zeux> 4. язык (106 тр)
[21:31] <Zeux> 5. левый глаз (465 тр)
[21:31] <Zeux> 6. правый глаз (481 тр)
[21:31] <Zeux> 7. два уха (2329 тр)
[21:31] <Zeux> 8. череп (3958 тр)
[21:31] <Zeux> 9. щит (эбонитовый - 939 тр)
[21:31] <Zeux> 10. меч (катана - 1710 тр)
[21:31] <Zeux> 11. ножны (833 тр)
[21:31] <Zeux> 12. кираса (5065 тр)
[21:31] <Zeux> 13. доспехи на предплечья (3675 тр)
[21:31] <Zeux> 14. наплечники (1936 тр)
[21:31] <Zeux> 15. поножи (3340 тр)
[21:32] <Zeux> 16. какая-то хрень (часть понож) (101 тр)
[21:32] <Zeux> 17. левая перчатка (2616 тр)
[21:32] <Zeux> 18. правая перчатка (2693 тр)
[21:32] <Zeux> 19. волосы (1720 тр. - конечно, зависит от типа волос)
[21:32] <Zeux> 9, 10, 11, 14, 16 рендерятся не всегда
[21:32] <Zeux> остальное заменяется на соотв. часть тела, если не надет соотв. доспех
[21:32] <Zeux> тр - треугольники
[21:33] <Zeux> если посчитать сумму, то детализация получается страшная :)
[21:33] <Zeux> но главное не это.
[21:33] <Zeux> главное то, что даже при однопроходном рендеринге надо потратить 19 дипов
[21:33] <Zeux> чтобы отрендерить одного персонажа.
[21:33] <Zeux> впрочем, это еще цветочки
[21:33] <Zeux> рендерятся эти части по-разному
[21:34] <Zeux> их можно логически разбить на 6 групп.
[21:34] <Zeux> вот эти группы:
[21:34] <Zeux> а. рот, челюсти, язык, глаза, (24 vs, 19 ps)
[21:34] <Zeux> б. уши (34 vs, 37 ps, basemap + facegen map 0 + facegen map 1 + normal map)
[21:34] <Zeux> в. череп (115 vs, 37 ps, basemap + facegen map 0 + facegen map 1 + normal map)
[21:34] <Zeux> г. щит, меч, ножны (38 vs, 34 ps, base + normal)
[21:34] <Zeux> д. кираса, доспехи на предплечья, наплечники, поножи, хрень, перчатки (119 vs, 34 ps, base + normal)
[21:34] <Zeux> е. волосы (22 vs, 275 ps, aniso map + base map, eye pos, hair tint, layer map, light data (8), mat alpha, normal map)
[21:34] <Zeux> числа перед vs/ps - кол-во инструкций
[21:35] <Zeux> группы г), д) - это обычное освещение, как в первой части
[21:35] <Zeux> только в пункте д) еще скиннинг
[21:35] <Zeux> (потом)
[21:35] <Zeux> разница небольшая есть
[21:36] <Zeux> тут слава богу в шейдер зашит спекуляр и умножение на диффузный цвет плюс нет attenuation
[21:36] <Zeux> в группе а) есть бамп, но нет спекуляра
[21:37] <Zeux> в группе б) в общем и целом обычный шейдинг, как в г), д)
[21:37] <Zeux> только хитрят они там с facegen maps
[21:37] <Zeux> ну и группа е) стоит особняком.
[21:37] <Zeux> Итак, налицо три интересных момента:
[21:37] <Zeux> 1) скиннинг
[21:37] <Zeux> 2) facegen
[21:37] <Zeux> 3) волосы
[21:38] <Zeux> момент 1. скиннинг.
[21:39] <Zeux> скиннятся группы в) (череп)
[21:39] <Zeux> и д) (доспехи всякие)
[21:40] <Zeux> скиннинг делается следующим образом.
[21:40] <Zeux> (шейдер не покажу, длинный больно, лень было переписывать)
[21:40] <Zeux> в каждой вершине хранится 4 индекса кости
[21:40] <Zeux> (по байту на каждый)
[21:40] <Zeux> и 3 веса костей
[21:40] <Zeux> (по float-у на каждый, 4-ый вес считается как 1 - сумма трех)
[21:41] <Zeux> матрицы костей хранятся в массиве, всего матриц 18 штук
[21:41] <Zeux> каждая матрица - 3 строки по 4 константы
[21:41] <Zeux> значит, почему 18 всего лишь
[21:41] <Zeux> это не значит, что в персонаже всего 18 костей
[21:41] <Zeux> просто для каждой части тела
[21:41] <Zeux> устанавливается свой набор матриц костей
[21:42] <Zeux> (эх, как им там руки не оторвали, в bethesda...)
[21:42] <Zeux> поскольку так получилось, что матрицы костей начинаются аж с 42-го регистра
[21:42] <Zeux> (почему так получилось - не меня спросите)
[21:42] <Zeux> то кол-во костей взято впритык под лимит в 96 констант для 1.1 шейдеров
[21:43] <Zeux> трансформируем позицию
[21:43] <Zeux> (4-мя матрицами)
[21:43] <Zeux> дальше каждый из 3-х векторов (касательная, нормаль, бинормаль)
[21:44] <Zeux> мы трансформируем всеми 4-мя матрицами
[21:44] <Zeux> (зачем, спрашивается, люди пытаются как-то усреднять веса для нормалей?)
[21:44] <Zeux> (люди - это не про bethesda)
[21:44] <Zeux> ну и все, у нас есть правильная матрица TBN
[21:44] <Zeux> мы считаем view direction в тангент спейсе (для спекуляра)
[21:45] <Zeux> лайт дирекшен в нем же
[21:45] <Zeux> ну и fade factor
[21:45] <Zeux> впрочем, опять же - думаю, что упрощение шейдера для скелетки не дало бы никакого буста
[21:46] <Zeux> на фоне всего остального это - мелочи.
[21:46] <Zeux> теперь про facegen
[21:46] <Zeux> я шейдер покажу
[21:47] <Zeux> http://www.everfall.com/paste/id.php?9wzktpxucfze
[21:47] <Zeux> вот он, собственно
[21:47] <Zeux> сразу скажу, что я не вполне понимаю его суть :)
[21:47] <Zeux> если вкратце - там берутся сначала результаты обычного освещения
[21:48] <Zeux> а дальше из двух доп. семплеров
[21:48] <Zeux> берутся какие-то (видимо) вектора
[21:48] <Zeux> и что-то с ними делается :)
[21:48] <Zeux> что делается - смотрите в комментах к PS
[21:48] <Zeux> но смысл этого я не осилил
[21:48] <Zeux> это, видимо, facegen-specific штука
[21:48] <Zeux> (для тех, кто не знает
[21:48] <Zeux> в Обливионе используется facegen - штука для генерации лиц, как ни странно :)
[21:48] <Zeux> у них на сайте можно скачать фри тул, с которым можно поиграться
[21:49] <Zeux> экспортировать модели нельзя, SDK нет - это все за 500 $, кажется)
20 апреля 2006