Препарируем Prepar3D. Шейдеры. — Prepar3D v3

Шейдерная постобработка изображения «в реал тайм» такими средствами, как Reshade/SweetFX/ENB — маст хев для любого симера. Наиболее популярная утилита Reshade — http://reshade.me/
[http://reshade.me/fo…orial-for-users— здесь букварь по ней].
Что в ней плохо: «хакерские» способы встраивания в систему, за счет перехвата вызовов DirectX/OGL. Это иногда приводит к тому, что на определенных сочетаниях драйверов, версий и игр, они могут перестать работать или становятся нестабильны.
На Windows 10 у меня, например, Reshade регулярно приводит к падению сима при переходе из оконного в полноэкранный режим и обратно.
Кроме того, есть еще тонкий момент: последовательность постобработки. Некоторые эффекты следует применять в определенном порядке.
Например, если сначала применить сглаживание MSAA, а затем HDR, то результат будет отличаться от результата, когда сначала применяется HDR, а затем сцена сглаживается. [ИМХО, это одна из возможных причин невысокого качества MSAA в Prepar3D].
То же относится и к FXAA или LumaSharpen. Некоторые соображения по этому вопросу более предметно можно почитать здесь: https://mynameismjp…./msaa-overview/(раздел «WORKING WITH HDR AND TONE MAPPING»)
Если вся постобработка идет в Reshade, то никаких проблем: порядок применения эффектов настраивается в конфиге Reshade.
Но если часть эффектов делает сим, а только после этого сцену обрабатывает Reshade, повлиять на это невозможно.
Математика и алгоритмы, которые заложены в основу эффектов, используемых Reshade, меняется гораздо медленнее. Или уже не изменится.
Поэтому наработки, сделанные командой Reshade по обработке изображений (шейдеры — http://www.gamedev.ru/terms/Shader),если Reshade не работает, или просто не нужен во всей полноте, можно адаптировать и к Prepar3D.

Как это сделать:

Spoiler

#include «Quad.sh»
Texture2D<float4> srcTex;
// ——-Этот блок вытаскиваем из нужного конфига SweetFX, не забывая удалить два обрабтных слеша в нижеследующей строке ————
//>Sepia settings<
#define ColorTone float3(1.40,1.10,0.90) //[0.00:2.55] //-What color to tint the image.
#define GreyPower 0.11 //[0.00:1.00] //-How much desaturate the image before tinting it.
#define SepiaPower 0.58 //[0.00:1.00] //-How much to tint the image.
///———————————————————————————————————————————-
float4 SepiaMain(PsQuad vert) : SV_Target
{
//—- Этот блок одинаков почти для всех эффектов препара, которые требуют только текстуру, но не требуют геометрию — получаем координаты текстуры и загружаем ее
// Get the texture dimemsions.
uint2 uTDim, uDDim;
srcTex.GetDimensions(uTDim.x,uTDim.y) ;
int3 iTexCoord = int3(uTDim.x * vert.texcoord.x, uTDim.y * vert.texcoord.y, 0) ;
float4 color = srcTex.Load( iTexCoord ) ;
//—————————————
// ниже это адаптипрованный блок кода для эффекта из SweetFX.
float3 sepia = color.rgb;
// calculating amounts of input, grey and sepia colors to blend and combine
float grey = dot(sepia, float3(0.2126, 0.7152, 0.0722));
sepia *= ColorTone;
float3 blend2 = (grey * GreyPower) + (color.rgb / (GreyPower + 1) ) ;
color.rgb = lerp(blend2, sepia, SepiaPower) ;
// returning the final color
return color;
}

Как этот файл получен:
1.1. Заготовку можно взять из примера пост-обработки Prepar3D (Example.psh в каталоге ShadersHLSLPostProcess). В этот файл вытаскиваем настройки для эффекта Sepia.
Дефолтные настройки для SweetFX лежат в каталоге [Каталог Reshade]ReShadeSweetFX.cfg
Персонализированные настройки (те, которыми реально пользовались и подстраивали под себя Медиатором в симе) для вашего профиля в Reshade ищем здесь:
[Каталог ReShade]ReShadePersonalFilesPresets[Игра]SweetFX.cfg
(У меня, например, путь такой: d:ReShade Framework 1.1.0ReShadePersonalFilesPresetsLockheed Martin® Prepar3D®SweetFX.cfg)
В этом файле ищем блок, предназначенный для эффекта Sepia. Он содержит параметры эффекта. Вот он:

//>Sepia settings<\
#define ColorTone float3(1.40,1.10,0.90) //[0.00:2.55] //-What color to tint the image.
#define GreyPower 0.11 //[0.00:1.00] //-How much desaturate the image before tinting it.
#define SepiaPower 0.58 //[0.00:1.00] //-How much to tint the image.

Этот фрагмент вставляем в наш файл, не забывая удалить два обратных слеша из строки //>Sepia settings<\.
1.2. Далее в Reshade ищем ищем файл с кодом, где располагается сам эффект. Файл должен содержать имя эффекта и может располагаться либо здесь [Каталог Reshade]ReShadeSweetFXSharedShader либо здесь: [Каталог Reshade]ReShadeSweetFX
Конкретно для сепии он здесь: [Каталог Reshade]ReShadeSweetFXSharedShaderSepia.h
Находим точку входа в шейдер и подпиливаем код под сим, перенеся его в наш файл пост-обработки.
[Для сепии тривиально, для сложных эффектов типа SMAA сложнее, и не факт, что получится.]
2. Создаем, согласно SDK Prepar3D, в каталоге [Каталог Prepar3D]ShadersHLSLPostProcess файл Sepia.xml c описанием эффекта. Следующего содержания:

<?xml version=»1.0″ encoding=»UTF-8″?>
<SimBase.Document Type=»AceXML» version=»1,0″>

<PostProcessEffects.PostProcessDefinition>
<EffectName>Sepia</EffectName>
<ShaderFileName>Sepia.psh</ShaderFileName>
<ShaderEntryPoint>SepiaMain</ShaderEntryPoint>
<ColorRequest>TRUE</ColorRequest>
<DepthRequest>FALSE</DepthRequest>
</PostProcessEffects.PostProcessDefinition>

</SimBase.Document>

Итак, мы получили два файла — Sepia.psh и Sepia.xml, которые лежат в каталоге [Каталог Prepar3D]ShadersHLSLPostProcess
3. Теперь нужно подключить созданный эффект к симу.
[Интересной особенностью является то, что эффект можно подключать только на отдельные виды, например, только на виртуальный кокпит или только на спот].
Ищем файл [Диск]:Users[Имя пользователя]AppDataRoamingLockheed MartinPrepar3D v3cameras.cfg и вставляем постэффект в нужный вид. Например, в 2D кокпит:

[CameraDefinition.001]
Title = Cockpit
Guid = {B1386D92-4782-4682-A137-738E25D1BAB5}
Description = This is the description of the cockpit view
Origin = Cockpit
ShowPanel = Yes
SnapPbhAdjust = Ordinal
SnapPbhReturn = True
PanPbhAdjust = Ordinal
PanPbhReturn = True
Track = None
ShowAxis = FrontOnly
AllowZoom = TRUE
InitialZoom = 1.0
SmoothZoomTime = 2.0
ShowWeather = Yes
XyzAdjust = TRUE
ShowLensFlare=FALSE
Category = Cockpit
HotKeySelect=2
PostProcess00 = Sepia

К камере можно подключить последовательно до 16 постэффектов PostProcess00- PostProcess15 (не забываем, что каждый эффект имеет цену в FPS). Порядок их применения к сцене соответствует порядку подключения в cameras.cfg.
4. Для запуска эффекта нужно очистить кеш шейдеров — удалить все файлы, расположенные в каталоге [Диск]:Users[Имя пользователя]AppDataLocalLockheed MartinPrepar3D v3Shaders
Если эффект не проявляется, вероятно, где-то ошибка из-за того, что эффект не скомпилировался. Понять это можно, включив диагностику ошибок в настройках препара (по умолчанию не включена): вкладка General, флажок Content Error Logging (или в одноименной опции раздела [MAIN] в основном конфиге препара).
В случае ошибок компиляции шейдера после выхода из сима выдается окно с предупреждением, а соответствующая диагностика содержится в файле ContentErrorLog.txt в каталоге Мои документы/Prepar3D v3 Files. (Там же, где располагаются сохраненные полеты).

Ответов: 62

Юрий, круто, но все же лучше, наверное, создать одну тему (в разделе работы над темами), собрать материал в одно структурированное целое и выложить как мануал (с прикреплением как «Важное»).

Спасибо что делаете такое дело! Очень нужно. Изменение именно методом сима. Так как основной минус этих Reshade/SweetFX/ENB, кроме указанных, это дикая просадка фпс на 5-10, появления всяких рывков и тормозов. А если в симе в конфиге править, то ничего этого нет.

Юрий, круто, но все же лучше, наверное, создать одну тему (в разделе работы над темами), собрать материал в одно структурированное целое и выложить как мануал (с прикреплением как «Важное»).

На что-то цельное, вроде мануала, у меня не наберется материала, так, разрозненные наработки, которые постепенно планировал выложить. Тему завел с прицелом, что кто-то поделится аналогичными наработками.

Впечатлен, очень сильно. Огромное спасибо коллега KNOSOS. Применил ваш файл LumaSharpen — небо и земля по сравнению с медиатором.

Впечатлен, очень сильно. Огромное спасибо коллега KNOSOS. Применил ваш файл LumaSharpen — небо и земля по сравнению с медиатором.

Спасибо! Но странно, на самом деле, откуда там улучшениям взяться. Настройки в Reshade для LumaSharpen такие же у вас были, как в моем примере?

Spoiler

Спасибо ребятам из команды Reshade!  :)

 

Спасибо! Но странно, на самом деле, откуда там улучшениям взяться. Настройки в Reshade для LumaSharpen такие же у вас были, как в моем примере?

Spoiler

Спасибо ребятам из команды Reshade!  :)

 

