Расскажу о различных реализациях эффекта размытия на GLSL.
Для начала хочу сразу предупредить — я поставил для себя ограничения использовать версию GLSL не выше 1.1. Это нужно для того, чтобы приложение работало на как можно большем количестве устройств и систем. Так, например, у меня были в распоряжении iMac с Radeon HD 6750M и максимально поддерживаемой версией GLSL 1.2, ноутбук с Kubuntu на intel hd 4000 с версией GLSL 1.3 и десктоп с GeForce gtx560.
Эффекты постараюсь описать простыми словами и без сложных формул, основная цель — привести примеры способов размытия. Статья является подготовительной к последующим двум статьям.
Размытие по Гауссу
Рассмотрим классическое гауссово размытие. Где только о нем не писалось, возможно это самый популярный способ размытия в геймдеве и не только. Но я не могу его не рассмотреть, хотя бы вкратце.
Что вообще представляет из себя размытие? Грубо говоря это усреднение соседних пикселей, то есть рассматривая текущий пиксель, мы находим средний цвет всех его соседей в определенном радиусе. Но если использовать простое среднее арифметическое (равномерное распределение), то размытие будет не очень красивым. Поэтому обычно соседей умножают на коэффициенты, значения которых подчиняются нормальному закону распределения (оно же распределение Гаусса, отсюда и название размытия).
Skyrim News (Motion Blur, OAR, Sneak Crawling, Hidden Blade, Sirenroot, Light Limit, New Dodge Mod)
размытие с равномерным и нормальным распределением соответственно
У Гауссова размытия есть одно важное свойство — сепарабельность. Это дает возможность разделить алгоритм на две части — размытие по координате x и размытие по y. Таким образом коэффициенты не нужно рассчитывать для всех соседей, достаточно найти для одного столбца или строки. Коэффициенты можно найти по формуле Гаусса:
,
где μ — математическое ожидание, а σ — дисперсия.
- Рендерим сцену в первый буффер
- Рендерим изображение во второй буффер с шейдером размытия по вертикали
- Рендерим снова в первый буффер с размытием по горизонтали
Шейдеры
#version 110 attribute vec2 vertex; attribute vec2 texCoord; varying vec2 vTexCoord; void main()
Фрагментный:
#version 110 const int MAX_KOEFF_SIZE = 32; //максимальный размер ядра (массива коэффициентов) uniform sampler2D texture; //размываемая текстура uniform int kSize; //размер ядра uniform float koeff[MAX_KOEFF_SIZE]; //коэффициенты uniform vec2 direction; //направление размытия с учетом радиуса размытия и aspect ratio, например (0.003, 0.0) — горизонтальное и (0.0, 0.002) — вертикальное varying vec2 vTexCoord; //текстурные координаты текущего фрагмента void main() < vec4 sum = vec4(0.0); //результирующий цвет vec2 startDir = -0.5*direction*float(kSize-1); //вычисляем начальную точку размытия for (int i=0; i
Эффект боке
- Нормальный закон распределения можно заменить на равномерный
- Добавляется еще один, третий проход
- Размытие теперь происходит не по вертикали и горизонтали, а по трем векторам, угол между которыми 120°
- В шейдере теперь помимо суммы цвета, находится так же максимальный цвет по всем выборкам, после чего оба цвета смешиваются в заданной пропорции
Шейдер
Вершинный остается прежним, фрагментный:
#version 110 uniform sampler2D texture; //размываемая текстура uniform vec2 direction; //направление размытия, всего их три: (0, 1), (0.866/aspect, 0.5), (0.866/aspect, -0.5), все три направления необходимо умножить на желаемый радиус размытия uniform float samples; //количество выборок, float — потому что операции над этим параметром вещественные uniform float bokeh; //сила эффекта боке [0..1] varying vec2 vTexCoord; //входные текстурные координаты фрагмента void main() < vec4 sum = vec4(0.0); //результирующий цвет vec4 msum = vec4(0.0); //максимальное значение цвета выборок float delta = 1.0/samples; //порция цвета в одной выборке float di = 1.0/(samples-1.0); //вычисляем инкремент for (float i=-0.5; igl_FragColor = mix(sum, msum, bokeh); //смешиваем результирующий цвет с максимальным в заданной пропорции >
размытие с разным коэффициентом bokeh: 0.2, 0.5, 0.8 (картинка кликабельна)
- На один draw call больше и примерно на треть больше выборок по сравнению с предыдущим методом
- Форма боке — только правильные многоугольники с четным количеством углов
- Невозможно применить в алгоритме размытия по глубине
Есть еще несколько способов сделать этот эффект, вот один из них: проходимся по текстуре специальным шейдером, в котором выявляем наиболее контрастные места и записываем их координаты в буффер, далее размываем текстуру любым способом без эффекта боке, после чего рендерем прямо поверх нее спрайты-боке в тех координатах, что нашли на первом шаге. Достоинства такого метода — форма боке может быть любой формы, из недостатков — нужны геометрические шейдеры, что исключает слабые девайсы, а так же на каждый пиксель боке не отрисуешь — получим дикий филлрейт.
Размытие по глубине
Полное название эффекта — глубина резко изображаемого пространства, или DoF (Depth Of Field). Название говорит само за себя — все, что находится в фокусе — четко, вне фокуса — размыто. На первый взгляд эффект кажется простым, но есть моменты, которые его усложняют как в плане стоимости ресурсов, так и в плане реализации. Один из его недостатков — невозможно применить предыдущие подходы, из-за того, что он не обладает свойством сепарабельности, а значит нельзя разделить на несколько проходов (размытие по вертикали и горизонтали). Иногда можно смухлевать: отрендерить сначала задний план и размыть его, потом передний без размытия. Конечно это будет не полноценный эффект, но ощущение размытия по глубине будет. Но если сцена заполнена объектами по всей глубине, то придется размывать более «честным» способом. Но совсем честные способы обычно не используют — слишком много выборок, поэтому как правило в качестве выборок берут небольшое облако точек в определенном радиусе от рассматриваемой. Наиболее оптимальное распределение таких точек носит название диск Пуассона — от полностью случайного распределения точек его отличает то, что точки находятся примерно на равном расстоянии друг от друга. Есть множество способов получить диск Пуассона, я для себя использую этот:
- пусть r — радиус диска, тогда верхняя граница диска yMax=r, а нижняя yMin=-r.
- в цикле по yR от yMin до yMax выполним следующее:
- найдем xMax=cos(asin(yR/r))*r и xMin=-xMax.
- во вложенном цикле по xR от xMin до xMax найдем точку с координатами (xR, yR).
- далее координаты этой точки сместим на случайную величину от -r/4 до r/4
- полученные таким образом точки и есть искомые.
Что из себя представляет этот алгоритм? Мы просто грубо говоря делим окружность сеткой и идем построчно по узлам этой сетки слева направо сверху вниз. Координаты этих узлов случайным образом немного смещаем и получаем искомый диск Пуассона.
На самом деле это не совсем диск Пуассона, но он очень на него похож, сравните сами (слева моя реализация, справа точки сгенерированные по этому алгоритму):
Реализация на C++
float yMax = r; float yMin = -r; yMin += fmod(yMax-yMin, 1)/2; for (float y=yMin; y
На картинках выше точек очень много, на деле их достаточно около 10-20. После того как точки получены, по ним можно делать выборку. Но сначала поговорим о силе размытия.
Информацию о силе размытия для каждого пикселя будем хранить в альфа-канале. Сила размытия варьируется от -1 до 1, где единица — максимальное размытие, ноль — размытия нет. Я использовал HDR текстуру (RGBA16F), но эту информацию можно закодировать и в обыкновенный 8-битный альфа-канал:
a=depth*0.5+0.5 — кодирование
a=depth*2.0-1.0 — декодирование, где depth — сила размытия [-1..1]
Параметр depth (сила размытия) можно рассчитать по формуле: (focalDistance+zPos)/focalRange, где focalDistance фокусное расстояние, focalRange — диапазон или глубина размытия. Отрицательность значения depth говорит том, что текущий объект или фрагмент находится перед фокусом, если depth положительное — то за фокусом. Кстати, на самом деле не обязательно хранить знак, это увеличит диапазон значений в два раза (может быть критично для 8-битной текстуры), но при этом в шейдере при размытии невозможно будет понять, перед или за фокусом находится фрагмент — из-за этого могут возникнуть артефакты.
Итак, делая выборку используя диск Пуассона мы получаем информацию о цвете пикселя и о том с какой силой его нужно размывать. Помните коэффициенты выборок в двух предыдущих алгоритмах? Так вот, теперь в роли этих коэффициентов выступает сила размытия (конечно по модулю). Так же сила размытия влияет на радиус размытия текущего фрагмента. Еще следует рассказать о паразитном эффекте возникающем при текущей реализации — если граница глубины резкая (переход между дальним и ближним объектом), то между ними может наблюдаться нечто вроде муара или ореола, в этом случае просто корректируем коэффициент.
В качестве дополнительного улучшения алгоритма можно использовать вторую текстуру — меньшего размера и слегка размытую. Это позволит сократить количество выборок и улучшить качество размытия.
Спасибо Chaos_Optima, забыл написать про недостаток у этого метода: он проявляется на границах ближних объектов, когда они начинают размываться, их границы остаются резкими.
Шейдер
Во фрагментном шейдере рендера сцены:
float blur = clamp((focalDistance+zPos)/focalRange, -1.0, 1.0); gl_FragColor = vec4(color, blur);
Вершинный шейдер размытия такой же как и в предыдущих методах, фрагментный:
#version 110 const int MAX_OFFSET_SIZE = 128; //максимальный размер массива точек диска Пуассона uniform sampler2D texture; // текстура с отрендеренной сценой uniform sampler2D lowTexture; // уменьшенная и размытая текстура со сценой uniform int offsetSize; // размер массива точек диска Пуассона uniform vec2 offsets[MAX_OFFSET_SIZE]; // диск Пуассона varying vec2 vTexCoord; // входящие текстурные координаты void main() < float currentSize = texture2D(texture, vTexCoord).a; //запоминаем силу размытия фрагмента vec4 resulColor = vec4 (0.0); //результирующий цвет for (int i=0; i= currentSize ? 1.0 : highSample.a; //корректировка весов (вклад, окторый вносит текущая выборка в результирующий цвет) sampleSize = abs(highSample.a); resultColor.rgb += highSample.rgb * sampleSize; //суммируем цвет resultColor.a += sampleSize; //увеличиваем общий вес > gl_FragColor = resultColor/resultColor.a; >
результат работы шейдера — размытая палка
Ссылки
- encelo.netsons.org/2008/04/15/depth-of-field-reloaded — один из способов сделать DoF
- www.gamedev.net/topic/563149-real-time-bokeh-high-quality-dof — я понял, что изобрел очередной велосипед, после того как наткнулся на эту страницу и прочитал последний пост
- steps3d.narod.ru/tutorials/depth-of-field-tutorial.html — реализация Dof
- www.jasondavies.com/poisson-disc — как сгенерировать диск Пуассона
- openglinsights.com — в этой книге рассматривается реализация DoF с эффектом боке на GLSL 4.2
Источник: habr.com
Компиляция — Интерфейс (SE)
Обратите внимание:
Если безплагиовая часть компиляции вызывает проблемы с другими модами на интерфейс, удалите файл DataInterfacestartmenu.swf (либо вообще всю папку Interface, если хотите решить проблему кардинально).
— Безплагиовая часть компиляции полностью совместима со SkylightUI (SE), но не совместима с полноценным SkyUI (SE).
Обновление 1.1:
— Добавлено исправление перевода от death7lord (файлы в открытом виде обладают приоритетом над запакованными в bsa, потому компиляция не должна иметь ограничений по версии Skyrim SE). Шлём дэфлорду лучи добра и поддержки за его нелёгкий труд.
Описание:
Компиляция лучших и популярнейших модов на интерфейс в игре Skyrim SE. Делал для себя, для экономии места в листе загрузки и быстрой установки.
Состав безплагиновой части (в папках):
— A Quality World Map 9.0.1: улучшение игровой карты
— Better Dialogue Controls 1.2: улучшение контроля в диалогах
— Better MessageBox Controls 1.2: улучшение контроля в сообщениях
— LoadTime UI tweaks 1.1: удаление рекламы, лого и снега в главном меню
— NEW HD textures for INTERFACE and sounds 2.0: новое оформление меню навыков
— Pastel Map Markers: цветные маркеры карты
— Russian Localization — Fixes and Adds 1.05 (death7lord): исправление перевода, русификация вывесок и фикс консоли
Требования:
— Skyrim SE
Установка:
— Если у вас установлены моды из плагиновой части — удалите их перед установкой.
— Скопируйте (с перезаписью имеющихся) файлы мода в папку Data, подключите плагин в лаунчере.
Удаление:
— Удалите файлы мода из папки Data
Вопросы и ответы:
В) Мод конфликтует с чем-нибудь?
О) Да, мод может конфликтовать с любым модом, делающим то же самое.
Если вам пришлись по душе моды, что я выкладываю, вы можете поддержать меня:
— Счёт в Сбербанке: 40817810356003227754
— Яндекс-кошелёк: 410011993475062
Заодно увидим, много ли стоят мои труды. Спасибо!
Источник: gamer-mods.ru
My Requiem Patch
На этой страничке я выкладываю свои патчи/моды для Requiem и переводы интересных мне модов.
пятница, 14 июня 2019 г.
All in One
Рубрика
All in One
Тут публикуются сборники, входящие в мою сборку.
Сразу оговорюсь, я не являюсь автором ни одного из этих модов. Вся моя работа заключалась в оптимизации, устранении конфликтов, объединении, одним словом – создании сборника модов.
Зачем тогда все это? – спросите вы. Отвечаю: в состав сборников входят моды, которые изменяют/привносят мелочи. Все вместе это выглядит здорово, но появляется проблема – они занимают место в лоадордере, которое, как известно, ограничено. И так, первое – сокращение количества подключаемых плагинов.
А второе, как я вскользь упоминал ранее – конфликты. В сборнике все конфликты устранены, в отличие от десятка разбросанных по лоадордеру плагинов.
И так, если это вас заинтересовало, то вот что есть на данный момент:
Realistic Physics Pack : в основе More Accurate Collision (версии 1.2.6.2.4) – перерабатывает сотни ванильных моделей, улучшая коллизии. Решетки и все возможные щели теперь «простреливаются», а стрелы больше не будут «зависать» в воздухе, из-за того, что застряли в невидимой преграде ( рекомендую посетить «Новый Гнисис», чтоб испытать «прострел» ). Помимо этого подключено с десяток различных модов на физику, начиная от реалистичного падения и заканчивая расчетом физики скольжения предмета по наклонной плоскости
( т.к. у многих вещей появилась физика, то некоторые вещи могут вести себя странно ).
Совместим со скелетом XP32. Сначала устанавливайте данный пак, затем скелет с перезаписью.
dD — Realistic Ragdoll Force — Realistic
ERSO 26 — Realistic Fall Damages
Npc Havok Hit
Physics Impact Damage Fix
Skyrim Mixed Enhanced Physics — Force and Projectiles
dD-No Spinning Death Animation Merged
Duke Patricks — Skyrim Friction Fix
More Accurate Collision
Mac — Override
Dead Body Collision
Realistic Death Physics — No Animations — Skyrim
Block Sparkles
Sinking Bodies
Proper Aiming
*01.07.20 — Уменьшен урон от падения. Опять. Обновлен More Accurate Collision.
*14.09.19 — Уменьшен урон от падения. Но прыжок с башни все равно убьет вас.
*12.09.19 — Добавлен фикс, корректирующий стрельбу
Skyrim — Fix Pack : сборник различных исправлении, начиная от увеличения fps в интерьерах и заканчивая различными улучшениями из Supplemental Patch.
Skyrim Project Optimization — Full Version
No Radial Blur
Plane Optimization
No stretching
Skyrim Improved Puddles-DG-HF-DB
Improved Hearthfire Lighting
No_stretching_Markarth
Skyrim Supplemental Patch
No Scaling Race
animated Clutted
Update:
*02.07 — из сборника удален «SkyFalls and SkyMills» из-за странного поведения мельниц.
Immersive Player v3: все, что позволяет хоть как-то «оживить» главного героя( куча скриптов, может снижать стабильность вашей сборки ).
R_TtD_OutfitForMages
Headtracking
Footprints
Dual Wield Parrying_SKSE
vwr Wet Eyes
get Snowy
Combat Fatigue
Dovahkiin prayer
Simply Knock
Immersive Animated Looting
Immersive Locations v3 : в первую очередь, это декорационный сборник. Теперь, на просторах Скайрима, есть на чем остановить свой взгляд. По мимо этого, добавляет различные тайнички с сокровищами, которые вы можете поискать. ( совместим с различными текстурами/изменениями городов( внутренней части )/изменениями растительности )
Skyrim Bridges
SignTown_by_YURIL
Lanterns Of Skyrim — Around Cities_bright
Hold Border Banners
Skyrim Sewers
Underwater Treasure
Hidden Hideouts of Skyrim
Cidhna Mine Expanded
more things to steal
The Ruins
treasure hunt
Point The Way
stonhenge + hilltops
fallen tree bridges
goldpilesyum
White Lighthouse
Nordic Ruins of Skyrim
Работы Mnikjom
Solitude Temple Frescoes
!NB : Для модуля важен порядок загрузки. Располагайте его выше модов, изменяющих города.
*13.10.20 — в сборник добавлены некоторые работы Mnikjom. Спасибо Сердце Ангела за предоставленные материалы.
*10.07.20 — в сборник добавлены новые руины и интересные места.
*26.09 — из сборника удалены виселицы, из-за вероятности краша игры.
Armor&Weapon Pack: Если вы, как и я, обожаете разнообразие, но вас всегда останавливал вопрос совместимости модов (как между собой, так и с реквиемом), то этот пак для вас! Пак собирался на протяжении всего времени существования Skyrim. Оттачивался, моды подгонялись друг под друга, и все это отшлифовывалось под реквием. В паке вы найдете популярные моды, по типу Immersive Weapon и Lore Weapon, так же и мало известные работы, по типу Oblivion Weapon и Dark Souls Armor, по мимо паков, так же включены различные одиночные работы и сеты команды TeamTAL. Вспомните любую понравившуюся вам броню/оружие — 80% это есть в этом паке.
Инструкция по установке тут. ( ссылка на мегу. Если хром не открывает, попробуйте зайти через огнелиса )
Пак все еще развивается. Вы сами можете повлиять на его модули: для этого отпишитесь здесь, либо в ЛС.
Источник: drequiempatch.blogspot.com