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

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

Автор:

[22:37] <Zeux> этот самый коэффициент при color
[22:37] <Zeux> (coeff1 / (luminance * coeff2 + coeff3))
[22:37] <Zeux> вот этот
[22:37] <Zeux> хранится в R32F текстуре 1х1
[22:37] <Zeux> как она заполняется, я скажу.
[22:37] <Zeux> ну вот, в результате выводится в PS два цвета
[22:37] <Zeux> один - result
[22:37] <Zeux> это фактически цвет, который пойдет в back buffer
[22:38] <Zeux> если не учитывать bloom, motion blur и distortion
[22:38] <Zeux> второй  считается как color / 8
[22:38] <Zeux> тем самым мы отбрасываем младшие биты цвета
[22:38] <Zeux> уменьшая точность
[22:38] <Zeux> но позвляем динамический диапазон яркости в 8 раз больше, чем в обычном цвете в RGBA8
[22:39] <Zeux> точность нам не так важна, т.к. этот цвет используется для:
[22:39] <Zeux> 1. блума (а там все равно отбрасываются маленькие значения, и все размывается)
[22:39] <Zeux> 2. подсчета средней освещенности
[22:39] <Zeux> можно было естественно делать просто A16B16G16R16F текстуру
[22:39] <Zeux> но - сделано так.

[22:40] <Zeux> итак, затем наконец-то
[22:40] <Zeux> в текстуру с цветом
[22:40] <Zeux> (там, где результат tone mapping)
[22:40] <Zeux> рендерятся полупрозрачные объекты.
[22:40] <Zeux> это частицы
[22:41] <Zeux> это огонь (огонь кстати - анимированная текстура для языка пламени)
[22:41] <Zeux> это стекла
[22:41] <Zeux> и т.д.
[22:41] <Zeux> замечу
[22:41] <Zeux> что поскольку они рисуются только в эту текстуру
[22:41] <Zeux> то их вклад не учитывается при подсчете освещенности и при bloom
[22:41] <Zeux> можно было их рисовать и в другую, деля цвет на 8 при выводе так же.

[22:42] <Zeux> затем, производится блум и одновременно считается освещенность
[22:42] <Zeux> сначала текстура с 8x dynamic range
[22:42] <Zeux> даунсемплится в текстуру 256х256
[22:43] <Zeux> в дополнение к фильтрации используется усреднение 2х2
[22:43] <Zeux> затем
[22:43] <Zeux> эта текстура в еще 3 шага
[22:43] <Zeux> даунсемплится до 1х1
[22:43] <Zeux> 256x256 -> 64x64 -> 8x8 -> 1x1
[22:44] <Zeux> когда у них была экспоненциальная зависимость от яркости
[22:44] <Zeux> то они брали логарифм на первой стадии видимо
[22:44] <Zeux> сейчас - не берут :)
[22:44] <Zeux> да, на первой же стадии
[22:45] <Zeux> из RGB получается luminance
[22:45] <Zeux> вторая стадия - фактически, обычное усреднение
[22:45] <Zeux> третья - усреднение и одновременно подсчет финальной luminance
[22:46] <Zeux> сначала считается значение на текущем кадре (по формуле, написанной выше - coeff1 / (luminance * coeff2 + coeff3))
[22:46] <Zeux> потом из текстуры 1x1 с прошлого кадра читается luminance на нем
[22:46] <Zeux> и линейно интерполируется между ними
[22:46] <Zeux> это адаптация.
[22:46] <Zeux> замечу
[22:46] <Zeux> что здесь вторая найденная мной опечатка
[22:47] <Zeux> они не клампят значение luminance
[22:47] <Zeux> т.е. они хотят его заклампить
[22:47] <Zeux> от 1/8 до 2
[22:47] <Zeux> но не клампят.
[22:47] <Zeux> после этого у нас есть текстура 1х1
[22:48] <Zeux> в которой значение для tone mapping текущего кадра (которое будет использоваться на следующем :))
[22:48] <Zeux> и мы почти готовы нарисовать наконец картинку в back buffer!

[22:48] <Zeux> последняя стадия перед финальной - если видны объекты
[22:48] <Zeux> для которых нужен distortion
[22:48] <Zeux> то они рисуются в отдельную текстуру.
[22:48] <Zeux> это аномалии
[22:48] <Zeux> это огонь
[22:49] <Zeux> это артефакты
[22:49] <Zeux> в текстуру рисуются смещения (2 числа) текстурной координаты
[22:49] <Zeux> смещения берутся из текстур
[22:49] <Zeux> есть набор таких текстур в ресурсах
[22:49] <Zeux> для разных объектов
[22:49] <Zeux> для огня текстура - анимированная
[22:49] <Zeux> ну и не только для него, наверное :)
[22:50] <Zeux> получается отдельная ARGB8 текстура

[22:50] <Zeux> ых, забыл
[22:50] <Zeux> сорри
[22:50] <Zeux> до этого есть еще размытие bloom текстуры
[22:51] <Zeux> но оно самое обычное - 2-х проходный Гаусс
[22:51] <Zeux> вертикальный и горизонтальный
[22:51] <Zeux> каждый проход - усреднение 15 семплов
[22:51] <Zeux> 7 влево, 7 вправо.
[22:51] <Zeux> получается 15х15 блур

