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

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

Автор:

[20:31] <Zeux> поступил вопрос
[20:32] <Zeux> [20:31] <MiF> нафига так заморачиваться? ;)
[20:32] <Zeux> отвечаю - в принципе, вроде как и незачем
[20:32] <Zeux> т.е. скорее всего, это не заметно
[20:32] <Zeux> но - увеличение точности ни к чему плохому привести не может, а боттлнек будет - далеко не в вершинном шейдере.

[20:33] <Zeux> Итак, что же делает VS?
[20:33] <Zeux> 1. декодирование текстурных координат
[20:34] <Zeux> 2. трансформация позиции в view space и в projection space
[20:34] <Zeux> (view - для PS, projection - чтобы меш нарисовать где надо)
[20:35] <Zeux> 3. создание матрицы, переводящей из tangent space в view space
[20:35] <Zeux> (это матрица, переводящая из tangent в world (составленная из t, b, n векторов), умноженная на view матрицу)
[20:36] <Zeux> 4. дополнительные данные для PS
[20:36] <Zeux> а именно:
[20:36] <Zeux> а. view-vector сразу в tangent space (нужен для parallax, скажу, когда будет PS)
[20:37] <Zeux> b. текстурная координата для detail текстуры (это текстурная координата для прочих текстур, умноженная на коэффициент тайлинга)
[20:37] <Zeux> и все
[20:37] <Zeux> :)
[20:37] <Zeux> итак, на входе в PS:
[20:37] <Zeux> view space позиция, 3 текстурные координаты (обычная, detail и lightmap), view vector в tangent space
[20:38] <Zeux> и цвет, в котором normal.w (ambient occlusion coeff.)

[20:38] <Zeux> в PS все еще хитрее
[20:38] <Zeux> используются следующие текстуры:
[20:39] <Zeux> albedo (диффузная текстура) - DXT1 формат
[20:39] <Zeux> normal map (DXT5) + normal error map (DXT5)
[20:39] <Zeux> detail map (DXT5)
[20:39] <Zeux> ну и лайтмап, тоже DXT5
[20:40] <Zeux> в normal map находится нормаль во всех 4 каналах (сейчас скажу)
[20:40] <Zeux> в normal error map в rgb находится значение
[20:40] <Zeux> использующееся для корректировки нормали (сейчас скажу :)), в alpha - высота.
[20:41] <Zeux> сначала происходит семпл высоты из normal error map, который вместе с view vector используется для смещения
[20:41] <Zeux> текстурной координаты на eye_vector * height * coeff.
[20:41] <Zeux> это parallax mapping, на тему него есть пейпры.
[20:41] <Zeux> после этого по смещенной текстурной координате
[20:42] <Zeux> делаются выборки из albedo, normal, normal error карт
[20:42] <Zeux> нормаль считается следующим образом:
[20:42] <Zeux> (normal.wzy - 0.5) + (normal_error.xyz - 0.5)
[20:42] <Zeux> пояснения.
[20:43] <Zeux> в карте нормалей нормаль хранится в виде, предложенном ATi
[20:43] <Zeux> один канал - в альфе, остальные - в двух цветовых каналах
[20:43] <Zeux> сделано для того, чтобы уменьшить ошибку от сжатия.
[20:43] <Zeux> (от сжатия DXT)
[20:43] <Zeux> обращаю особое внимание на то
[20:43] <Zeux> что XYZ нормали хранится в ABG (wzy) каналах карты
[20:44] <Zeux> это связано с тем, что свиззл wzyx поддерживается в ps.2.0
[20:44] <Zeux> в отличие от wxyz и прочих
[20:44] <Zeux> поэтому декодирование не занимает больше инструкций, чем должно
[20:44] <Zeux> но, даже после этого все равно остаются ошибки из-за DXT сжатия
[20:44] <Zeux> потому что DXT сжатие - lossy.
[20:45] <Zeux> они корректируются дополнительным вектором из той самой normal error map.
[20:45] <Zeux> Наверняка, есть отдельная утилитка, по карте нормалей и высот генерирующая эти карты.
[20:45] <Zeux> Эта нормаль - в tangent space
[20:45] <Zeux> он разный в разных пикселях модели
[20:46] <Zeux> поэтому нормаль трансформируется в view space.
[20:46] <Zeux> Замечу, что в normal error map использованы все 4 канала (значение для корректировки плюс высота), а в normal map - все, кроме красного
[20:46] <Zeux> в красном канале находится gloss factor - попиксельный коэффициент для спекуляра
[20:47] <Zeux> т.е. у нас есть нормаль (в view space), gloss factor и высота
[20:48] <Zeux> кстати, в вычислении высоты в шейдере сталкера опечатка - она берется не из alpha канала normal error, а из blue.