Так красивще! Буковки в кокпите более читаемые. Не знаю может это субъективно, но мне кажется стало намного лучше.

HDR-тонирование 
 
(инфа уже была опубликована, камрады в целом оценили положительно, сюда скопировал с небольшими дополнениями)
В дефолтном Prepar3D, ИМХО, цвета слегка приглушены, что выражается сдвигом зеленого в хаки и общему «пыльному» покрытию сцены.
 
Попробуем несколько исправить ситуацию.
 
НЕ ЗАБЫВАЙТЕ ПРЕДВАРИТЕЛЬНО СДЕЛАТЬ РЕЗЕРВНУЮ КОПИЮ каталога [Каталог Prepar3D]ShadersHLSL, чтобы откатить все обратно, если понадобится.
 
Шейдер располагается в файле Prepar3DShadersHLSLPostProcessHDR.hlsl
 
ТОЛЬКО ДЛЯ Prepar3D 3.1 !
================================
 
1. Меняем фильтр ToneMap. 
 
Ищем функцию ToneMap:
 
float3 ToneMap( float3 color, float avgLuminance, float threshold )
{  
    color = CalcExposedColor(color, avgLuminance, threshold) ;
    color = max(0, color — 0.004f);
    color = (color * (6.2f * color + 0.5f)) / (color * (6.2f * color + 1.7f) + 0.06f) ; //Gamma Color
    //Result has 1/2.2 baked in.
    return saturate(pow(color, 2.2f)) ;
}
 
