Магия шейдеров
Разбор эффектов из
видеоигр
Про докладчика
Сергей
Кормишин
• 8 лет в геймдеве
• Работаю рендер
инг-инженером
в
компании Spera
soft
• Работал в EA
Mobile, Nival
• Принимал
участие в
разработке игр:
Star wars: Galaxy
of Heroes
Rainbow Six:
Siege
Assassin’s Creed:
Odyssey
Наша
компания15 лет
Основана в 2004: 5 офисов в 3 странах
500+
Профессионалов в команде
Sperasoft является частью
Keywords Studios
Международного поставщика технических услуг для
глобальной индустрии видеоигр
О чем доклад?
Меня интересует визуальная составляющая игр,
поэтому я исследую как устроены различные
эффекты, несколько мы воспроизведем в Unity:
водоворот, портал
[1 / 3] Водоворот, портал
[1 / 3] Водоворот, портал
Нужно вспомнить
Нам нужно знать, что такое:
• Полярные координаты
• UV-координаты
Полярные координаты
Лучшее объяснение UV-координат
3d-модель (Mesh)
представляет собой оболочку,
а 2d текстура цвет и другие
свойства материала.
Лучшее объяснение UV-координат
В каждой вершине этой
модели в Blender'e (3Ds Max,
Maya и тп) заданы
координаты внутри текстуры
Выведем uv-координаты плоскости
float4 frag (v2f i) : SV_Target
{
// Original UV output
return float4(i.uv, 0, 1);
}
RGBa
Преобразуем в полярные координаты
float4 frag (v2f i) : SV_Target
{
i.uv -= float2(0.5, 0.5);
float2 uv = i.uv;
// Polar UV
float2 p = i.uv;
float a = atan2(p.y ,p.x);
uv = float2(length(p), (a / M_2PI));
return float4(uv, 0, 1);
}
Пространство плоскости «заворачивается»
float4 frag (v2f i) : SV_Target
{
…
float t = saturate(sin(_Time.y));
uv = lerp(i.uv, uv, t);
return float4(uv, 0, 1);
}
мы можем заворачивать и по спирали
float4 frag (v2f i) : SV_Target
{
i.uv -= float2(0.5, 0.5);
i.uv *= 2.0;
float2 uv = i.uv;
float d = length(uv);
float angle = atan2(uv.y, uv.x);
float с = sin(d * DistanceMultiplier +
angle * _AngleMultiplier - _Time.y *
_Speed);
return float4(с, с, с, 1);
}
вся слава гипно-жабе!
добавим смещение к полярным координатам
float4 frag (v2f i) : SV_Target
{
…
float offset = _Time.x * _Speed;
uv += float2(offset, offset);
return float4(uv, 0, 1);
}
если _Speed будет отрицательной
float4 frag (v2f i) : SV_Target
{
…
float offset = _Time.x * _Speed;
uv += float2(offset, offset);
return float4(uv, 0, 1);
}
текстура для водоворота
Источник – enemyhideout.com
Вертикальные паттерны в полярном
преобразовании будут
закручиваться.
закрученный паттерн
Полярное преобразование превратит
вертикальный паттерн в круговой
Текстуру нужно сделать стыкующейся
в Photoshopе
добавим смещение
инвертируем смещение
текстура с шумом перлина
Применяем шум для смещения
придадим форму
float4 frag (v2f i) : SV_Target
{
…
float noise = tex2D(_NoiseMap, i.uv).x;
float edgeNoise = noise * _Impact;
float edge = 1.0 - smoothstep(0.3,
0.4 + edgeNoise,
length(i.uv));
return edge * tex2D(_ColorMap, uv);
}
Добавим движения по границе
float4 frag (v2f i) : SV_Target
{
…
float noise = tex2D(_NoiseMap,
i.uv polar_uv).x;
float edgeNoise = noise * _Impact;
float edge = 1.0 - smoothstep(0.3,
0.4 + edgeNoise,
length(i.uv));
return edge * tex2D(_ColorMap, uv);
}
Можно варьировать вид и количество текстур
Portal Shader by Nadir Khabibullin
Какие математические
инструменты мы
применяли?
математические инструменты
• Тригонометрические функции
• Векторная алгебра
parallax-based эффекты
[2 / 3] parallax-based эффекты
Cracked Ice Material by Ali Youssef
[2 / 3] parallax-based эффекты
Magic Marble by Harry Alisavakis
[2 / 3] parallax-based эффекты
Cards by Mihajlo Djokic
Плоскость в Unity
Пересчитаем normal в view-space
void vert(inout appdata_full v, out Input
o)
{
UNITY_INITIALIZE_OUTPUT(Input,o);
o.normal_vs = normalize( mul(
(float3x3)UNITY_MATRIX_MV,
v.normal)
);
}
Используем смещение normal в UV
void surf(Input IN, inout SurfaceOutputStandard o)
{
float4 top = tex2D(_TopMap, IN.uv_TopMap);
float2 offset_uv = IN.uv_BottomMap +
_OffsetScale * IN.vs_normal.xy;
float4 bottomColor = tex2D(_BottomMap, offset_uv);
o.Albedo = lerp(bottomColor, topColor.rgb, topColor.a);
}
получаем нужный нам эффект глубины
Используем MIP-уровни нижней текстуры
void surf(Input IN, inout SurfaceOutputStandard o)
{
const uint MAX_MIP = 9;
float4 bottomColor = tex2Dlod(_BottomMap,
float4(offset_uv, 0, MAX_MIP * topColor.a
));
o.Albedo = lerp(bottomColor,
topColor.rgb, topColor.a);
}
Примеры из игр
Проект Никиты Булатова «Luscus»
Примеры из популярных
игр
[2 / 3] Parallax-based эффекты
Примеры из игр
Изображение из статьи A Game Art Tricks (simonschreibt.de)
Примеры из игр
Изображение из статьи A Game Art Tricks (simonschreibt.de)
Примеры из игр
Изображение из статьи A Game Art Tricks (simonschreibt.de)
Примеры из игр
Изображение из статьи A Game Art Tricks (simonschreibt.de)
layered parallax
[2 / 3] Parallax-based эффекты
[2 / 3] parallax-based эффекты
Нужно вспомнить
Нам нужно знать, что такое:
• Касательное пространство (Tangent-space)
визуализация касательного пространства в unity
tangent-space (касательное пространство)
вершинный шейдер: касательное пространство
void vert(inout appdata_full v, out Input o)
{
...
float3 camera_ls = mul(unity_WorldToObject,
float4(_WorldSpaceCameraPos, 1.0)).xyz;
float3 viewDir_ls = v.vertex.xyz - camera_ls;
float tangentSign = v.tangent.w * unity_WorldTransformParams.w;
float3 binormal = cross(v.normal.xyz, v.tangent.xyz) * tangentSign;
o.view_dir_ts = float3(
dot(viewDir_ls, v.tangent.xyz),
dot(viewDir_ls, binormal.xyz),
dot(viewDir_ls, v.normal.xyz)
);
}
surface-шейдер: цикл со смещением
void surf(Input IN, inout SurfaceOutputStandard o) {
float3 parallax = float3(0, 0, 0);
for (int j = 0; j < _Iterations; j++) {
float ratio = (float)j / _Iterations; // Затухание
float2 uv_offset = lerp(0, _OffsetScale, ratio) *
normalize(IN.view_dir_ts).xy;
parallax += tex2D(_ParallaxMap, IN.uv_MainTex + uv_offset) *
lerp(1, 0, ratio);
}
parallax /= _Iterations;
fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
o.Albedo = c.rgb + parallax;
...
}
используем такую текстуру трещин
получим такой эффект льда
7 из 10
Вместо затухания сделать интерполяцию между
цветами
Какие математические
инструменты мы
применяли?
математические инструменты
• Тригонометрические функции
• Векторная алгебра
• Матрицы
mesh flipbook, молния
[3/3] Mesh flipbook: молния
Lightning Effect by Klemen Lozar
исходный mesh: В vertex color - цвет всполоха
Используем step, чтобы подсветить активный
всполох
v2f vert (appdata v) {
v2f o;
o.uv = v.uv;
o.position = UnityObjectToClipPos(v.position);
float d = v.color.r - _Value;
float factor = 1.0 - step(_Threshold, abs(d));
o.color = v.color +
(factor > 0 ?
fixed4(0, 1, 0, 0) : fixed4(0, 0, 0, 0)
);
return o;
}
Оставляем только активный всполох
v2f vert (appdata v) {
v2f o;
o.uv = v.uv;
o.position = UnityObjectToClipPos(v.position);
float d = v.color.r - _Value;
float factor = 1.0 - step(_Threshold, abs(d));
o.position *= factor;
o.color = v.color +
(factor > 0 ?
fixed4(0, 1, 0, 0) : fixed4(0, 0, 0, 0)
);
return o;
}
Оставляем только активный всполох
v2f vert (appdata v) {
v2f o;
o.uv = v.uv;
o.position = UnityObjectToClipPos(v.position);
float angle = _Time.y * _RotationSpeed;
float3x3 R = {cos(angle), -sin(angle), 0,
sin(angle), cos(angle), 0,
0, 0, 1 };
v.position = float4(mul (R, v.position.xyz),
1);
...
return o;
}
PRO-TIP: темные кадры после вспышки
После всполоха можно добавить несколько темных
кадров во время «затухания», так мы сможем
имитировать остаточное изображение, ослепление.
Этот контраст помогает показать НАСКОЛЬКО
яркой была вспышка.
Edward del Villar
Финальный результат
код, слайды и контакты
Код и слайды будут доступны на моем сайте:
coremission.net/gamedev/kormishin-devgamm-minsk-2019
s.coremission@gmail.com
Shader magic: Breakdown of popular visual effects for games
Shader magic: Breakdown of popular visual effects for games
так и думал, что вы спросите
NDA
Click to edit Master title style

