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

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

Автор:

[21:41] <Zeux> на ATi делается FETCH4
[21:41] <Zeux> (на новых ATi можно выбрать за 1 инструкцию сразу 4 пикселя (2х2) из одноканальной текстуры. Есть пейпры в ATi SDK)
[21:41] <Zeux> либо просто 4 семпла со сравнением, если его нет
[21:42] <Zeux> поправка, для ATi используется всегда DF24.
[21:42] <Zeux> Дальше этот примитив используется 4 раза
[21:43] <Zeux> семплинг с текс. координатой, сдвинутой на (+-1, +-1)
[21:43] <Zeux> полученные 4 значения суммируются и делятся на 4
[21:43] <Zeux> получается как бы PCF 4x4
[21:43] <Zeux> не совсем так, но похоже :)
[21:43] <Zeux> также для солнца поддерживается jittered sampling
[21:44] <Zeux> есть 2 текстуры со случайными смещениями (в каждом пикселе хранятся 2 float2 смещения)
[21:44] <Zeux> смещения читаются из текстуры, используются для смещения текс. координаты
[21:44] <Zeux> и делается уже выборка.
[21:45] <Zeux> для этих текстур генерируются текс. координаты в зависимости от позиции
[21:45] <Zeux> это известный метод, опять же - интересно - ищите пейпры :)
[21:45] <Zeux> и кстати о нем говорил Семен в своей лекции, кажется.
[21:45] <Zeux> Вопрос omni лайтов решается просто
[21:45] <Zeux> omni лайт представлен 6 спот лайтами.
[21:47] <Zeux> тени съедают основную массу DIPs
[21:47] <Zeux> порядка 1.5 тысяч.
[21:47] <Zeux> в среднем.
[21:47] <Zeux> что касается техники, используемой для генерации матриц тени
[21:48] <Zeux> по имеющейся информации, используются различные перспективные техники
[21:48] <Zeux> более полной информации нет.
[21:48] <Zeux> по очевидным причинам.
[21:48] <Zeux> перспективность кстати легко заметить, если отключить фильтрацию теней
[21:48] <Zeux> в шейдерах
[21:48] <Zeux> при повороте камеры край теней даже от статических лампочек - будет плыть :)

[21:49] <Zeux> так, с тенями все
[21:49] <Zeux> теперь собственно освещение.
[21:49] <Zeux> Следующая фаза после заполнения G-buffer в сталкере - создание текстуры
[21:49] <Zeux> формата A16B16G16R16F
[21:49] <Zeux> с информацией о освещенности пикселей
[21:49] <Zeux> конкретно, в альфа канале хранится спекулярная составляющая (бликовая т.е.)
[21:49] <Zeux> в rgb - диффузная.
[21:50] <Zeux> заполняется текстура очень просто - рендерятся примитивы, соответствующие источникам света
[21:50] <Zeux> т.е.
[21:50] <Zeux> цель в том
[21:50] <Zeux> чтобы отрисовать такой примитив
[21:50] <Zeux> который накроет все пиксели в G-buffer
[21:50] <Zeux> которые могут получить свет от этого источника
[21:50] <Zeux> и в каждом пикселе в пиксельном шейдере - посчитать освещение.
[21:50] <Zeux> в forward rendererах
[21:51] <Zeux> обычно для оптимизации освещения делают хитрые выборки
[21:51] <Zeux> т.е. есть скажем omni источник, у него есть радиус
[21:51] <Zeux> дальше него он не светит.
[21:51] <Zeux> поэтому дополнительный проход с ним можно делать лишь для тех мешей
[21:51] <Zeux> чей bbox пересекается со сферой источника.
[21:51] <Zeux> в deferred shading все проще - для omni источника рендерится сфера.
[21:52] <Zeux> честная сфера, из полигонов.
[21:52] <Zeux> она покрывает лишь те пиксели, которые могут быть освещены источником, очевидно
[21:52] <Zeux> (сфера рендерится без depth testwrite)
[21:52] <Zeux> для directional light рендерится full screen quad
[21:52] <Zeux> для spot - сектор шара
[21:53] <Zeux> ну т.е. вырезанный из шара кусочек :)

[21:53] <Zeux> [21:53] <paladinrus> вопрос:размер сфера зависит от расстояния до источника или как?
[21:53] <Zeux> размер сферы зависит исключительно от источника
[21:53] <Zeux> т.е. рисуется сфера
[21:53] <Zeux> у которой центр - в позиции источника
[21:53] <Zeux> и радиус - равный радиусу источника
[21:53] <Zeux> если бы мы нарисовали ее просто в цвет в обычном рендерере
[21:54] <Zeux> то она покрыла бы те пиксели, которые находятся внутри сферы
[21:54] <Zeux> т.е. как раз то, что нам надо
[21:54] <Zeux> надеюсь, ясно :)

[21:54] <Zeux> итак, для каждого источника света рендерится такой примитив
[21:54] <Zeux> в пискельном шейдере считается освещение (сейчас скажу, как)
[21:55] <Zeux> и результат складывается с уже хранящимся в текстуре.
[21:55] <Zeux> если карточка поддерживает блендинг для fp текстур, то используется просто аддитивный блендинг
[21:55] <Zeux> если не поддерживает - 2 текстуры
[21:55] <Zeux> и сложение в шейдере.
[21:55] <Zeux> т.е. отрендерили в одну, дальше отрендерили во вторую, складывая значение с цветом в первой
[21:55] <Zeux> дальше отрендерили в первую, складывая значение с цветом из второй
[21:55] <Zeux> etc.

