Препарируем 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. (Там же, где располагаются сохраненные полеты).

Ответов: 9

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

Спасибо что делаете такое дело! Очень нужно. Изменение именно методом сима. Так как основной минус этих 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