104
SKYFORGE: Технологии рендеринга Сергей Макеев, технический директор

Skyforge rendering tech (KRI 2014)

Embed Size (px)

Citation preview

Page 1: Skyforge rendering tech (KRI 2014)

SKYFORGE: Технологии рендерингаСергей Макеев, технический директор

Page 2: Skyforge rendering tech (KRI 2014)

План! Что такое Skyforge?! Графические технологии, использованные при разработке графического движка Skyforge

! Physically Based Shading! Deferred Shading! Reversed Depth buffer

! Выводы! Q&A

Page 3: Skyforge rendering tech (KRI 2014)
Page 4: Skyforge rendering tech (KRI 2014)

Skyforge для программиста

! Fantasy + Sci-fi ! Свой движок! Nextgen графика в MMO! Стилизованная реальность! Огромные открытые локации! Материалы и освещение максимально естественны! 4 графических программиста

Page 5: Skyforge rendering tech (KRI 2014)
Page 6: Skyforge rendering tech (KRI 2014)
Page 7: Skyforge rendering tech (KRI 2014)
Page 8: Skyforge rendering tech (KRI 2014)
Page 9: Skyforge rendering tech (KRI 2014)
Page 10: Skyforge rendering tech (KRI 2014)
Page 11: Skyforge rendering tech (KRI 2014)
Page 12: Skyforge rendering tech (KRI 2014)

Physically Based Shading

Page 13: Skyforge rendering tech (KRI 2014)

Зачем ?! Зачем нужен шейдинг, основанный на физике?

! Более реалистичная и сведенная картинка – меньше настраивать

! Материалы и свет разделены – меньше настраивать! Меньше параметров в материале – меньше настраивать! Соблюдается закон сохранения энергии – меньше настраивать

! Физически корректно не значит фотореалистично(см. работы Disney, Pixar и т.д.)

Page 14: Skyforge rendering tech (KRI 2014)

Физика процесса! В реальной жизни поверхность не гладкая! Поверхность объектов состоит из множества маленьких неровностей. Эти неровности настолько маленькие, что не видны невооруженным глазом! Размер микронеровностей больше длины волны и они влияют на отражение света от поверхности

Page 15: Skyforge rendering tech (KRI 2014)

Бумага под электронным микроскопом

Page 16: Skyforge rendering tech (KRI 2014)

Бумага под электронным микроскопом

Page 17: Skyforge rendering tech (KRI 2014)

Микрогеометрия поверхности! Часть света отражается от поверхности! Часть проникает внутрь поверхности и переизлучается или поглощается

Page 18: Skyforge rendering tech (KRI 2014)

Микрогеометрия поверхности! Мы оперируем на уровне пикселей! Нужно учитывать отраженный и переизлученный свет

Page 19: Skyforge rendering tech (KRI 2014)

! BRDF ! Bidirectional! Reflection! Distribution! Function

! Цель: рассчитать количество энергии, излучаемой в сторону наблюдателя, при заданном входящем излучении! В теории, многомерная функция - 3D, 4D, 6D! На практике, мы будем рассматривать функцию от двух параметров

BRDF

Page 20: Skyforge rendering tech (KRI 2014)

Рассеянный свет (diffuse)! Можно пренебречь точкой входа и выхода луча! Считаем, что весь рассеянный свет распределяется равномерно

Page 21: Skyforge rendering tech (KRI 2014)

Рассеянный свет (diffuse)! Функция для расчета рассеянного света

! l – направление света! v – направление взгляда (не используется в данной модели)! albedo – векторный параметр, который определяет сколько энергии рассеивается, а сколько поглощается материалом ! n – нормаль поверхности! Деление на PI закон сохранения энергии

! Всем известный dot ( N, L )! dot ( N, L ) это cos между векторами N, L

Page 22: Skyforge rendering tech (KRI 2014)

Рассеянный свет (diffuse)! Площадь проекции зависит от угла падения! И равна cos(N, L)

Page 23: Skyforge rendering tech (KRI 2014)

Рассеянный свет (diffuse)! На поверхность попадает меньше энергии в зависимости от угла падения

Page 24: Skyforge rendering tech (KRI 2014)

Отраженный свет (specular)! Отражение света

! Направление отражения меняетсяиз-за микрограней

Page 25: Skyforge rendering tech (KRI 2014)

Отраженный свет (specular)! Отражение света

! Менее гладкая поверхность

Page 26: Skyforge rendering tech (KRI 2014)

Микрогеометрия поверхности! Microfacet theory

! Моделирует поверхность как множество микрограней

! Каждая микрогрань - идеально отражающее зеркало

