- PVSM.RU - https://www.pvsm.ru -
Ближе к концу превосходной ленты Вима Вендерса «Идеальные дни» главный герой Хираяма пьёт пиво под мостом после того, как увидел, как Бизнесмен ухаживает за девушкой, в которую влюблён Хираяма. Внезапно к нему подходит Бизнесмен. Всё оказалось не так просто, но их беседа приводит их к фундаментальным вопросам:
Бизнесмен: Тени. Становятся ли они темнее, когда накладываются друг на друга?
Хираяма: Не знаю.
Бизнесмен: Я не знаю ещё очень многого... Именно так заканчивается жизнь... Наверно.
Хираяма: Давайте узнаем прямо сейчас.
Бизнесмен: Что?
И они выходят на свет уличного фонаря, чтобы изучить свои тени (сцена целиком [1]):
Хотя Бизнесмен и не видит разницы, Хираяма уверен, что пересекающиеся тени действительно становятся темнее. «Они должны становиться темнее, это логично». Очень сильная сцена.
К сожалению, Хираяма ошибается. Тени не становились темнее. Источник света всего один, и он довольно далеко, поэтому тень — это просто отсутствие света. Не важно, сколько раз перекрыт источник света.
В 3D-видеоиграх же тени — это нечто совсем иное. Очень легко нарисовать тёмное пятно под ногами персонажа и предполагать, что всё остальное освещено. Возможно, Хираяма вспоминал тень-пятно из Metal Gear Solid, которая становится темнее, когда накладывается на другие?
В реальном мире тени просто существуют, но в играх они разрабатываются и проектируются. Они должны обеспечивать хорошую производительность, но при этом прилично выглядеть. Эта взаимосвязь кажется мне восхитительной, и в статье я объясню, почему. Начнём с простых примеров.
Можно отрисовать на экране изображение тени до отрисовки персонажа. Я говорю не о спрайтах теней, как в Duke Nukem 3D [2], а в буквальном смысле о 2D-изображении без масштабирования. Это срабатывает, если персонаж находится на самом переднем плане, как в Winter Gold или в MDK.