Функция отвечает за высветление темных и затемнение светлых участков.
Парметр сolor, который подается на вход функции это вектор с компонентами RGB. 
Грубо «Икс». Цвет от 0 до 1 всегда кодируется в препаре. Получается такая парабола в степени 2.2 на отрезке [0..1]. Для удобства подбора функции ToneMap удобно построить график этой функции, например, в Excel.
И подбирать такие коэффициенты в многочлене color = (color * (6.2f * color + 0.5f)) / (color * (6.2f * color + 1.7f) + 0.06f), и степенной функции saturate(pow(color, 2.2f)), чтобы высветлять/затемнять как-то по-другому. 
Spoiler

На графике рыжая кривая – дефолтная функция, зеленая – другой фильтр, дающий более яркую картину. 
Экспериментально можно подобрать нужное.
 
В прилагаемом шейдере, который по результатам использования, камрадам понравился, степенная функция заменена на такую: saturate(pow(color, 2.5f) * 1.2f) (соответствует зеленому графику).
Spoiler

 
2. Параметр «Saturation» на вкладке «Lighting» в настройках сима, будучи выкрученным максимально вправо, не дает сделать сцену более насыщенной по цветности. 
Это можно исправить следующим образом:
 
Масштабируем диапазон регулировки ползунка Saturation в строке 207:
    float3 finalColor = lerp(luminance, color, SaturationScalar ) ;