! Нам нужна сумма вклада каждой микрограни в освещение (интеграл)

! Слишком много вычислений, чтобы решить численно

Page 27: Skyforge rendering tech (KRI 2014)

Microfacet BRDF! Функция для расчета отраженного света (microfacet theory)

! D – функция распределения нормали. Определяет, как микрограни распределены вдоль направления h (от этой функции меняется форма блика)! F – формула Френеля! G – функция затенения микрогранями друг друга

! l – направление света! v – направление взгляда! n – нормаль поверхности! h – вектор между векторами l and v (half vector)

Page 28: Skyforge rendering tech (KRI 2014)

Half vector! Half vector, вектор между L и V! Физический смысл half vector

! Фильтрация микрограней, которые вносят вклад в BRDF! h = m значит микрогрань отражает свет, видимый наблюдателю

Page 29: Skyforge rendering tech (KRI 2014)

Microfacet BRDF! Функция для расчета отраженного света (microfacet theory)

! D – функция распределения нормали. Определяет, как микрограни распределены вдоль направления h (от этой функции меняется форма блика)! F – формула Френеля! G – функция затенения микрогранями друг друга

! l – направление света! v – направление взгляда! n – нормаль поверхности! h – вектор между векторами l and v (half vector)

Page 30: Skyforge rendering tech (KRI 2014)

Распределение микрограней! Степень косинуса в качестве функции распределения микрограней (Blinn-Phong)! Степень 0.25 .. 65536

Page 31: Skyforge rendering tech (KRI 2014)

Microfacet BRDF! Функция для расчета отраженного света (microfacet theory)

! D – функция распределения нормали. Определяет, как микрограни распределены вдоль направления h (от этой функции меняется форма блика)! F – формула Френеля! G – функция затенения микрогранями друг друга

! l – направление света! v – направление взгляда! n – нормаль поверхности! h – вектор между векторами l and v (half vector)

Page 32: Skyforge rendering tech (KRI 2014)

Френель!ло

Page 33: Skyforge rendering tech (KRI 2014)

Френель

Page 34: Skyforge rendering tech (KRI 2014)

Френель! Аппроксимация Шлика

! f0 – можно получить из IOR (Index of refraction)

Page 35: Skyforge rendering tech (KRI 2014)

Френель! Френель: задает, сколько света будет поглощено, а сколько отражено под разными углами

! Физический смысл f0: процент света, отраженный от материала под прямым углом

! Обычное значение f0 для диэлектриков 2% - 5%

! Металлы рассеивают мало света, в основном отражают

Page 36: Skyforge rendering tech (KRI 2014)

Microfacet BRDF! Функция для расчета отраженного света (microfacet theory)

! D – функция распределения нормали. Определяет, как микрограни распределены вдоль направления h (от этой функции меняется форма блика)! F – формула Френеля! G – функция затенения микрогранями друг друга

! l – направление света! v – направление взгляда! n – нормаль поверхности! h – вектор между векторами l and v (half vector)

Page 37: Skyforge rendering tech (KRI 2014)

Microfacet BRDF! Пример того, какая часть света скрывается микрогранями

Page 38: Skyforge rendering tech (KRI 2014)

Видимость микрограней

! Используем простейшую функцию видимости

Page 39: Skyforge rendering tech (KRI 2014)

! Функция отраженного света! Соответствует normalized Blinn-Phong model

Отраженный свет (specular)

Page 40: Skyforge rendering tech (KRI 2014)

Изменение параметров! Изменение F0 ( IOR )

! Изменение шероховатости

Page 41: Skyforge rendering tech (KRI 2014)

Сохранение энергии! Закон сохранения энергии

! Количество отраженного света <= 1! Т.е. рассеянный + отраженный свет <= 1

! Из этого следует: яркость и площадь блика от источника света связаны

Page 42: Skyforge rendering tech (KRI 2014)

Шероховатость 100%

Page 43: Skyforge rendering tech (KRI 2014)

Шероховатость 80%

Page 44: Skyforge rendering tech (KRI 2014)

Шероховатость 50%

Page 45: Skyforge rendering tech (KRI 2014)

Шероховатость 30%

Page 46: Skyforge rendering tech (KRI 2014)

Шероховатость 10%

Page 47: Skyforge rendering tech (KRI 2014)

Интенсивность света! Интенсивность света обратно пропорциональна квадрату расстояния до источника света

! Хорошо подходит для точечных источников, не имеющих объема! Мы хотим источник света, у которого есть размер (area light)! Стремится к нулю, но никогда его не достигает

Page 48: Skyforge rendering tech (KRI 2014)

Интенсивность света! Нужно учесть два радиуса