[20:48] <Zeux> далее, происходит семпл из detail текстуры
[20:49] <Zeux> и финальный цвет считается как albedo.rgb * detail.rgb * 2
[20:49] <Zeux> финальный gloss factor - gloss * detail.a * 2
[20:49] <Zeux> умножение на 2 - затем, чтобы можно было как засветлять цвет (значения от 0.5 до 1)
[20:49] <Zeux> так и затемнять (0-0.5)
[20:50] <Zeux> наконец, выводим данные в G-buffer!
[20:50] <Zeux> в первую текстуру идет, напомню, нормаль (которая нормализуется перед записью)
[20:50] <Zeux> и hemi. hemi - это коэффициент освещенности, в случае наличия лайтмапа он считается как среднее между r, g, b каналами лайтмапа
[20:51] <Zeux> в случае отсутствия берется из данных вершины (см. выше)
[20:51] <Zeux> во вторую текстуру идет позиция и индекс материала
[20:51] <Zeux> индекс материала - либо константа шейдера (если нет лайтмапа), либо alpha-канал лайтмапа

[20:51] <Zeux> позиция считается хитро :)
[20:52] <Zeux> все, наверное, в курсе, что есть такой displacement mapping
[20:52] <Zeux> когда смещаются вершины на нормаль * высоту * коэффициент
[20:52] <Zeux> если вершин много - получается красиво
[20:53] <Zeux> так вот, выводится не оригинальная позиция, а позиция, смещенная на нормаль * высоту * коэффициент
[20:53] <Zeux> понятное дело, это не сделает видимых выступов
[20:53] <Zeux> но!
[20:53] <Zeux> эта модификация делает так, что тени при отбрасывании считаются так, как будто пиксели действительно сдвинуты
[20:53] <Zeux> на указанную высоту
[20:54] <Zeux> т.е. если у вас есть плоскость, на которой normal mapping
[20:54] <Zeux> то без этой модификации тень на плоскость будет ровной
[20:54] <Zeux> а с ней - будет искривляться, как бы ложась на действительно искривленную поверхность
[20:54] <Zeux> надеюсь, понятно

[20:54] <Zeux> [20:54] <paladinrus> так это получается РОМ в упрощённом варианте?
[20:54] <Zeux> если это про параллакс
[20:55] <Zeux> то в принципе да, это POM в упрощенном варианте.

[20:55] <Zeux> и, наконец
[20:55] <Zeux> в третью текстуру выводится цвет в rgb и gloss factor в a (см. выше)
[20:56] <Zeux> замечу, что тут есть очевидные вариации
[20:56] <Zeux> может не быть normal map
[20:56] <Zeux> может не быть detail map
[20:56] <Zeux> может не быть light map
[20:56] <Zeux> может не быть ничего, кроме albedo :)
[20:56] <Zeux> и т.д.
[20:56] <Zeux> все эти вариации очевидны, они разруливаются #ifdef в шейдерах
[20:56] <Zeux> и останавливаться на них я не буду.
[20:57] <Zeux> Есть несколько маленьких модификаций
[20:57] <Zeux> Но я думаю, о них надо после перерыва.

[20:57] <cppg> Ламерский вопрос: откуда ты знаешь, есть ли там ифдев? или он реально есть в сырцах?
[20:58] <Zeux> тебя не было в начале лекции - к счастью, шейдеры хранятся в ресурсах в виде HLSL
[20:58] <Zeux> и к счастью, есть распаковщик.
[20:58] <Zeux> без этого информация была бы менее подробной и с большим количеством неточностей :)

[20:58] <kas> пачиму дифузная текстура дхт1, они альфу неюзают?
[20:59] <Zeux> при рендеринге решеток юзается DXT5
[20:59] <Zeux> ну и прочего с альфой

[20:59] <cppg> А когда он их компиляет? на старте, что тормозно, или on demand, что совсем плохо?
[20:59] <Zeux> cppg, на старте вроде как

[20:59] <UFOnaut> кстати, да, как деферред живёт с прозрачностью в сталкере?
[20:59] <Zeux> UFOnaut, то, что с альфа тестом - понятно, как живет
[20:59] <Zeux> то, что надо блендить (частицы, огонь) - рендерится потом
[20:59] <Zeux> и не освещается.
[20:59] <Zeux> решетки - только с альфа тестом, трава - тоже

[21:01] <__Joe> G-buffer как расшифровывается?
[21:01] <Zeux> __Joe, geometry buffer
[21:01] <Zeux> потому что в нем хранится информация о геометрии

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

[21:03] <Dorfe> а сколько DIP'ов в сталкере?..
[21:03] <Zeux> в простом индоре - 1.5 тысячи
[21:03] <Zeux> в аутдоре - 2.5
[21:03] <Zeux> из-за теней.
[21:04] <Zeux> не было бы теней, было бы 100-400 :)
[21:04] <Zeux> количество треугольников - от 700к до 1.2к примерно

[21:06] <Zeux> количество треугольников в отдельных моделях
[21:06] <Zeux> дерево - 720
[21:06] <Zeux> куст - 250
[21:07] <Zeux> персонажи - 4.5 к
[21:07] <Zeux> оружие - 1.5 к примерно
[21:07] <Zeux> из 4.5 к 4к - тело, 0.5к - лицо

[21:07] <UFOnaut> стрипы?
[21:07] <Zeux> нет, не стрипы

[21:09] <Zeux> на всякий случай, еще раз - шейдеры действительно компилируются при загрузке
[21:09] <Zeux> каждый раз
[21:09] <Zeux> проверить очень просто, я убирал блур для теней
[21:09] <Zeux> чтобы понять, какого они реально разрешения :)
[21:09] <Zeux> об этом позже, впрочем.

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

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

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