More Related Content

PDF
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
PDF
Лекция 7. Стандарт OpenMP (подолжение)
PDF
Векторизация кода (семинар 3)
PDF
Векторизация кода (семинар 2)
PDF
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
PDF
Лекция 10. Графы. Остовные деревья минимальной стоимости
PDF
Лекция 9. Поиск кратчайшего пути в графе
PDF
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"
Семинар 3. Многопоточное программирование на OpenMP (часть 3)
Лекция 7. Стандарт OpenMP (подолжение)
Векторизация кода (семинар 3)
Векторизация кода (семинар 2)
Семинар 4. Многопоточное программирование на OpenMP (часть 4)
Лекция 10. Графы. Остовные деревья минимальной стоимости
Лекция 9. Поиск кратчайшего пути в графе
Лекция №16. Поиск подстрок. Предмет "Структуры и алгоритмы обработки данных"

What's hot (20)

PDF
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
PDF
OpenStreetMap на вашем сайте
PDF
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
PDF
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
PDF
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
PDF
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
PDF
Лекция 8. Intel Threading Building Blocks
PDF
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
PDF
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
PDF
Лекция 11. Методы разработки алгоритмов
PDF
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
PDF
О-символика
PPT
D-кучи и их применение
PDF
Лекция 8: Графы. Обходы графов
PDF
Лекция 4: Стек. Очередь
PDF
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
PDF
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
PDF
Лекция 7. Бинарные кучи. Пирамидальная сортировка
PDF
Задача SLAM
Лекция 2: Абстрактные типы данных. Алгоритмы сортировки
OpenStreetMap на вашем сайте
Семинар 5. Многопоточное программирование на OpenMP (часть 5)
Лекция 12 (часть 2): Языки программирования семейства PGAS: IBM X10
Лекция №14. Графы: кратчайшие пути и максимальные потоки. Предмет "Структуры ...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция 8. Intel Threading Building Blocks
Семинар 2. Многопоточное программирование на OpenMP (часть 2)
Лекция 5. Метод конечных разностей (параллельные алгоритмы в стандарте MPI)
Лекция 11. Методы разработки алгоритмов
Лекция №12. Графы: представление, обходы, топологическая сортировка. Предмет ...
О-символика
D-кучи и их применение
Лекция 8: Графы. Обходы графов
Лекция 4: Стек. Очередь
Лекция №13. Графы: сильно связные компоненты и остовные деревья. Предмет "Стр...
Семинар 7. Многопоточное программирование на OpenMP (часть 7)
Лекция 7. Бинарные кучи. Пирамидальная сортировка
Задача SLAM
Ad

