×
Menu

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 и прочее.