[22:50] <Zeux> и наконец
[22:50] <Zeux> рисуется квад в backbuffer.
[22:50] <Zeux> простой случай - в пиксельном шейдере делается выборка из текстуры с результатами tone mapping
[22:51] <Zeux> смешивание ее с результатом выборки из bloom текстуры
[22:52] <Zeux> текстурная координата либо тупо [0,1] из вершины
[22:52] <Zeux> либо смещенная на значение в текстуре с distortion
[22:52] <Zeux> случай сложнее - есть motion blur
[22:52] <Zeux> в этом случае есть 2 матрицы
[22:52] <Zeux> с прошлого кадра и с этого
[22:53] <Zeux> ими трансформируется позиция из G-buffer
[22:53] <Zeux> между ними берется разность (и обрезается константами)
[22:53] <Zeux> это типа скорость.
[22:53] <Zeux> дальше кроме 1 семпла из текстуры с цветом
[22:53] <Zeux> делаются еще 11.
[22:53] <Zeux> в направлении этой скорости
[22:54] <Zeux> т.е. texcoord + velocity * coeff * 1, texcoord + velocity * coeff * 2, ...
[22:54] <Zeux> ну и усредняются

[22:56] <Zeux> [22:55] <paladinrus> я так понимаю вектор скорости один только для камеры?
[22:56] <Zeux> [22:55] <paladinrus> то-есть движение других объектов на моушн блюр не влияет?
[22:56] <Zeux> да.
[22:56] <Zeux> это не per object

[22:54] <Zeux> и наконец
[22:54] <Zeux> у deferred shading есть еще одна проблема.
[22:54] <Zeux> о которой я не сказал
[22:55] <Zeux> с ним очень плохо совместим хардварный антиальясинг
[22:55] <Zeux> я бы сказал, вообще не совместим - если DX9, по кр. мере
[22:55] <Zeux> это плохо.

[22:55] <cppg> FP16?
[22:56] <Zeux> cppg, MRT

[22:55] <Zeux> понятно, что финальное изображение в back buffer можно отрисовать с АА - но это не даст нужного эффекта, очевидно
[22:55] <Zeux> т.к. нужно - размыть края полигонов
[22:57] <Zeux> проблему очевидно решать можно
[22:57] <Zeux> например, сделать supersampling.
[22:57] <Zeux> было 30 метров на G-buffer
[22:57] <Zeux> стало 60 или 120.
[22:57] <Zeux> не очень практично, зато работает.
[22:57] <Zeux> в Сталкере пошли другим путем
[22:58] <Zeux> у них есть не совсем АА
[22:58] <Zeux> но алгоритм, размывающий границы полигонов
[22:58] <Zeux> т.е. эффект нужный в общем-то достигается
[22:58] <Zeux> замечу - оно по умолчанию выключено
[22:58] <Zeux> но можно включить, r2_aa on в консоли
[22:58] <Zeux> делается так.
[22:59] <Zeux> для нормалей и для глубин пикселей получается значение, характеризующее
[22:59] <Zeux> насколько в данном пикселе разные глубины/нормали у соседей
[22:59] <Zeux> считается таким образом:
[22:59] <Zeux> для нормалей
[22:59] <Zeux> делаются семплы соседей слева/справа/сверху/снизу
[22:59] <Zeux> (соседних пикселей)
[23:00] <Zeux> считается 4 скалярных произведения нашей нормали и нормалей соседей
[23:00] <Zeux> дальше считается, сколько из этих 4-х достаточно отклонены от нашей
[23:00] <Zeux> (это threshold на dot, если dot > threshold - считается, что не отклонены
[23:00] <Zeux> если <= - отклонены
[23:00] <Zeux> threshold = 0.8 по умолчанию)
[23:01] <Zeux> полученное число умножается на коэффициент (который 1/4 :))
[23:01] <Zeux> получается число от 0 до 1, 0 - у всех соседей сильно другие нормали, 1 - у всех похожие
[23:01] <Zeux> для глубин то же самое
[23:02] <Zeux> только анализируются 8 пикселей
[23:02] <Zeux> (еще соседи по диагоналям)
[23:02] <Zeux> анализируются только пары напротив
[23:02] <Zeux> (т.е. считается, насколько отличается сумма глубин в пикселях, симметричных относительно нашего
[23:02] <Zeux> от удвоенной глубины в нашем)
[23:02] <Zeux> ну и вместо dot используется разность.
[23:03] <Zeux> дальше считается коэффициент для AA, это (1 - normal_discontinuity_factor * depth_discontinuity_factor) * aa_coeff
[23:03] <Zeux> факторы - это только что посчитанные числа
[23:03] <Zeux> и делается смешивание цвета в данном пикселе
[23:03] <Zeux> с средним арифметическим цветов в 4-х соседях
[23:03] <Zeux> с коэфициентом, посчитанным по указанной формуле.ю
[23:04] <Zeux> скорость от AA у меня практически не просаживается
[23:04] <Zeux> "у меня" - это на 8800 GTX.

[23:04] <Zeux> наконец, поверх всего этого безобразия рисуется GUI
[23:05] <Zeux> GUI рисуется по дипу за контрол, текстура - одна большая на все контролы
[23:05] <Zeux> VB один, впрочем
[23:05] <Zeux> ну и если есть бинокль
[23:05] <Zeux> то рисуется текстура бинокля.
[23:05] <Zeux> с блендом
[23:05] <Zeux> шрифты рисуются как обычно, ничего особенного.

[23:05] <Zeux> Я рассказал все, кроме обещанного клевого бонуса от DS.

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

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

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