! Rinner – размер источника! Router – дистанция, на которой вкладом в освещение можно пренебречь

Page 49: Skyforge rendering tech (KRI 2014)

Интенсивность света! Наша функция затухания! Константа внутри 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);}

Page 50: Skyforge rendering tech (KRI 2014)

Интенсивность света! График затухания света

Page 51: Skyforge rendering tech (KRI 2014)

Модель материала! Модель материала

! Base color! Albedo для диэлектрика! Векторная часть F0 для проводника

! Normal (нормаль поверхности, макро)! Roughness (шероховатость поверхности, микро)! Fresnel F0 (практически всегда константа для диэлектрика, скалярная часть F0 для металла)

! Metal (маска: металл или диэлектрик)

Page 52: Skyforge rendering tech (KRI 2014)
Page 53: Skyforge rendering tech (KRI 2014)

Base color ( Albedo )

Page 54: Skyforge rendering tech (KRI 2014)

Base color ( Albedo )

Page 55: Skyforge rendering tech (KRI 2014)

Normal map

Page 56: Skyforge rendering tech (KRI 2014)

Gloss (Roughness)

Page 57: Skyforge rendering tech (KRI 2014)

Specular ( F0 / IOR )

Page 58: Skyforge rendering tech (KRI 2014)

Metal

Page 59: Skyforge rendering tech (KRI 2014)

Пример материала

Page 60: Skyforge rendering tech (KRI 2014)

Пример материала

Page 61: Skyforge rendering tech (KRI 2014)

Пример материала

Page 62: Skyforge rendering tech (KRI 2014)

Пример материала

Page 63: Skyforge rendering tech (KRI 2014)

Пример материала

Page 64: Skyforge rendering tech (KRI 2014)

Пример материала

Page 65: Skyforge rendering tech (KRI 2014)

Deferred Shading

Page 66: Skyforge rendering tech (KRI 2014)

Deferred shading! Плюсы

! Геометрия отделена от освещения! Много источников света! Нет комбинаторного взрыва в шейдерах

! Минусы! Bandwidth! Источники света с тенями по-прежнему дорогие! Сложность с разными BRDF! Поддержка прозрачности

Page 67: Skyforge rendering tech (KRI 2014)

Deferred shading! Skyforge Gbuffer layout (2xRGBA8, 1xRGB10A2, 1xD24S8)

! 96 bits + 24 bits + 8 bits = 128 bits per pixel

Page 68: Skyforge rendering tech (KRI 2014)

Финальный результат

Page 69: Skyforge rendering tech (KRI 2014)

Base color

Page 70: Skyforge rendering tech (KRI 2014)

Нормали (world space)

Page 71: Skyforge rendering tech (KRI 2014)

Шероховатость

Page 72: Skyforge rendering tech (KRI 2014)

Fresnel reflectance (F0)

Page 73: Skyforge rendering tech (KRI 2014)

Metallic

Page 74: Skyforge rendering tech (KRI 2014)

HDR: Global Illumination + Emissive

Page 75: Skyforge rendering tech (KRI 2014)

Ambient occlusion

Page 76: Skyforge rendering tech (KRI 2014)

Без локального освещения и волюметриков

Page 77: Skyforge rendering tech (KRI 2014)

Финальный результат

Page 78: Skyforge rendering tech (KRI 2014)

Tips & Tricks

Page 79: Skyforge rendering tech (KRI 2014)

Реконструкция позиции! Алгоритмам освещения нужна позиция

! world space! shadow space! view space! и т.д.

! В Gbuffer хранится только глубина! используем INTZ (DX9)! гиперболическое распределение "

! Нужна реконструкция позиции из глубины

Page 80: Skyforge rendering tech (KRI 2014)

Реконструкция позиции! Преобразуем depth буфер в линейный! INTZ в R32F! Сразу после заполнения Gbuffer

// Функция для преобразования глубины с гиперболическим распределением в линейнуюfloat ConvertHyperbolicDepthToLinear(float hyperbolicDepth){ return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear)));}

Page 81: Skyforge rendering tech (KRI 2014)

Подобие треугольников! Треугольник P1, P2, P3 подобен треугольнику P1, P4, P5

Page 82: Skyforge rendering tech (KRI 2014)

Подобие треугольников! Треугольник P1, P2, P3

Page 83: Skyforge rendering tech (KRI 2014)

Подобие треугольников! Треугольник P1, P4, P5

Page 84: Skyforge rendering tech (KRI 2014)

Реконструкция позиции! Вершинный шейдер

! Считаем треугольник P1, P2, P3 в вершинном шейдере! Передаем отрезок P1, P3 в пиксельный шейдер

