Лекция #21. TES4: Oblivion без прикрас. Технологии рендера [Лектор - Zeux] (2 стр)
Автор: Арсений Капулкин
[20:34] <Zeux> Практически вся геометрия хранится в стрипах
[20:34] <Zeux> практически все буферы - MANAGED
[20:34] <Zeux> текстуры не помню, не посмотрел :(
[20:34] <Zeux> итак, поехали - детально разберем каждый проход по мере возможности.
[20:35] <Zeux> первый проход для интерьера.
[20:35] <Zeux> Проводится освещение 4-мя источниками
[20:35] <Zeux> (1 направленный, 3 точечных)
[20:35] <Zeux> без умножения на диффузную текстуру (несмотря на то, что сэмплер диффузной текстуры биндится и лукап из него идет - драйвер это оптимизирует)
[20:35] <Zeux> сейчас покажу шейдеры
[20:36] <Zeux> и вкратце прокомментирую
[20:37] <Zeux> http://www.everfall.com/paste/id.php?g7orgzev1baw - вершинный
[20:36] <Zeux> http://www.everfall.com/paste/id.php?pnp9f8mggzki - пиксельный
[20:37] <Zeux> итак, в этом проходе происходит освещение. Оно, как водится, per-pixel
[20:37] <Zeux> и вообще bump mapping
[20:37] <Zeux> в каждой вершине хранятся все три вектора (tangent, binormal, normal)
[20:38] <Zeux> пробовали ли они хранить только два и восстанавливать третий cross product-ом, я не знаю
[20:38] <Zeux> дальше ими трансформируются вектора источников света
[20:38] <Zeux> плюс еще идет в VS подсчет коэффициентов аттенуации
[20:39] <Zeux> дальше в PS вычисляется стандартно N.L для каждого источника
[20:39] <Zeux> складываются результаты, умноженные на цвет источника
[20:39] <Zeux> (константы в PS)
[20:39] <Zeux> прибавляется ambient color
[20:39] <Zeux> и выводится.
[20:39] <Zeux> обращаю внимание - никакого specular пока нет.
[20:39] <Zeux> Вывод компилятора они, похоже, не смотрели
[20:39] <Zeux> т.к. например expand нормали
[20:40] <Zeux> (normal * 2 - 1)
[20:40] <Zeux> это на самом деле одна операция mad
[20:40] <Zeux> и правильный код компилируется именно в нее
[20:40] <Zeux> у них же оно считается в два приема
[20:40] <Zeux> 1. normal - 0.5
[20:40] <Zeux> 2. (normal - 0.5) + (normal - 0.5)
[20:40] <Zeux> к сожалению, драйвер оптимизирует это :(
[20:41] <Zeux> к сожалению - потому что можно писать невменяемый код
[20:41] <Zeux> и не получать за него по рукам.
[20:41] <Zeux> пару слов об attenuation скажу
[20:41] <Zeux> у них там 4 выборки из attenuation текстуры.
[20:41] <Zeux> я ни разу не видел, чтобы она была не NULL. Но (!)
[20:42] <Zeux> как я выяснил позавчера абсолютно случайно, в 3-м перфхуде глючит слегка отображение сэмплеров, использующихся при рендеринге
[20:42] <Zeux> иногда показывается не та текстура.
[20:42] <Zeux> отсюда я делаю вывод, что возможно в данном случае он тоже глючил
[20:42] <Zeux> и на самом деле atten map там была
[20:43] <Zeux> иначе шейдер ускоряется, хотя на NV40 разница невелика
[20:43] <Zeux> на самом деле, есть 2 разновидности этого шейдера
[20:43] <Zeux> первую я вам показал
[20:44] <Zeux> вторая почти такая же
[20:44] <Zeux> кроме того, что там есть еще self illumination map
[20:44] <Zeux> и к результату добавляется значение, выбранное из нее
[20:44] <Zeux> получается светимость
[20:44] <Zeux> этот шейдер встречается редко, но где-то встречается
[20:44] <Zeux> сейчас я еще расскажу про второй проход
[20:45] <Zeux> и сделаем перерыв на вопросы.
[20:45] <Zeux> Значит, второй проход - это то же самое, что первый :)
[20:45] <Zeux> в нем с add blend-ом рендерятся те меши
[20:45] <Zeux> на которые 3 источников не хватило
[20:45] <Zeux> и хочется еще.
[20:45] <Zeux> замечу, что шейдеров на 4 точечных источника
[20:46] <Zeux> или на 1 точечный
[20:46] <Zeux> нет.
[20:46] <Zeux> поэтому, если вы хотите в Обливионе осветить что-то 4-мя источниками
[20:46] <Zeux> то вам придется освещать это:
[20:46] <Zeux> а) 6-ю
[20:46] <Zeux> б) в 2 прохода
[20:46] <Zeux> естественно, там автоматом ставится цвет неиспользуемых источников в 0.
[20:46] <Zeux> Хочу заметить, что при наличии вменяемой системы материалов
[20:47] <Zeux> (см. доклад Шодана на прошлой КРИ + мой диалог с ним в сообществе)
[20:47] <Zeux> такой проблемы не возникает.
[20:47] <Zeux> Итак, хочу отметить
[20:47] <Zeux> что после первых двух проходов
[20:48] <Zeux> у нас есть в буфере цвета результат диффузного + амбиентного освещения
[20:48] <Zeux> спекуляра пока нет.
[20:48] <Zeux> вопросы по тому, что уже сказал? или пожелания? или еще что-то? :)
[20:48] <Anubis_> дай линк
[20:48] <Zeux> линк на что?
[20:48] <Anubis_> ч0 за сообщество и разговор с шоданам
[20:48] <Zeux> сообщество gamedev_lecture
[20:49] <Anubis_> ну, на обсуждение..
[20:49] <Zeux> Анубис, в статьях
[20:49] <Zeux> называется "Не лекция. ..."
[20:51] <Zeux> следующий проход (53 dip) - это проход диффузного цвета
[20:52] <Zeux> из диффузной текстуры выбирается цвет
[20:52] <Zeux> и выводится.
[20:52] <Zeux> все это происходит с mul-blend-ом
[20:52] <Zeux> поэтому в рез-те мы получаем освещенные объекты
[20:52] <Zeux> (после третьего прохода)
[20:52] <Zeux> замечу, что мне немного непонятно, почему только 53 дипа
[20:52] <Zeux> возможно, у них стоит occlusion culling на первый проход
[20:52] <Zeux> возможно, нет
[20:53] <Zeux> вообще, определение видимости у них немного плохое :)
[20:54] <Zeux> но это нас сейчас не интересует особо. Вернее, интересовало бы, если бы оно было качественное
[20:54] <Zeux> :)
[20:54] <Zeux> должен возникнуть резонный вопрос.
[20:54] <Zeux> "а почему было не поместить умножение на цвет в шейдер?"
[20:55] <Zeux> думаю, что ответ на него все тот же.
[20:55] <Zeux> "отсутствие вменяемой системы материалов"
[20:55] <Zeux> вообще, для рендера система материалов - одна из самых важных вещей
[20:55] <Zeux> тут, похоже, про нее забыли.
[20:55] <Zeux> дальше. четвертый проход - спекуляр.
[20:56] <Zeux> он включен только для тех мешей
[20:56] <Zeux> которые попадают в Specular Distance
[20:56] <Zeux> (есть в настройках игры)
[20:56] <Zeux> у меня оно (distance) по максимуму - поэтому тоже 53 дипа
[20:56] <Zeux> шейдер там абсолютно стандартен, я переписывать не стал
[20:57] <Zeux> тоже аттенуация, все почти так же, как в первом проходе
[20:57] <Zeux> specular power контролируется константой
[20:57] <Zeux> она 25 в индоре
[20:57] <Zeux> на мешах, на которые смотрел
[20:58] <Zeux> вот, дальше
[20:58] <Zeux> да, резонный вопрос - "почему не запихнуть спекуляр в тот же шейдер". Ответ тот же :)
[20:59] <Zeux> проход 5 пропустим (env map) - там тоже нет ничего интересного, чесслово :)
[20:59] <Zeux> а вот проход 6...
[20:59] <Zeux> бахрома ковра.
[20:59] <Zeux> шейдер... в 157 инструкций
[20:59] <Zeux> (пиксельный)
[20:59] <Zeux> там анизотропное освещение
[21:00] <Zeux> визуально, правда, я его на бахроме не заметил
[21:00] <Zeux> но кого это волнует?
[21:00] <Zeux> шейдер очень адский :) я не буду про него рассказывать, потому что не знаю точно всего
[21:00] <Zeux> скажу лишь, что там считается штука
[21:00] <Zeux> с которой мы еще встретимся
[21:00] <Zeux> называется штука fade factor
[21:00] <Zeux> я подробно расскажу в ландшафте
[21:01] <Zeux> на пальцах - зависимость альфа значения выходного цвета от расстояния
[21:01] <Zeux> с помошью этого делается fade in/fade out
[21:01] <Zeux> для дальних объектов
[21:01] <Zeux> проход 7 - обмундирование. Я расскажу об этом дальше.
[21:02] <Zeux> вот, наконец, мы дошли до HDR.
[21:02] <Zeux> тут я остановлюсь очень подробно.
[21:02] <Zeux> итак, к проходу 8 у нас есть текстура 800x600 , floating point, в которой содержится изображение сцены
[21:02] <Zeux> сначала нам надо посчитать luminance
[21:02] <Zeux> average luminance для сцены, если точнее
[21:02] <Zeux> считается оно так:
[21:03] <Zeux> сначала тупо рендерим в RT меньшего размера:
[21:03] <Zeux> 800x600 -> 256x300 -> 256x256
[21:04] <Zeux> дальше - рендерим с усреднением (без весов - просто среднее арифметическое) 4 соседних значений в текстуру в 4 раза меньшего размера (по каждой оси)
[21:04] <Zeux> 256x256 -> 64x64 -> 16x16 -> 4x4 -> 1x1
[21:05] <Zeux> дополнительный эффект, видимо, получается из-за билинейной фильтрации при смещении изображения
[21:05] <Zeux> мы получили текстуру 1х1
[21:05] <Zeux> в которой - average luminance для сцены.
[21:06] <Zeux> дальше мы производим то, что называется адаптацией глаза
[21:07] <Zeux> по формуле lerp(adapted luminance, average luminance, 1 - hdrparam ^ time);
[21:07] <Zeux> здесь adapted luminance - значение с прошлого кадра
[21:07] <Zeux> average luminance - вычисленное нами только что значение
[21:07] <Zeux> hdrparam - некоторый параметр, тут он 2.25
[21:07] <Zeux> time - дельта времени
[21:07] <Zeux> на самом деле, не совсем по такой формуле, там ее результаты чуть-чуть корректируются
[21:08] <Zeux> шейдер вот: http://www.everfall.com/paste/id.php?wh4swz23w8aq
[21:08] <Zeux> на словах, они берут это значение
[21:09] <Zeux> и если оно слишком большое, то урезают его
[21:09] <Zeux> видимо, потому что слишком большие значения никто не любит, вот у Сарка, кажется, страшные проблемы растеризации были
20 апреля 2006