Разработка игр
3D рендеринг в играх
Cyberpunk 2077 использует 3.2 миллиона линий кода шейдеров только для эффектов освещения. Каждый кадр - 60 миллионов треугольников, 50+ источников света с ray tracing, 100+ слоёв post-processing. Всё это за 16 миллисекунд на RTX 4090.
- **Unreal Engine 5 Lumen:** полностью динамическое глобальное освещение в реальном времени через smart ray tracing. Fortnite использует Lumen с 2022 года
- **Unity HDRP:** PBR физически корректный pipeline с Deferred Shading. Используется в Shadowlands WoW-подобных играх для консолей PS5/XSX
- **Roblox:** custom forward shading pipeline для 5+ миллионов пользователей одновременно на очень разном железе - от смартфонов до RTX
Исторический контекст
В 1975 году Буй Туонг Фонг опубликовал диссертацию с моделью освещения, которая стала стандартом на 40 лет. Модель Phong: ambient + diffuse + specular. Просто, быстро, неплохо выглядит. До 2010-х большинство игр использовали именно её. Революция произошла в 2012: Disney публикует принципы PBR (Physically Based Rendering) для фильма «Ральф», Epic Games внедряет PBR в Unreal Engine 4 (2014). С тех пор PBR - индустриальный стандарт. Ray Tracing в реальном времени стал доступен с NVIDIA RTX (2018) - первые GPU с hardware ray tracing cores.
Mesh: геометрия как треугольники
**Unreal Engine 5, 2022. Nanite - виртуальная геометрия из миллиардов полигонов. Статуя The Matrix Awakens содержит 1.5 миллиарда треугольников.** Но базовый строительный блок не изменился с 1970-х: треугольник. Любая 3D форма - набор вершин (vertices) соединённых рёбрами в треугольники (faces). Треугольник всегда планарный и всегда растеризуется в пиксели корректно - потому GPU оптимизированы именно под него.
| Атрибут вершины | Тип | Назначение |
|---|---|---|
| Position (xyz) | float3 | Позиция в 3D пространстве |
| Normal (xyz) | float3 normalized | Направление поверхности для освещения |
| UV (uv) | float2 [0..1] | Координаты текстуры |
| Tangent/Bitangent | float3+float3 | Normal mapping: локальная система координат |
| Color (rgba) | float4 или uint8×4 | Vertex color для ручной покраски или ambient occlusion |
Почему GPU рендерит треугольники, а не quads (четырёхугольники) или n-gons?
PBR материалы: физически корректное отражение
**2012 год. Disney публикует принципы Physically Based Rendering (PBR) для фильма Wreck-It Ralph.** До PBR каждый художник задавал произвольные параметры шейдеров. Результат выглядел по-разному при разном освещении. PBR вводит физически корректную модель: каждый материал описывается несколькими интуитивными параметрами, и результат корректен при любом освещении.
**PBR параметры (Metallic-Roughness workflow):** Albedo - базовый цвет без освещения. Metallic [0-1]: 0=пластик/камень, 1=металл. Roughness [0-1]: 0=зеркало, 1=полностью матовый. Normal map: детали геометрии без полигонов. AO: предрассчитанные тени в углах. Эти параметры интуитивны для художников и физически корректны.
Roughness=0 и Roughness=1 в PBR материале. Чем они отличаются визуально?
Освещение: от Phong до Ray Tracing
**Minecraft RTX, 2020. Та же игра с кубиками выглядит как фотография после добавления Path Tracing.** Освещение - самая вычислительно дорогая часть рендеринга. Реалистичный свет физически означает симуляцию миллиардов фотонов. Игры используют аппроксимации: от простой модели Phong (1975) до глобального освещения с ray tracing в реальном времени (NVIDIA RTX, 2018+).
| Метод освещения | Глобальное освещение | Скорость | Использование |
|---|---|---|---|
| Phong/Blinn-Phong | Нет | Очень быстро | Мобильные игры, ретро-стиль |
| Deferred Shading | Нет (только direct) | Быстро | AAA игры с множеством источников |
| Screen Space GI | Аппроксимация | Средне | Cyberpunk 2077, Forza Horizon |
| Ray Traced GI | Да (частичный) | Медленно | Metro Exodus Enhanced, RTX игры |
| Path Tracing | Полное | Очень медленно | Minecraft RTX, Portal RTX |
Deferred Shading рендерит освещение после геометрии. В чём главное преимущество перед Forward Shading?
Камера: projection, FOV и post-processing
**God of War (2018). Кратос и Атрей проходят весь игровой мир без единого cut - камера никогда не режет. Технически: один непрерывный render pass.** Камера в 3D - математическая модель: откуда смотрим (view matrix), что видим (projection matrix), и как обрабатываем финальный кадр (post-processing). Это последний этап перед пикселем на экране.
**Reverse-Z depth buffer:** стандартный depth buffer теряет точность для далёких объектов (z-fighting). Reverse-Z (используется в Unreal, Unity HDRP): near=1, far=0. Число с плавающей точкой более точно представляет значения близкие к 1 - это устраняет z-fighting на больших дистанциях без infinite far plane trick.
Больше полигонов в mesh всегда означает лучшую графику
Визуальное качество определяется комбинацией: качество текстур, точность освещения и нормальные карты. Персонаж с 5000 полигонов + качественный PBR материал выглядит лучше чем 100 000 полигонов без нормалей и плохим освещением.
Normal mapping добавляет визуальную детализацию без полигонов: карта нормалей 1024×1024 содержит ~1 миллион виртуальных «граней», не требуя реальной геометрии. Микрополигоны Nanite (UE5) работают - но только потому что сочетают их с aggressive LOD и clustering, а не просто добавляют полигоны.
Какое значение FOV обычно вызывает «fish-eye» эффект и головокружение при быстром движении?
3D рендеринг: главное
- Mesh: треугольники из вершин (позиция + нормаль + UV). LOD управляет количеством полигонов на расстоянии
- PBR материалы: albedo + metallic + roughness + normal map. Физически корректны при любом освещении
- Deferred Shading: G-buffer (геометрия) + lighting pass. Стоимость O(pixels × lights), не O(polys × lights)
- Camera: view matrix (откуда) + perspective projection (FOV, near/far) + post-processing stack
- Ray Tracing (RTX): физически корректные тени, отражения и GI. Цена: 2-4x дороже растеризации
Вопросы для размышления
- Path Tracing (Minecraft RTX) даёт фотореалистичную графику, но работает при 30 FPS на RTX 4090. Deferred Shading работает при 120 FPS на RTX 3060. Какие конкретные visual эффекты теряются при отказе от Path Tracing в пользу Deferred?