меняем на
    float3 finalColor = lerp(luminance, color, 2.0f * SaturationScalar ) ;
 
В итоге дефолтное положение ползунка Saturation, бывшее 1, смещается в 0.5 и появляется возможность его добавлять.
Для иллюстрации я поставил 0.65, сам использую 0.58-0.6.
Spoiler

 
1 и 2 твики независимы, можно делать или то или другое.
HDR-шейдер в целом относится к этапу пост-обработки сцены, поэтому его модификацию можно проводить без последствий для других шейдеров, например, для твиков облаков, воды, земли, атмосферы и проч.
 
Что еще можно «подергать» в HDR-шейдере:
Spoiler

 
Правленный шейдер с встроенными твиками 1 и 2 можно забрать отсюда: http://1drv.ms/1QsVozl
 
 

В текущей версии препара (3.1), отражение солнца на воде ИМХО, сделано геометрически более корректно, чем в АЫЧ, но почему-то луну оставили по старому, как в АЫЧе.
Но для тех, кто скучает по солнечным дорожкам на воде, а-ля АЫЧ, немного поломаем шейдер ландшафта GPUTerrain.fx
(Номера строк не привожу, так как они у всех могут быть разными из-за уже установленных твиков)
Spoiler

после чистки кеша шейдеров получим что-то вроде этого:

Прикрепленные изображения

  • SUN_Reflect.jpg

 

В текущей версии препара (3.1), отражение солнца на воде ИМХО, сделано геометрически более корректно, чем в АЫЧ, но почему-то луну оставили по старому, как в АЫЧе.
Но для тех, кто скучает по солнечным дорожкам на воде, а-ля АЫЧ, немного поломаем шейдер ландшафта GPUTerrain.fx
(Номера строк не привожу, так как они у всех могут быть разными из-за уже установленных твиков)
Spoiler

после чистки кеша шейдеров получим что-то вроде этого:

 

Knossos, спасибо большое!)

Сообщение отредактировано Vadim2308: 03 March 2016 — 21:27

что-то у меня солнышко не получается….

У кого со сглаживанием итак не очень, я бы не рекомендовал ставить LumaSharpen.  Четкость читаемости приборов в кокпите повысится, но в остальном…

У кого со сглаживанием итак не очень, я бы не рекомендовал ставить LumaSharpen. Четкость читаемости приборов в кокпите повысится, но в остальном…

Ну здесь вы Америку не открыли. :) Чем больше чёткость, тем виднее лесенки.

Как прибрать немного шарпа? В твике LumaSharpen меняю значение «sharp_strength 2.54» , запускаю сим — квадрат Малевича.

что-то у меня солнышко не получается….

У меня тоже(Как было так и осталось.

30482f8fa791749e4d24790c37b28e54.jpg

подождем Мастера)

По поводу изменения отражений солнца а-ля АЫЧ. Приношу извинения, при оформлении поста под спойлером был невнимателен.

Правильно так

 

Spoiler

 
готовый файл для 3.1 сделал, в нем солнце + атмосферный твик: http://1drv.ms/24I4bC0 

 

Спасибо! Забил твик руками- все работает.

Друзья, подскажите. Как то поднимал этот вопрос на форуме, но подсказки ничего не дали. Не дает мне это покоя, поэтому еще раз обращаюсь.

Можно ли как то программно повлиять на динамическую контрастность в HDR?

У меня в кокпите 737 слишком засветляет приборную панель. Без HDR цвет ближе к реалу, а с включенным картинка вроде бы живее, но как то не нравится мне. Движение ползунков не помогает.