Как я и говорил, это было просто.
Так, а теперь 3D. Отрисуем тёмный диск под персонажем. Вот и всё.
На самом деле, нужно ещё и выровнять диск тени относительно земли, а также подумать, как обрабатывать ситуации, когда тень накладывается на уступ. Например, в Super Mario 64 пятна отрисовываются при помощи особой аппаратной функции, которая, по сути, усекает тень, чтобы она отображалась только на плоскости земли.
Тень-пятно может быть и анимированной. В Super Mario 64 она становится меньше при прыжке, а в Metal Gear Solid она меняет форму [5]. Если вы хотите заморочиться, то можете решить проблему тени над выступом, проецируя четырёхугольник тени как декаль [6].
Пятно — это просто текстура, а на текстуры обычно можно выполнять рендеринг во время выполнения. Так что будем рендерить персонажа сверху и использовать это в качестве тени вместо тёмного круга. Это замечательно работает в Crash 3 (видео [7]), но не очень хорошо в Soldier of Fortune, потому что разработчики оставили разрешение тени очень низким.
Стоит отметить, что это отличается от техники shadow mapping [9], при которой карта глубин рендерится с точки зрения источника света. Здесь мы рендерим только чёрно-белое изображение, используемое как текстура. То есть в каком-то смысле мы говорим об однобитной shadow map.
Как можно сделать тени резче?
Сразу приходит в голову такой вариант: «разгладить» отбрасывающий тень объект на плоскости, спроецировав его от источника света. Затем отрендерить его во второй раз, но уже в чёрном цвете. Такие тени обычно оставляют непрозрачными, чтобы скрыть, как части объекта отрисовываются одна поверх другой. Естественно, тень будет корректна только на плоской поверхности пола.
В некоторых ранних лётных симуляторах плоская тень в проекции сверху рендерилась на взлётной полосе. В процессе своих исследований я надеялся найти примеры того, что тень видна и во время полёта, но не смог обнаружить ни одного.
Визуально они выглядят как чёрные стенсил-тени, отбрасываемые на плоскую поверхность.
Игра Virus [12] (1987 год) Дэвида Брэбена на Acorn Archimedes и других домашних компьютерах отрисовывает космические корабли, отбрасывающие на рельеф тени с проекцией сверху.
Более сложный пример — это Interstate ’76. Разработчики изгибали и растягивали плоскую тень, чтобы она соответствовала наклону поверхности. Тени иногда проходят сквозь землю [13], но в целом эффект довольно правдоподобный. Любопытно, что в показанном ниже программно отрендеренном скриншоте тени слегка прозрачные, а при аппаратном ускорении они полностью чёрные.
Разработчики даже осмелились попробовать проецировать тени больших объектов наподобие мостов [14], и это им успешно удалось.
Но как отбрасывают тени в любом типе сцены?
Этот подход имеет много общего с методикой «Проецируемые тени с текстурой для рендеринга», но работает на поверхностях любой формы. Игра рендерит текстуру тени из проекции сверху, но не отображает её на плоской поверхности, а проецирует текстуру [17] на другие объекты. Можно представить, что это бэт-сигнал [18], но направленный прямо вниз с неба.
Подобные тени можно сделать очень резкими, но они могут выглядеть странно на вертикальных поверхностях и иногда даже отображаются на потолках. См. видео геймплея Sonic Adventure 2: Battle [19] (2001 год, GameCube).
Кроме того, эта техника отлично подходит для деревьев:
Проецированные тени могут просвечивать сквозь объекты, поэтому применимы лишь в особых случаях. Shadow map (карты теней) можно использовать где угодно.
Этот подход обычно используется для реализации теней. Игра отрисовывает изображение глубин (shadow map) с точки зрения источника освещения, и выполняет чтение из этого изображения при рендеринге мира. Это легко сделать, поскольку можно заново использовать обычный код рендеринга игрового движка.
Ограниченное разрешение shadow map приводит к появлению хорошо известных артефактов с забавными названиями, например, Peter Panning и «теневое акне» [20]. Было предложено множество трюков для выделения большей площади shadow map поверхностям, находящимся рядом с камерой, где дополнительное разрешение нужно больше всего. Обычно для красивого отображения необходима некоторая настройка shadow map.
До того, как shadow map стали доминирующей технологией, у них был популярный конкурент.
Ранее популярный способ реализации теней. Стенсил-тени отрисовывают резкие тени на любом типе поверхности. Они создают уникальную атмосферу в стиле фильмов жанра «нуар», который сложно имитировать при помощи shadow map. Самый известный пример — это, разумеется, Doom 3 с его тёмными помещениями:
Стенсил-тени основаны на принципе объёмов теней (shadow volume) — невидимой геометрии, разбивающей мир на освещённые и затенённые пространства. Игра применяет освещение только к тем пикселям, которые не находятся в объёме теней.
Чтобы стенсил-тени работали, мир необходимо перерисовывать множество раз. Если упростить, то игра сначала отрисовывает весь мир с освещением окружающей среды (ambient lighting). Затем для каждого источника света создаются все объёмы тени, за которыми снова следует весь мир, задействуя только незатенённые пиксели. Объёмы отрисовываются разными стенсил-операциями [23] для передних и задних граней [24]. То есть приходится отрисовывать очень большое количество пикселей.
Наверно, самой первой выпущенной игрой со стенсил-тенями стала Severance: Blade of Darkness (2001 год), где тени выглядят великолепно [25].
Читая обзор игры в британской версии журнала Edge за март 2001 года [26](pdf [27]), становится очевидно, что, несмотря на графический прогресс, мир в те времена ещё не был готов к «соулслайкам».
Сегодня стенсил-тени особо не используются. Одна из причин этого заключается в непредсказуемых затратах во время выполнения. Эти затраты зависят от величины объёма тени на экране, а значит, могут сильно варьироваться. Кроме того, был запатентован оптимизированный алгоритм [28]. Для разработки Doom 3 Id Software, похоже, заключила [29] некий договор [30].
Стенсил-тени не обязаны быть резкими. В игре 2001 года Silent Hill 2 для PlayStation 2, как показано выше, стенсил-тени размываются. На консоли это выглядит почти идеально [32].
А что, если тени будут отбрасываться более простой моделью, чем та, которая видна на экране? Например, в Zelda на Nintendo 64 ноги Линка отбрасывают тени, даже если ничто их не отбрасывает:
Уникальный подход использован в Hyperblade — игроки на футуристической хоккейной арене отбрасывают проецируемые тени в виде простых анимированных фигур.
Для фиксации освещения на уровнях игры можно использовать техники цветов вершин и карт освещения (lightmap). Они применялись во многих играх как единственный способ отображения крупных теней, поэтому я и добавил их в статью.
В Ico видно, насколько сложными могут выглядеть тени при обычном старомодном вершинном освещении.
На низкополигональных картах даже резкие тени можно представить в виде цветов вершин. Отличным примером этого может служить Tony Hawk Pro Skater 2 (2000 год, Playstation), которая выглядела великолепно, учитывая простоту техники.
Карты освещения — это классический способ хранения освещения и теней уровней. Вместо того, чтобы хранить цвет для каждой вершины, мы создаём второй набор текстур, хранящий только освещение. Их разрешение может варьироваться в зависимости от областей игры, благодаря чему в нужных местах тени способны быть более точными. С другой стороны, для карт освещения требуется больше памяти, чем для цветов вершин.
Карты освещения были популяризированы игрой Quake (1996 год, PC), где выглядели так: https://jbush001.github.io/2015/06/11/quake-lightmaps.html [35].
На этом мы закончим изучение традиционных методик создания теней. А теперь давайте немного поговорим об освещении в целом.
По возможности в современных играх используются традиционные техники. Вот некоторые из примеров:
Разновидности shadow mapping, например, Cascaded Shadow Maps [36], позволяющие покрывать большие площади, сохраняя при этом высокую скорость.
Карты освещения в сочетании с другими техниками, например, light probe [37]. В Call of Duty по-прежнему используются карты освещения [38], см. слайды Hemispherical Lighting Insights [39].
Идея упрощённой модели персонажа. В The Last of Us (2013 год, PlayStation 3) мягкие тени персонажей отбрасываются при помощи растянутых сфер. См. слайд [40]из доклада Lighting Technology of The Last Of Us (2013) [41]. Кроме того, Unreal Engine поддерживает упрощённые капсульные тени [42] для персонажей.
Проецируемые тени. В Hot Wheels Track Attack (2010 год, Wii) меши теней рендерятся на текстуру, а затем она проецируется на гоночную трассу, как описывается в блоге одного разработчика [43]. В движении [44] игра выглядит великолепно.
В начале статьи мы сказали, что тени образуются отсутствием света. Если игра действительно пытается симулировать физически корректное освещение, то тени должны выглядеть естественно. Даже маленькие геометрические детали отбрасывают точные тени [45], в отличие случая с shadow map. Большие лампы естественным образом создают мягкие тени, а непрямое освещение делает светлее тёмные уголки. Для реализации всего этого потребовалось потратить невероятное количество времени и денег на разработку алгоритмов и оборудования трассировки лучей (ray tracing).
На практике современные игры имеют такие сложные сцены, что описанное выше симулируемое решение необходимо аппроксимировать. Например, в получаемых трассировкой лучей тенях Alan Wake 2 (2023 год) каждый пиксель принимает освещение только от одного случайно выбранного источника [46]. Далее результат подаётся алгоритму устранения шумов [47], который интеллектуальным образом сглаживает шумную картинку. Подробности см. в презентации [48]. Следовательно, даже полученные трассировкой лучей тени не будут «идеальными» и в зависимости от выбранных компромиссов обладают собственным уникальным внешним видом.
И под конец приведём ещё один очевидный вариант.
Иногда тени для вас не главное.
Когда Хираяма в сцене из фильма внимательно изучает тени, его новый друг замечает:
Бизнесмен: Да тебе это действительно нравится.
Думаю, мы, как любители компьютерной графики, разделяем его увлечение.
Все скриншоты взяты с MobyGames [49], если не указано иное. Благодарю mankeli за подробные примечания по первому черновику статьи. Выражаю благодарность noby, msqrt, shaiggon и Warma за отзывы.
Автор: PatientZero
Источник [50]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/ray-tracing/401171
Ссылки в тексте:
[1] сцена целиком: https://www.youtube.com/watch?v=C6cdPxQjHb0
[2] как в Duke Nukem 3D: https://www.mobygames.com/game/365/duke-nukem-3d/screenshots/dos/700154/
[3] отличную видеозаставку : https://www.youtube.com/watch?v=-Pr909aVsNo
[4] ares: https://ares-emu.net/
[5] Metal Gear Solid она меняет форму: https://youtu.be/F2sEmf_HzGI?t=3793
[6] проецируя четырёхугольник тени как декаль: http://blog.wolfire.com/2009/06/how-to-project-decals/
[7] видео: https://youtu.be/HG-NRnGp3RA?t=267
[8] видео FirstPlays HD: https://www.youtube.com/watch?v=wq82etLV0a8
[9] shadow mapping: https://learnopengl.com/Advanced-Lighting/Shadows/Shadow-Mapping
[10] GLQuake: https://quakewiki.org/wiki/GLQuake
[11] Half-Life alpha 0.52: https://www.moddb.com/downloads/half-life-1-alpha-052
[12] Virus: https://www.youtube.com/watch?v=MNXypBxNGMo
[13] иногда проходят сквозь землю: https://30fps.net/pages/videogame-shadows/interstate76_shadow_inside_terrain.jpg
[14] проецировать тени больших объектов наподобие мостов: https://youtu.be/9UyOuqsvs64?t=52
[15] Toy Story 3: The Video Game Rendering Techniques: https://advances.realtimerendering.com/s2010/Ownby,Hall%20and%20Hall%20-%20Toystory3%20(SIGGRAPH%202010%20Advanced%20RealTime%20Rendering%20Course).pdf
[16] видео геймплея на Xbox 360: https://www.youtube.com/watch?v=_8fa81Spo3s
[17] проецирует текстуру: https://paroj.github.io/gltut/Texturing/Tut17%20Projective%20Texture.html
[18] бэт-сигнал: https://en.wikipedia.org/wiki/Bat-Signal
[19] видео геймплея Sonic Adventure 2: Battle: https://youtu.be/EU4CbUoPBi4?t=752
[20] забавными названиями, например, Peter Panning и «теневое акне»: https://learn.microsoft.com/en-us/windows/win32/dxtecharts/common-techniques-to-improve-shadow-depth-maps#shadow-acne-and-erroneous-self-shadowing
[21] Doom 3 shadow engine snapshots: http://warp.povusers.org/doom3snapshots/
[22] Иллюстрация shadow volume : https://commons.wikimedia.org/wiki/File:Shadow_volume_illustration.png
[23] стенсил-операциями: https://learnopengl.com/Advanced-OpenGL/Stencil-testing
[24] передних и задних граней: https://registry.khronos.org/OpenGL-Refpages/gl4/html/glStencilOpSeparate.xhtml
[25] выглядят великолепно: https://youtu.be/irwzEDLZ2gk?t=417
[26] Edge за март 2001 года : https://30fps.net/pages/videogame-shadows/blade_of_darkness_edge_review.jpg
[27] pdf: https://retrocdn.net/images/2/2d/Edge_UK_095.pdf
[28] оптимизированный алгоритм: https://en.wikipedia.org/wiki/Shadow_volume#Depth_fail
[29] Id Software, похоже, заключила: https://web.archive.org/web/20100131044756/http://techreport.com/discussions.x/7113
[30] договор: https://web.archive.org/web/20090818013827/http://www.theinquirer.net/inquirer/news/1019517/creative-background-doom-iii-shadow-story
[31] скриншоты: https://imgsli.com/MzExMjcy/
[32] это выглядит почти идеально: https://youtu.be/nna2yt1c9gI?t=354
[33] видео Bit Games Reviews: https://youtu.be/EpScHKYEEpE?t=43
[34] стенсил-тени: https://youtu.be/QCOAqyOE_V4?t=438
[35] https://jbush001.github.io/2015/06/11/quake-lightmaps.html: https://jbush001.github.io/2015/06/11/quake-lightmaps.html
[36] Cascaded Shadow Maps: https://learnopengl.com/Guest-Articles/2021/CSM
[37] light probe: https://computergraphics.stackexchange.com/a/244
[38] по-прежнему используются карты освещения: https://30fps.net/pages/videogame-shadows/CoD_Hemispheres_Presentation_Notes_p6.jpg
[39] Hemispherical Lighting Insights: https://advances.realtimerendering.com/s2024/content/Roughton/SIGGRAPH%20Advances%202024%20-%20Hemispheres%20Presentation%20Notes.pdf
[40] слайд : https://30fps.net/pages/videogame-shadows/tlou1.jpg
[41] Lighting Technology of The Last Of Us (2013): http://miciwan.com/SIGGRAPH2013/Lighting%20Technology%20of%20The%20Last%20Of%20Us.pdf
[42] капсульные тени: https://dev.epicgames.com/documentation/en-us/unreal-engine/capsule-shadows-overview-in-unreal-engine
[43] блоге одного разработчика: https://www.bryanmcphail.com/wp/?p=640
[44] В движении: https://youtu.be/k85H5C7P0RY?t=349
[45] отбрасывают точные тени: https://images.nvidia.com/geforce-com/international/comparisons/control/control-ray-traced-contact-shadows-interactive-comparison-001-on-vs-off.html
[46] только от одного случайно выбранного источника: https://30fps.net/pages/videogame-shadows/aw2_restir.jpg
[47] алгоритму устранения шумов: https://30fps.net/pages/videogame-shadows/aw2_direct_lighting.jpg
[48] презентации: https://www.nvidia.com/en-us/on-demand/session/gdc24-gdc1003/?playlistId=playList-821861a9-571a-4073-abab-d60ece4d1e49
[49] MobyGames: https://www.mobygames.com/
[50] Источник: https://habr.com/ru/articles/855042/?utm_campaign=855042&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.