Shadow in game how it's working
Общая заметка о все прочем, что связано с работой теней в игре.
Как и где включаются, как управляются и общие примечание по теории теневого объема.
Собственно Теневой Объем.
(взято из открытых источников(С) уроки по ОпенГл и прочее)
«Теневой объем» формируется из лучей, испускаемых источником освещения, далее проходящих через контур затеняющего объекта (со стороны источника света) и продолжающихся за пределы сцены.
Теневой объем (Stencil Shadow Volume) - это интересная техника, которая дает простое решение проблеме точечного источника. Эта техника открыта William Bilodeau и Michael Songy в 1998 и получила популярность у John Carmack в его движке для Doom 3 (2002)...
...Свет вычислялся только для объектов внутри действия источника света. Теперь мы собираемся поступить наоборот. Мы будем создавать теневой объем и вычислять свет только для объектов вне. Аналогично тому, как мы делали для света, будет использоваться буфер трафарета как ключевой компонент алгоритма. Отсюда и название - Теневой объем (Stencil Shadow Volume).
Идея алгоритма теневого объема в продлении силуэта объекта, который был создан при падении света на него, в объем, а затем рендерить этот объем в буфер трафарета, используя пару простых операций над трафаретом. Суть идеи в когда объект внутри объема (а следовательно в тени) передние полигоны объема выигрывают тест глубины против полигонов объекта, а задние полигоны объема проигрывают этот тест.
https://triplepointfive.github.io/ogltutor/tutorials/tutorial40.html
https://cyberleninka.ru/article/n/realizatsiya-teney-s-pomoschyu-biblioteki-opengl
https://en.wikipedia.org/wiki/Shadow_volume
Примечание.
Оригинальные модели теней, тех, что можно видеть в моделях, используют свойства Трафарета на уровне движка.
Т.е. оные свойства добавлены к графику сцены в который помещаются (шейпы) объекты помеченные, как "тень".
И есть мнение, что делают это неправильно.
Т.е. настройки трафарета не совсем корректны, отчего и наблюдается такой лютый просад фпс при включении теней.
Особенно в режиме High detail.
А равно и "перехлесты" полигонов.
Это пример из одного учебника по OpenGl, где левое изображение весьма похоже на то, что можно видеть в МВ.
Примечание об игровых тенях (ванильных не МГЕ!)
Greatness7 писал:
shadows work like this
there is a plane in front of camera
and it has stencil property so it only is visible on specific pixels
and the shadow meshes of NPCs set the stencil ref
|
|
Примечание.
Создание
теней, возможно также только опосредованно.
Т.е. Shadow Volume потребует дополнительно настроенных поверхностей.
Т.е. можно создать эффект тени через МВСЕ 2.0 на ЛУА для конкретных объектов в определенных приделах.
@_Notes_for_Modmaking_ver(video_only)\Additional_Files\Tours\@How_To\NiStencilProperty\MoreAdvanced(Vids+Nifs)\2020-05-27_18-35-00 - Streamable.mp4
Здесь можно видеть пример такого действия.
С помощью ЛУА (МВСЕ) был создан эффект подобный игровым теням.
Управление тенями через меню игры и МВ.ини.
Тут конечно все очень "мило"...
Основные настройки теней находятся в МВ.ини файле, но включение и обновление оных идет через реестр!
Т.е. тот бегунок качества теней в меню настроек игры, отвечает за считывание параметров из МВ.ини и отправку их в реестр.
Откуда, игра их снова считает и "применяет на практике".
При этом, выглядит так, что налету менять значения в МВ.ини файле не получается.
Т.е. при запущенной игре, смена значения и перемещение бегунка качества в настройках, не повлияют на изменение видимого на экране.
Следует перезапустить игру, подвинуть ползунок и только тогда поведение теней изменится.
|
|
|
"ползунок" в меню игры.
Здесь "полн" = 45.
|
МВ.ини файл.
Maximum Shadows Per Object=45
|
Значение в реестре после "ползунка". Также приняло значение 45.
|
После увеличения кол-ва доступных теней, в МВ.ини файле, следует обязательно вызвать меню и поправить положение ползунка.
Т.к. крайнее правое положение оного, соответствует значению указанному в Maximum Shadows Per Object=ХХ.
Т.е. если там =1, то и "максимальное качество теней" будет = одна штука в кадре.
Если 100, то сто теней могут быть выведены на экран.
Т.е. этот бегунок просто повышает кол-во теней в кадре, а не их качество!
Которое ограничено качеством моделей, либо качеством шейпов тени. Собственно объекта названного tri Shadow в ниф файле.
Если значение Maximum Shadows Per Object=0, то ползунок будет сброшен в крайне левое значение.
По МВ.ини.
Настройки теней работают из этих разделов:
Number of Shadows=
Maximum Shadows Per Object=
Эти разделы добавляются вручную дополнительно, по дефолту их нет!
High Detail Shadows=
shadow volume=
shadow overlay=
Вот эти разделы работают совместно и именно они отвечают за кол-во теней на экране!
Не за качество, но лишь за колличество!
Сколько и от скольких источников света их будет.
Number of Shadows= общее кол-во допустимых теней в кадре.
Maximum Shadows Per Object= общее кол-во допустимых источников света от которых будут отбрасываться тени.
Т.е. если:
Number of Shadows= 1
Maximum Shadows Per Object= 5
То в сцене будет только одна тень от ближайшего к игроку источника света.
И, скорее всего, только его собственная. Если он включил режим от 3его лица.
Но если:
Number of Shadows= 5
Maximum Shadows Per Object= 5
То уже 5 теней будет на экране, от 5 источников света!
Т.е. одна от игрока + 4 от ближайших к нему НПС (или существ).
Если вид от 1го лица, то будет 5 теней.
Если есть желание убить фпс за ради принципа, то можно сделать так:
Number of Shadows= 255
Maximum Shadows Per Object= 255
Конечно в сцене должно быть 255 фонариков, иначе особого проку не будет.
Т.е. по идее правильно делать, что кол-во теней = кол-ву допустимых источников света.
Если:
Number of Shadows= 5, то и Maximum Shadows Per Object=5
Если эти разделы заблокированы (или удалены):
;Number of Shadows=15
;Maximum Shadows Per Object=15
;High Detail Shadows=1
То "ползунок" будет всегда сбрасываться в крайнее левое положение.
Т.е. тени не смогут быть активированы в принципе.
Далее.
High Detail Shadows=1 либо 0.
Другие значения не принимаются.
Т.е. будут равны нулю.
Включает использование видимых сеток брони (одежды, тел существ и нпс) вместо упрощенной модели.
Отличается крайне плохой реализацией и дурным воздействием на фпс.
Работает через закидывание таких деталей (доспеха и пр.) в график теней.
Не вполне ясно что делают.
shadow volume=
shadow overlay=
Есть в коде, при попытках записать в МВ.ини файл, вроде бы включает волнообразную пульсацию теней.
Также, значения с такими названиями есть графике сцены отвечающего за создание теней.
Возможно эти значения и ничего не делают вовсе.
Итого.
Тени движком игры создаются (по видимости) в режиме теневого объема, но также весьма возможно, имеющего не вполне корректные настройки по
стенсилам.
Для управление их кол-вом следует редактировать МВ.ини файл и затем реестр, напрямую, или через игровое меню.
Просчет теней идет как от глобального освещения, так и от известного числа локальных источников.
В интерьерах, если есть (рядом с игроком) локальный источник света, глобальное освещение не учитывается.
Если нет - то добавляется в график сцены, такой объект и уже от него, игрок и прочие, начинают получать "тени".
В экстерьерах, наоборот, сначала все объекты отрабатываются по глобальному освещению и лишь затем, может быть учтено локальное.
Если игрок и нпс достаточно близки к такому фонарику.
Также на просчет теней, влияет радиус такого локального источника света.
|
|
Shadow в шлеме, название и флаг.
В целях оптимизации фпс, Тень собрана из трех плоскостей.
|
Тест теней в статике.
Каждая планка имела такое же название шейпа.
Флагов не было, результат - вот.
Тени не отбрасывались, объект не скрывался.
|
|
|
График теней в игре, куда попадают все объекты, из ниф файлов, названные Shadow.
|
В Morrowind.ini включен режим High Detail Shadows = 1.
Теперь можно видеть как это работает.
Т.е. части тел, сетки животных и пр. загружаются в этот график сцены. Учитывая большое кол-во объектов и кривую реализацию "теневого объема", не удивительно что это начинает просаживать фпс.
При этом! (см. далее)
|
|
|
При этом! Если в сцене указано использование нескольких источников света, то каждый из них будет отрабатывать одинаковый набор объектов.
Здесь один игрок находится в пустом помещении с десятком источников освещения.
Но отрабатываются только 3 из них.
Как это указано в Ини файле.
Maximum Shadows Per Object=3
Вот этот параметр отвечает от скольких источников света в сцене будут отрабатываться тени.
Т.е. к какому кол-ву фонариков будут "аттачены" (добавлены)
объекты из которых сформируются тени.
Чем больше - тем хуже для фпс.
И если High Detail Shadows = 1 и высокополигональные реплейсеры, то проще сразу "потушить свет"(С) т.к. фпс уедут в район плинтуса.
Важно! Кроме
Shadows Per Object=ХХ учитывается параметр:
Number of Shadows=ХХ
Т.е. если указать Number of Shadows=1 и Maximum Shadows Per Object=155, в сцене будет одна тень и как следствие, только от ближайшего к (игроку) объекта.
Собственно об этом было сказано выше.
|
Здесь игрок с видом от 1го лица.
Тени не подключены.
Т.к. оные работают только для файла с видом от 3его лица и существ.
Которых также нет в сцене. Поскольку в сцене только один игрок, то и теней больше не от кого отбрасывать.
|
|
|
Игрок переключился на вид от 3его лица.
И сразу же появились "новые объекты" в этих графиках сцены.
Если их раскрыть, то см. скрин выше.
Там окажутся части бодипартов брони и одежды.
Если отключить High Detail Shadows = 1 , то
|
...получится вот такая сцена.
Здесь появляются те самые tri Shadow, о которых собственно и речь в этой заметке.
Т.е. начинают использоваться примитивы помеченные как tri Shadow.
|
|
|
В экстерьерах (по видимости) отрабатывается только один глобальный источник света.
По крайней мере, если рядом с игроком нет иных светильников и все НПС (существа) находятся дальше радиуса иных фонариков.
Здесь игрок вошел в локацию с несколькими НПС (кальдера)
и как видно, только их shadow объекты помещены в ноду глобального направленного освещения сцены.
Если игрок находится в интерьере, но в удалении от локальных источников света...
Его тень будет работать... от! Sky_Ambient_Light
т.е. в сцену добавится еще один источник глобального освещения и исходя от его положения будет рисоваться тень от игрока.
|
Здесь в МВ.ини включено использование множества теней от множества источников света.
И вот они видны в графике теней.
Не надо ходить к гадалке, что такое деяние, не благоприятно скажется на фпс.
Особенно если включить High Detail Shadows = 1 и накинуть известное число хайполи реплейсеоров брони.
|
|
|
Вероятно: Shadow Overlay - та самая плоскость о который выше писал Г7.
Shadow Volume - набор объектов по которому идут вычисления теневого объема.
|
Что делает раздел Scene Object - не определено.
Может быть, что в него каким-то образом может попасть "теневой объект" от статики, или активатора?
Shadow Camera Root - та камера, на основе которой вычисляется проекция тени относительно источника.
Точка проекции "света" от источника = позиции оного.
Здесь это Sky_directionalLight и прочее.
|