Не хочу отключать HDR из-за атмосферного твика от KNOSSOS .

Может как то подкрутить чего то можно?

 

Прикрепленные изображения

  • c HDR.jpg
  • без HDR.jpg

Друзья, подскажите. Как то поднимал этот вопрос на форуме, но подсказки ничего не дали. Не дает мне это покоя, поэтому еще раз обращаюсь.

Можно ли как то программно повлиять на динамическую контрастность в HDR?

У меня в кокпите 737 слишком засветляет приборную панель. Без HDR цвет ближе к реалу, а с включенным картинка вроде бы живее, но как то не нравится мне. Движение ползунков не помогает.

Не хочу отключать HDR из-за атмосферного твика от KNOSSOS .

Может как то подкрутить чего то можно?

Атмосферный твик же без HDR тоже работает.

Атмосферный твик же без HDR тоже работает.

Работает, но не так как с HDR. Буду честен, хочется понять почему с HDR и без, такая разница.

Работает, но не так как с HDR. Буду честен, хочется понять почему с HDR и без, такая разница.

Потому что я подбирал на свой взгляд, мне показалось, что без HDR сила эффекта, такая же, как с HDR, смотрится неестественно.

Можно совсем синим залить, можно убавлять, управление сделано отдельно для HDR и обычного режима.

Вот так можно изменять силу эффекта:

Spoiler

[Я подгонял таким образом, чтобы в разные дни из 10-дневного цикла смотрелось все более менее ровно, без излишеств, включая сумерки. Если сильно увеличить силу эффекта, то может оказаться, что в один день смотрится нормально, а в другой — психоделика.]

Кстати говоря, про силу атмосферного эффекта. В реале все же эффект Релея проявляется каждый день по-разному. Когда в атмосфере много мельчайших частиц, эффект сильный, но бывают дни, когда атмосфера кристально чиста и такого эффекта не наблюдается.  В симе такого параметра нет, который отвечает за атмосферную чистоту, но была идея, например, чтобы как то разнообразить и чтобы не надоело каждый день лицезреть синьку, завязать силу эффекта на скорость ветра на поверхности. Что-то типа сильный ветер — атмосфера чище, эффект слабее. И наоборот. 

Имеет смысл?

[Других параметров погоды в шейдеры не подается из движка, этот вытащили для расчета скорости волн на воде, к нему и можно «прицепиться»]

Кстати говоря, про силу атмосферного эффекта. В реале все же эффект Релея проявляется каждый день по-разному. Когда в атмосфере много мельчайших частиц, эффект сильный, но бывают дни, когда атмосфера кристально чиста и такого эффекта не наблюдается.  В симе такого параметра нет, который отвечает за атмосферную чистоту, но была идея, например, чтобы как то разнообразить и чтобы не надоело каждый день лицезреть синьку, завязать силу эффекта на скорость ветра на поверхности. Что-то типа сильный ветер — атмосфера чище, эффект слабее. И наоборот. 

Имеет смысл?

[Других параметров погоды в шейдеры не подается из движка, этот вытащили для расчета скорости волн на воде, к нему и можно «прицепиться»]

нет, нет с Вашим твиком как раз все отлично. Меня мучает то, почему с включенным HDR такая яркость в кокпите. Смотрел много роликов где у людей включен HDR и нет такой яркости в кокпите. Вроде железо у меня нормальное, крутил все что можно, но не могу избавится от этого. 

нет, нет с Вашим твиком как раз все отлично. Меня мучает то, почему с включенным HDR такая яркость в кокпите. Смотрел много роликов где у людей включен HDR и нет такой яркости в кокпите. Вроде железо у меня нормальное, крутил все что можно, но не могу избавится от этого. 

так у людей, наверное, HDR дефолтный. Мой HDR же более яркий и насыщенный. (Кстати, на мой вкус, ваш левый скрин приятнее :) )

Верните дефолтный HDR тогда.

А у всех крафтов такой эффект на кокпите?

Беда в том что и с дефолтным HDR такая же байда была.

Засветляет практически все, но с ПМДГ 737 это сильнее.