[21:56] <Zeux> итак
[21:56] <Zeux> пиксельный шейдер.
[21:56] <Zeux> хочу остановиться на вопросе различных материалов в deferred shading
[21:56] <Zeux> если у нас есть объекты, для которых освещение считается по-разному
[21:57] <Zeux> (скажем, phong на одном, blinn на другом, еще что-нибудь на третьем)
[21:57] <Zeux> то в forward renderer ситуация решается очень просто - нужно поставить нужные шейдеры
[21:57] <Zeux> и отрисовать.
[21:57] <Zeux> поскольку в deferred shading мы считаем освещение для одного источника света разом
[21:58] <Zeux> то для объектов с разными материалами в пиксельном шейдере придется как-то проверять, какой там материал
[21:58] <Zeux> и делать соответствующие вычисления.
[21:58] <Zeux> напомню, что информация о материале - есть
[21:58] <Zeux> в одной из текстур G-buffer.
[21:58] <Zeux> можно делать dynamic branching
[21:58] <Zeux> (if material == 0 ... else if ... else ...)
[21:58] <Zeux> но это дорого и грустно
[21:58] <Zeux> в сталкере используется чудесный метод.
[21:59] <Zeux> ставится ограничение на используемую BRDF
[21:59] <Zeux> это должна быть ф-ия ровно от двух параметров
[21:59] <Zeux> dot(N, L) и dot(N, H)
[21:59] <Zeux> (зря я сказал про фонга и блинна, ну ладно)
[22:00] <Zeux> поэтому становится возможным следующий трик:
[22:00] <Zeux> делается 3д текстура.
[22:00] <Zeux> по ширине и высоте - dot(N, L) и dot(N, H)
[22:00] <Zeux> по глубине - материал.
[22:00] <Zeux> текстура размером 128х256х4
[22:00] <Zeux> понятно, что никто не мешает делать больше материалов или меньше точность на dot(N, L) или dot(N, H)
[22:00] <Zeux> или еще что-нибудь в таком стиле :)
[22:01] <Zeux> формат текстуры - A8L8
[22:01] <Zeux> в luminance хранится диффузная составляющая
[22:01] <Zeux> в alpha - specular.
[22:01] <Zeux> итак, в пиксельном шейдере рассчитываются dot(N, L) и dot(N, H)
[22:01] <Zeux> делается семпл из 3д текстуры
[22:02] <Zeux> полученные значения умножаются на коэффициент затененности
[22:02] <Zeux> (если нет теней, он 1, если есть - я уже рассказывал, как он считается)
[22:02] <Zeux> на attenuation
[22:02] <Zeux> затухание квадратичное, формула - 1 - distance_to_light_source_squared / radius_of_light_source_squared
[22:03] <Zeux> (очевидно, в случае направленных источников затухания нет)
[22:03] <Zeux> еще на hemi, которое в G-buffer
[22:03] <Zeux> спекуляр умножается еще и на gloss :)
[22:03] <Zeux> который тоже в G-buffer
[22:04] <Zeux> для солнца там все чуть хитрее, но в целом так же
[22:04] <Zeux> еще на spot источниках
[22:04] <Zeux> могут быть текстуры дополнительные
[22:04] <Zeux> прожекторы.
[22:04] <Zeux> либо просто текстура с белым кругом посредине
[22:04] <Zeux> либо более хитрый круг (для фонаря)
[22:04] <Zeux> либо совсем что-то необычное
[22:04] <Zeux> если такое есть - rgb результата умножается еще и на значение в ней.
[22:05] <Zeux> таким образом, считаются все компоненты освещенности
[22:05] <Zeux> и результат записывается в ту самую текстуру

[22:05] <Zeux> замечу
[22:05] <Zeux> что поскольку используется пул для shadow map
[22:05] <Zeux> то есть вероятность того, что не для всех источников все SM влезут в пул разом.
[22:06] <Zeux> в таком случае сначала рисуются в SM все источики, для которых места хватило
[22:06] <Zeux> потом делается заполнение текстуры с освещенностью
[22:06] <Zeux> потом в SM рендерятся тени от источников, для которых места не хватило
[22:06] <Zeux> опять делается заполнение текстуры
[22:06] <Zeux> и т.д. :)

[22:06] <Zeux> итак, резюмируя
[22:07] <Zeux> после данного шага у нас есть:
[22:07] <Zeux> 1. G-buffer с информацией о геометрии
[22:07] <Zeux> 2. текстура с diffuse и specular компонентами освещенности
[22:07] <Zeux> причем, отмечу, цвет в G-buffer и освещенность в текстуре - high dynamic range
[22:07] <Zeux> (floating-point)

[22:08] <Zeux> [22:07] <MiF> какие там 4 вида шейдинга?
[22:08] <Zeux> не знаю. Знаю, что есть металлические поверхности, и обычные
[22:08] <Zeux> какие еще 2 - не знаю
[22:08] <Zeux> текстуру ту не нашел в ресурсах :)
[22:08] <Zeux> наверное, плохо искал.
[22:08] <Zeux> либо она генерится в рантайме
[22:08] <Zeux> тоже вполне возможно.

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

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

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