! Пиксельный шейдер! Получаем интерполированный вектор P1,P3 (rayDir) через интерполятор! Считываем линейную глубину! position = cameraPosition + rayDir * linearDepth

! Очень быстро: mad + интерполятор! Можно реконструировать позицию в любом удобном пространстве. world, view, shadow и т.д.! HLSL код в бонус слайдах

Page 85: Skyforge rendering tech (KRI 2014)

Reversed Depth Buffer

Page 86: Skyforge rendering tech (KRI 2014)

Большая дальность видимости

Page 87: Skyforge rendering tech (KRI 2014)

Большая дальность видимости

Page 88: Skyforge rendering tech (KRI 2014)

Большая дальность видимости

Page 89: Skyforge rendering tech (KRI 2014)

Большая дальность видимости

Page 90: Skyforge rendering tech (KRI 2014)

Reversed Depth Buffer! Reversed depth buffer

near = 1far = 0

! Работает с fixed point depth, формат D24S8! Нужно инвертировать D3DRS_ZFUNC

D3DCMP_GREATEREQUAL! Всегда инвертируйте матрицу проекции

Некорректно инвертировать на стадии viewport’а или в шейдере

Page 91: Skyforge rendering tech (KRI 2014)

Матрица проекции

Page 92: Skyforge rendering tech (KRI 2014)

! Как получается глубина?! float4 p = mul( float4( pos, 1 ), mtxProjection );! float depth = p.z / p.w;

Матрица проекции

Page 93: Skyforge rendering tech (KRI 2014)

Сравнение методов! Z near = 0.5! Z far = 50000.0

Page 94: Skyforge rendering tech (KRI 2014)

Сравнение методов! Стандартный метод

! Reversed depth buffer

Page 95: Skyforge rendering tech (KRI 2014)

Сравнение методов! Стандартный метод

! Reversed depth buffer

Page 96: Skyforge rendering tech (KRI 2014)

Numeric error – стандартный метод

Page 97: Skyforge rendering tech (KRI 2014)

Numeric error – reversed depth buffer

Page 98: Skyforge rendering tech (KRI 2014)

Numeric error – reversed depth buffer

Page 99: Skyforge rendering tech (KRI 2014)

Reversed depth buffer : выводы

! D24 легко покрывает дальность в 50 км! Reverse depth подходит для любого движка! Лучше закладывать с самого начала проекта

! Извлечение плоскостей фрустума из матрицы! Bias у теней! и т.д.

! При возможности используйте float depth буфер

Page 100: Skyforge rendering tech (KRI 2014)

Заключение! Nextgen графика в MMO уже реальность

! Все меньше отличий от ААА консольных тайтлов

! Физичный шейдинг упрощает производство контента

! Нам нужны графические программисты !

Page 101: Skyforge rendering tech (KRI 2014)

СПАСИБО ЗА ВНИМАНИЕ!ВОПРОСЫ[email protected]

Page 102: Skyforge rendering tech (KRI 2014)

Bonus

Page 103: Skyforge rendering tech (KRI 2014)

Реконструкция позиции: Vertex shader

// Часть матрицы проекцииfloat tanHalfVerticalFov; // invProjection.11;float tanHalfHorizontalFov; // invProjection.00;

// Базис камеры в пространстве реконструкцииfloat3 camBasisUp;float3 camBasisSide;float3 camBasisFront;

// postProjectiveSpacePosition в homogeneous projection spacefloat3 CreateRay(float4 postProjectiveSpacePosition){ float3 leftRight = camBasisSide * -postProjectiveSpacePosition.x * tanHalfHorizontalFov; float3 upDown = camBasisUp * postProjectiveSpacePosition.y * tanHalfVerticalFov; float3 forward = camBasisFront; return (forward + leftRight + upDown);}

void VertexShader(float4 inPos, out float4 outPos : POSITION, out float3 rayDir : TEXCOORD0){ outPos = inPos; rayDir = CreateRay(inPos);}

Page 104: Skyforge rendering tech (KRI 2014)

Реконструкция позиции: Pixel shader

// Позиция камеры в пространстве реконструкцииfloat3 camPosition;

float4 PixelShader(float3 rayDir : TEXCOORD0) : COLOR0{ ... float linearDepth = tex2D(linearDepthSampler, uv).r; float3 position = camPosition + rayDir * linearDepth; ...}

// Функция для преобразования глубины с гиперболическим распределением в линейнуюfloat ConvertHyperbolicDepthToLinear(float hyperbolicDepth){ return ((zNear / (zNear-zFar)) * zFar) / (hyperbolicDepth - (zFar / (zFar-zNear)));}