2. План
! Что такое Skyforge?
! Графические технологии, использованные при
разработке графического движка Skyforge
! Physically Based Shading
! Deferred Shading
! Reversed Depth buffer
! Выводы
! Q&A
3.
4. Skyforge для программиста
! Fantasy + Sci-fi
! Свой движок
! Nextgen графика в MMO
! Стилизованная реальность
! Огромные открытые локации
! Материалы и освещение максимально естественны
! 4 графических программиста
13. Зачем ?
! Зачем нужен шейдинг, основанный на физике?
! Более реалистичная и сведенная картинка – меньше
настраивать
! Материалы и свет разделены – меньше настраивать
! Меньше параметров в материале – меньше настраивать
! Соблюдается закон сохранения энергии – меньше
настраивать
! Физически корректно не значит фотореалистично
(см. работы Disney, Pixar и т.д.)
14. Физика процесса
! В реальной жизни поверхность не гладкая
! Поверхность объектов состоит из множества маленьких
неровностей. Эти неровности настолько маленькие, что не видны
невооруженным глазом
! Размер микронеровностей больше длины волны и они влияют на
отражение света от поверхности
19. BRDF
! BRDF
! Bidirectional
! Reflection
! Distribution
! Function
! Цель: рассчитать количество энергии, излучаемой в сторону наблюдателя,
при заданном входящем излучении
! В теории, многомерная функция - 3D, 4D, 6D
! На практике, мы будем рассматривать функцию от двух параметров
20. Рассеянный свет (diffuse)
! Можно пренебречь точкой входа и выхода луча
! Считаем, что весь рассеянный свет
распределяется равномерно
21. Рассеянный свет (diffuse)
! Функция для расчета рассеянного света
! l – направление света
! v – направление взгляда (не используется в данной модели)
! albedo – векторный параметр, который определяет сколько энергии рассеивается, а сколько поглощается материалом
! n – нормаль поверхности
! Деление на PI закон сохранения энергии
! Всем известный dot ( N, L )
! dot ( N, L ) это cos между векторами N, L
26. Микрогеометрия поверхности
! Microfacet theory
! Моделирует поверхность как множество
микрограней
! Каждая микрогрань - идеально отражающее
зеркало
! Нам нужна сумма вклада каждой микрограни в
освещение (интеграл)
! Слишком много вычислений, чтобы решить
численно
27. Microfacet BRDF
! Функция для расчета отраженного света (microfacet theory)
! D – функция распределения нормали. Определяет, как микрограни распределены вдоль
направления h (от этой функции меняется форма блика)
! F – формула Френеля
! G – функция затенения микрогранями друг друга
! l – направление света
! v – направление взгляда
! n – нормаль поверхности
! h – вектор между векторами l and v (half vector)
28. Half vector
! Half vector, вектор между L и V
! Физический смысл half vector
! Фильтрация микрограней, которые вносят вклад в BRDF
! h = m значит микрогрань отражает свет, видимый наблюдателю
29. Microfacet BRDF
! Функция для расчета отраженного света (microfacet theory)
! D – функция распределения нормали. Определяет, как микрограни распределены вдоль
направления h (от этой функции меняется форма блика)
! F – формула Френеля
! G – функция затенения микрогранями друг друга
! l – направление света
! v – направление взгляда
! n – нормаль поверхности
! h – вектор между векторами l and v (half vector)
30. Распределение микрограней
! Степень косинуса в качестве функции
распределения микрограней (Blinn-Phong)
! Степень 0.25 .. 65536
31. Microfacet BRDF
! Функция для расчета отраженного света (microfacet theory)
! D – функция распределения нормали. Определяет, как микрограни распределены вдоль
направления h (от этой функции меняется форма блика)
! F – формула Френеля
! G – функция затенения микрогранями друг друга
! l – направление света
! v – направление взгляда
! n – нормаль поверхности
! h – вектор между векторами l and v (half vector)
35. Френель
! Френель: задает, сколько света будет поглощено, а сколько
отражено под разными углами
! Физический смысл f0: процент света, отраженный от
материала под прямым углом
! Обычное значение f0 для диэлектриков 2% - 5%
! Металлы рассеивают мало света, в основном отражают
36. Microfacet BRDF
! Функция для расчета отраженного света (microfacet theory)
! D – функция распределения нормали. Определяет, как микрограни распределены вдоль
направления h (от этой функции меняется форма блика)
! F – формула Френеля
! G – функция затенения микрогранями друг друга
! l – направление света
! v – направление взгляда
! n – нормаль поверхности
! h – вектор между векторами l and v (half vector)
37. Microfacet BRDF
! Пример того, какая часть света скрывается микрогранями
41. Сохранение энергии
! Закон сохранения энергии
! Количество отраженного света <= 1
! Т.е. рассеянный + отраженный свет <= 1
! Из этого следует: яркость и площадь блика от
источника света связаны
47. Интенсивность света
! Интенсивность света обратно пропорциональна квадрату
расстояния до источника света
! Хорошо подходит для точечных источников, не имеющих
объема
! Мы хотим источник света, у которого есть размер (area light)
! Стремится к нулю, но никогда его не достигает
48. Интенсивность света
! Нужно учесть два радиуса
! Rinner – размер источника
! Router – дистанция, на которой вкладом в освещение
можно пренебречь
49. Интенсивность света
! Наша функция затухания
! Константа внутри Rinner
! На дистанции Router равна 0
float GetAttenuation(float distance, float lightInnerR, float invLightOuterR)
{
float d = max(distance, lightInnerR);
return saturate(1.0 - pow(d * invLightOuterR, 4.0)) / (d * d + 1.0);
}
51. Модель материала
! Модель материала
! Base color
! Albedo для диэлектрика
! Векторная часть F0 для проводника
! Normal (нормаль поверхности, макро)
! Roughness (шероховатость поверхности, микро)
! Fresnel F0 (практически всегда константа для
диэлектрика, скалярная часть F0 для металла)
! Metal (маска: металл или диэлектрик)
66. Deferred shading
! Плюсы
! Геометрия отделена от освещения
! Много источников света
! Нет комбинаторного взрыва в шейдерах
! Минусы
! Bandwidth
! Источники света с тенями по-прежнему дорогие
! Сложность с разными BRDF
! Поддержка прозрачности
79. Реконструкция позиции
! Алгоритмам освещения нужна позиция
! world space
! shadow space
! view space
! и т.д.
! В Gbuffer хранится только глубина
! используем INTZ (DX9)
! гиперболическое распределение "
! Нужна реконструкция позиции из глубины
80. Реконструкция позиции
! Преобразуем depth буфер в линейный
! INTZ в R32F
! Сразу после заполнения Gbuffer
// Функция для преобразования глубины с гиперболическим распределением в линейную
float ConvertHyperbolicDepthToLinear(float hyperbolicDepth)
{
return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear)));
}
90. Reversed Depth Buffer
! Reversed depth buffer
near = 1
far = 0
! Работает с fixed point depth, формат D24S8
! Нужно инвертировать D3DRS_ZFUNC
D3DCMP_GREATEREQUAL
! Всегда инвертируйте матрицу проекции
Некорректно инвертировать на стадии viewport’а или в шейдере
99. Reversed depth buffer : выводы
! D24 легко покрывает дальность в 50 км
! Reverse depth подходит для любого движка
! Лучше закладывать с самого начала проекта
! Извлечение плоскостей фрустума из матрицы
! Bias у теней
! и т.д.
! При возможности используйте float depth буфер
100. Заключение
! Nextgen графика в MMO уже реальность
! Все меньше отличий от
ААА консольных тайтлов
! Физичный шейдинг упрощает
производство контента
! Нам нужны графические программисты !