Similar to Shader magic: Breakdown of popular visual effects for games (20)

PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
PPTX
Steel monkeys: Unity3D глазами программиста графики
PPTX
Deep Dive C# by Sergey Teplyakov
PDF
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
PPTX
C# Deep Dive
PPTX
C sharp deep dive
PDF
Введение в Clojure (Никита Прокопов)
PDF
JavaFX Script Language
PDF
Продолжаем говорить о микрооптимизациях .NET-приложений
PPTX
Convert this: peculiarities of cross-platform mobile game development at Vizor
PPT
Logomir
PPTX
Николай Паламарчук "Functional Programming basics for PHP developers"
PDF
Ренессанс графики на клиенте
PDF
Модель акторов и C++ что, зачем и как?
PPTX
Functional Programing
PDF
модель акторов и C++ что, зачем и как ?
PDF
Интерпретирование языков с помощью Free-монад
PDF
TMPA-2013 Dmitry Zaitsev
PDF
Использование GNU OCTAVE для инженерных и математических расчетов
PDF
msumobi2. Лекция 1
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Steel monkeys: Unity3D глазами программиста графики
Deep Dive C# by Sergey Teplyakov
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
C# Deep Dive
C sharp deep dive
Введение в Clojure (Никита Прокопов)
JavaFX Script Language
Продолжаем говорить о микрооптимизациях .NET-приложений
Convert this: peculiarities of cross-platform mobile game development at Vizor
Logomir
Николай Паламарчук "Functional Programming basics for PHP developers"
Ренессанс графики на клиенте
Модель акторов и C++ что, зачем и как?
Functional Programing
модель акторов и C++ что, зачем и как ?
Интерпретирование языков с помощью Free-монад
TMPA-2013 Dmitry Zaitsev
Использование GNU OCTAVE для инженерных и математических расчетов
msumobi2. Лекция 1
Ad

More from DevGAMM Conference (20)

PPTX
The art of small steps, or how to make sound for games in conditions of war /...
PPTX
Breaking up with FMOD - Why we ended things and embraced Metasounds / Daniel ...
PPTX
How Audio Objects Improve Spatial Accuracy / Mads Maretty Sønderup (Audiokine...
PPTX
Why indie developers should consider hyper-casual right now / Igor Gurenyov (...
PPTX
AI / ML for Indies / Tyler Coleman (Retora Games)
PDF
Agility is the Key: Power Up Your GameDev Project Management with Agile Pract...
PPTX
New PR Tech and AI Tools for 2023: A Game Changer for Outreach / Kirill Perev...
PDF
Playable Ads - Revolutionizing mobile games advertising / Jakub Kukuryk (Popc...
PDF
Creative Collaboration: Managing an Art Team / Nastassia Radzivonava (Glera G...
PDF
From Local to Global: Unleashing the Power of Payments / Jan Kuhlmannn (Xsolla)
PDF
Strategies and case studies to grow LTV in 2023 / Julia Iljuk (Balancy)
PDF
Why is ASO not working in 2023 and how to change it? / Olena Vedmedenko (Keya...
PDF
How to increase wishlists & game sales from China? Growth marketing tactics &...
PDF
Turkish Gaming Industry and HR Insights / Mustafa Mert EFE (Zindhu)
PDF
Building an Awesome Creative Team from Scratch, Capable of Scaling Up / Sasha...
PPTX
Seven Reasons Why Your LiveOps Is Not Performing / Alexander Devyaterikov (Be...
PDF
The Power of Game and Music Collaborations: Reaching and Engaging the Masses ...
PPTX
Branded Content: How to overcome players' immunity to advertising / Alex Brod...
PPTX
Resurrecting Chasm: The Rift - A Source-less Remastering Journey / Gennadii P...
PPTX
How NOT to do showcase events: Behind the scenes of Midnight Show / Andrew Ko...
The art of small steps, or how to make sound for games in conditions of war /...
Breaking up with FMOD - Why we ended things and embraced Metasounds / Daniel ...
How Audio Objects Improve Spatial Accuracy / Mads Maretty Sønderup (Audiokine...
Why indie developers should consider hyper-casual right now / Igor Gurenyov (...
AI / ML for Indies / Tyler Coleman (Retora Games)
Agility is the Key: Power Up Your GameDev Project Management with Agile Pract...
New PR Tech and AI Tools for 2023: A Game Changer for Outreach / Kirill Perev...
Playable Ads - Revolutionizing mobile games advertising / Jakub Kukuryk (Popc...
Creative Collaboration: Managing an Art Team / Nastassia Radzivonava (Glera G...
From Local to Global: Unleashing the Power of Payments / Jan Kuhlmannn (Xsolla)
Strategies and case studies to grow LTV in 2023 / Julia Iljuk (Balancy)
Why is ASO not working in 2023 and how to change it? / Olena Vedmedenko (Keya...
How to increase wishlists & game sales from China? Growth marketing tactics &...
Turkish Gaming Industry and HR Insights / Mustafa Mert EFE (Zindhu)
Building an Awesome Creative Team from Scratch, Capable of Scaling Up / Sasha...
Seven Reasons Why Your LiveOps Is Not Performing / Alexander Devyaterikov (Be...
The Power of Game and Music Collaborations: Reaching and Engaging the Masses ...
Branded Content: How to overcome players' immunity to advertising / Alex Brod...
Resurrecting Chasm: The Rift - A Source-less Remastering Journey / Gennadii P...
How NOT to do showcase events: Behind the scenes of Midnight Show / Andrew Ko...

Shader magic: Breakdown of popular visual effects for games