Jump to content

Archived

This topic is now archived and is closed to further replies.

KNOSSOS

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

Recommended Posts

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

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


Для этого понадобятся:
- понимание, как пишутся программы для DirectX. MSDN в помощь: https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb509561(v=vs.85).aspx?f=255&MSPPError=-2147217396 ;
- установленный Reshade.
Для примера возьмем простенький, но популярный эффект - Sepia.
Встроить его в постобработку в симе можно двумя способами.
Первый - прикрутить код внутрь какого-нибудь уже существующего шейдера постобработки. Для этих целей подойдет любой colorizer, например, HDR.hlsl.
Очевидные недостатки способа:
- работать код будет только тогда, когда в конвейер обработки сцены в симе включен этот шейдер. То есть установлена галочка "HDR Lighting" в настройках графики. Это не всегда нужно.
- при следующем обновлении препара все наработки могут поломаться, так как HDR.hlsl - обычный шейдер, который в любой момент может быть перепрограммирован Lockheed Martin.

Второй способ лишен этих недостатков, более элегантен и гибок. Он основан на официально документированных возможностях Prepar3D в SDK. http://www.prepar3d.com/SDKv3/LearningCenter/LearningCenter.php
Конкретно нас интересует раздел по встраиванию кастомных способов пост-обработки: http://www.prepar3d.com/SDKv3/LearningCenter/utilities/camera_configuration/custom_post-process.html

Собственно, там все предельно ясно изложено, поехали:
1. Создаем в каталоге [Каталог Prepar3D]\ShadersHLSL\PostProcess\ файл Sepia.psh следующего содержания:

#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 в каталоге \ShadersHLSL\PostProcess). В этот файл вытаскиваем настройки для эффекта Sepia.
Дефолтные настройки для SweetFX лежат в каталоге [Каталог Reshade]\ReShade\SweetFX.cfg
Персонализированные настройки (те, которыми реально пользовались и подстраивали под себя Медиатором в симе) для вашего профиля в Reshade ищем здесь:
[Каталог ReShade]\ReShade\PersonalFiles\Presets\[Игра]\SweetFX.cfg
(У меня, например, путь такой: d:\ReShade Framework 1.1.0\ReShade\PersonalFiles\Presets\Lockheed 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]\ReShade\SweetFX\SharedShader\ либо здесь: [Каталог Reshade]\ReShade\SweetFX\
Конкретно для сепии он здесь: [Каталог Reshade]\ReShade\SweetFX\SharedShader\Sepia.h
Находим точку входа в шейдер и подпиливаем код под сим, перенеся его в наш файл пост-обработки.
[Для сепии тривиально, для сложных эффектов типа SMAA сложнее, и не факт, что получится.]
2. Создаем, согласно SDK Prepar3D, в каталоге [Каталог Prepar3D]\ShadersHLSL\PostProcess\ файл 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]\ShadersHLSL\PostProcess\
3. Теперь нужно подключить созданный эффект к симу.
[Интересной особенностью является то, что эффект можно подключать только на отдельные виды, например, только на виртуальный кокпит или только на спот].
Ищем файл [Диск]:\Users\[Имя пользователя]\AppData\Roaming\Lockheed Martin\Prepar3D v3\cameras.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\[Имя пользователя]\AppData\Local\Lockheed Martin\Prepar3D v3\Shaders\
Если эффект не проявляется, вероятно, где-то ошибка из-за того, что эффект не скомпилировался. Понять это можно, включив диагностику ошибок в настройках препара (по умолчанию не включена): вкладка General, флажок Content Error Logging (или в одноименной опции раздела [MAIN] в основном конфиге препара).
В случае ошибок компиляции шейдера после выхода из сима выдается окно с предупреждением, а соответствующая диагностика содержится в файле ContentErrorLog.txt в каталоге Мои документы/Prepar3D v3 Files. (Там же, где располагаются сохраненные полеты).


Для иллюстрации я сделал два шейдера для Sepia и LumaSharpen, готовые файлы можно забрать здесь и подключить к симу в своем файле cameras.cfg к нужным видам.
[Параметры эффектов под себя править в шейдерах].
http://1drv.ms/1LlsqiQ
Скрины:

post-69734-0-87569100-1456842896_thumb.jpg

post-69734-0-86143700-1456842898_thumb.jpg

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

//>LumaSharpen settings
#define sharp_strength 2.54 //[0.10:3.00] //-Strength of the sharpening
#define sharp_clamp 0.035 //[0.000:1.000] //-Limits maximum amount of sharpening a pixel recieves - Default is 0.035
//>Advanced sharpening settings
#define pattern 4 //[|2|3|4] //-Choose a sample pattern. 2 = Normal, 3 = Wider, 4 = Pyramid shaped.
#define offset_bias 1.0 //[0.0:6.0] //-Offset bias adjusts the radius of the sampling pattern. I designed the pattern for offset_bias 1.0, but feel free to experiment.

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

Share this post


Link to post
Share on other sites

 

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

//>LumaSharpen settings
#define sharp_strength 2.54 //[0.10:3.00] //-Strength of the sharpening
#define sharp_clamp 0.035 //[0.000:1.000] //-Limits maximum amount of sharpening a pixel recieves - Default is 0.035
//>Advanced sharpening settings
#define pattern 4 //[|2|3|4] //-Choose a sample pattern. 2 = Normal, 3 = Wider, 4 = Pyramid shaped.
#define offset_bias 1.0 //[0.0:6.0] //-Offset bias adjusts the radius of the sampling pattern. I designed the pattern for offset_bias 1.0, but feel free to experiment.

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

 

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

Share this post


Link to post
Share on other sites
HDR-тонирование 

 

(инфа уже была опубликована, камрады в целом оценили положительно, сюда скопировал с небольшими дополнениями)

В дефолтном Prepar3D, ИМХО, цвета слегка приглушены, что выражается сдвигом зеленого в хаки и общему "пыльному" покрытию сцены.

 

Попробуем несколько исправить ситуацию.

 

НЕ ЗАБЫВАЙТЕ ПРЕДВАРИТЕЛЬНО СДЕЛАТЬ РЕЗЕРВНУЮ КОПИЮ каталога [Каталог Prepar3D]\ShadersHLSL\, чтобы откатить все обратно, если понадобится.

 

Шейдер располагается в файле Prepar3D\ShadersHLSL\PostProcess\HDR.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)), чтобы высветлять/затемнять как-то по-другому. 


post-69734-0-97259300-1456040855.jpg


На графике рыжая кривая – дефолтная функция, зеленая – другой фильтр, дающий более яркую картину. 

Экспериментально можно подобрать нужное.

 

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


post-69734-0-96703500-1456040851_thumb.j


 

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.



post-69734-0-97144000-1456040853_thumb.j


 


1 и 2 твики независимы, можно делать или то или другое.

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

 

Что еще можно "подергать" в HDR-шейдере:


Если нужно «поиграть» оттенками. Cамый простой вариант – умножать значение этой функции на некий коэффициент. Для этого перепишем функцию таким образом:

 

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.

color = saturate(pow(color, 2.5f) * 1.2f);

return color * float3(0.5f, 1.1f, 0.8f); 

}

Здесь в строчке return color * float3(0.5f, 1.1f, 0.8f); я на 50% уменьшил красную составляющую в  цвете, на 10% добавил зеленую, на 20% убавил синюю. В реале коэффициенты RGB конечно нужно изменять не столь сильно, на 1-5%, думаю, чтобы получить нужный оттенок.

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

 

Вариант сложнее – возможность изменять фильтр ToneMap  не в целом по RGB, а отдельно по каждому из каналов (R, G, B ). На хрена оно может понадобиться, хз, но вдруг кому-то захочется…

То есть для каждого канала R, G, B будет подбираться свой график. Словами это будет так, примерно: при определении степени высветления/затемнения сцены, темные сцены сделать более теплыми, добавляя красного а светлые – более холодными, добавляя синего. И т.п. 

Для этого можно переписать функцию так (графики функции для R G B здесь "от балды"):

 

float3 ToneMap( float3 color, float avgLuminance, float threshold )

{  

    color = CalcExposedColor(color, avgLuminance, threshold);

    color = max(0, color - 0.004f);

    float colorR = (color.r * (6.2f * color.r + 0.5f)) / (color.r * (6.2f * color.r + 1.7f) + 0.06f); //Gamma Color R

    colorR = saturate(pow(colorR, 2.2f));

    float colorG = (color.g * (6.2f * color.g + 0.5f)) / (color.g * (6.2f * color.g + 1.7f) + 0.06f); //Gamma Color G

    colorG = saturate(pow(colorG, 2.0f));

    float colorB = (color.b * (6.2f * color.b + 0.5f)) / (color.b * (6.2f * color.b + 1.7f) + 0.06f); //Gamma Color B

    colorB = saturate(pow(colorB, 2.5f) * 1.2f);

    return float3(colorR, colorG, colorB); 

}


 

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

 

 

Share this post


Link to post
Share on other sites
В текущей версии препара (3.1), отражение солнца на воде ИМХО, сделано геометрически более корректно, чем в АЫЧ, но почему-то луну оставили по старому, как в АЫЧе.

Но для тех, кто скучает по солнечным дорожкам на воде, а-ля АЫЧ, немного поломаем шейдер ландшафта GPUTerrain.fx

(Номера строк не привожу, так как они у всех могут быть разными из-за уже установленных твиков)


находим фрагмент:

 

//Reflection fresnal value

float reflectionFresnel = 1;

float3 vEyeDirWS = (vEyeVectWS) / eyeDist; //Same as normalize.

 

меняем на

 

//Reflection fresnal value

float reflectionFresnel = 1;

float3 vEyeDirWS = vEyeVectWS * 0.99f / eyeDist  ; //Same as normalize.

 

[это изменение вынужденное, чтобы конус "солнечной дорожки" не шел из-под воды после заката, вследствие довольно грубого бага в препаре: http://www.avsim.su/forum/topic/139318-%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%BA%D1%80%D0%B0%D1%81%D0%B8%D0%B2%D0%BE-p3d-v3/page-26#entry3085682, 

который до сих пор не исправили, хотя он упомянут у них на форуме: ]

 

Второе изменение:

фрагмент

 

float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));

// Only compute the specular factor if IR is not active

#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)

 

specularFactor = specularBlend *

saturate((pow(abs(specularBoost * saturate(float2(dot(vreflect,vEyeDirWS.xyz), dot(runningNormal, vHN2))))

, specularPower)));

 

изменяем на

 

float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));

// Only compute the specular factor if IR is not active

#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)

 

specularFactor = specularBlend * 

saturate((pow(abs(specularBoost * saturate(float2(dot(runningNormal, vHN), dot(runningNormal, vHN2)))) , specularPower)));

 


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

post-69734-0-39793600-1457012581_thumb.jpg

Share this post


Link to post
Share on other sites

 

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

находим фрагмент:
 
//Reflection fresnal value
float reflectionFresnel = 1;
float3 vEyeDirWS = (vEyeVectWS) / eyeDist; //Same as normalize.
 
меняем на
 
//Reflection fresnal value
float reflectionFresnel = 1;
float3 vEyeDirWS = vEyeVectWS * 0.99f / eyeDist  ; //Same as normalize.
 
[это изменение вынужденное, чтобы конус "солнечной дорожки" не шел из-под воды после заката, вследствие довольно грубого бага в препаре: http://www.avsim.su/forum/topic/139318-%D0%B4%D0%B5%D0%BB%D0%B0%D0%B5%D0%BC-%D0%BA%D1%80%D0%B0%D1%81%D0%B8%D0%B2%D0%BE-p3d-v3/page-26#entry3085682, 
который до сих пор не исправили, хотя он упомянут у них на форуме: ]
 
Второе изменение:
фрагмент
 
float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));
// Only compute the specular factor if IR is not active
#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)
 
specularFactor = specularBlend *
saturate((pow(abs(specularBoost * saturate(float2(dot(vreflect,vEyeDirWS.xyz), dot(runningNormal, vHN2))))
, specularPower)));
 
изменяем на
 
float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));
// Only compute the specular factor if IR is not active
#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)
 
specularFactor = specularBlend * 
saturate((pow(abs(specularBoost * saturate(float2(dot(runningNormal, vHN), dot(runningNormal, vHN2)))) , specularPower)));
 

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

30482f8fa791749e4d24790c37b28e54.jpg

Share this post


Link to post
Share on other sites

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

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

 

 

 

находим фрагмент:
//Reflection fresnal value
float reflectionFresnel = 1;
float3 vEyeDirWS = (vEyeVectWS) / eyeDist; //Same as normalize.
 
меняем на
//Reflection fresnal value
float reflectionFresnel = 1;
float3 vEyeDirWS = vEyeVectWS * 0.99f / eyeDist  ; //Same as normalize.
 
[это изменение вынужденное, чтобы конус "солнечной дорожки" не шел из-под воды после заката, вследствие довольно грубого бага в препаре: http://www.avsim.su/...#entry3085682, 
который до сих пор не исправили, хотя он упомянут у них на форуме: ]
 
Второе изменение:
фрагмент
 
float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));
// Only compute the specular factor if IR is not active
#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)
 
specularFactor = specularBlend *
saturate((pow(abs(specularBoost * saturate(float2(dot(vreflect,vEyeDirWS.xyz), dot(runningNormal, vHN2))))
, specularPower)));
 
изменяем на
 
float3 vHN2 = saturate(normalize(vEyeDirWS.xyz + moonDirection));
// Only compute the specular factor if IR is not active
#if !defined(SHD_IR_ACTIVE) && defined(SHD_HAS_LAND)
 
specularFactor = specularBlend * 
saturate((pow(abs(specularBoost * saturate(float2(dot(runningNormal, vHN), dot(runningNormal, vHN2)))) , specularPower)));
 
третье изменение
блок
   #if defined(SHD_HAS_LAND)
   specularFactor = (specularBlend *
   (pow(abs(specularBoost * saturate(float2(dot(vreflect,vEyeDirWS.xyz), dot(Bump.xyz, vHN2))))
   , specularPower)) * (1-fAlpha));
   #else
   specularFactor = (specularBlend *
   (pow(abs(specularBoost * saturate(float2(dot(vreflect,vEyeDirWS.xyz), dot(Bump.xyz, vHN2))))
   , specularPower)));
   #endif
меняем на
   #if defined(SHD_HAS_LAND)
   specularFactor = (specularBlend *
   (pow(abs(specularBoost * saturate(float2(dot(Bump.xyz, vHN), dot(Bump.xyz, vHN2))))
   , specularPower)) * (1-fAlpha));
    #else
    specularFactor = (specularBlend *
   (pow(abs(specularBoost * saturate(float2(dot(Bump.xyz, vHN), dot(Bump.xyz, vHN2))))
   , specularPower)));
   #endif
 

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

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

 

post-59912-0-71947400-1457290885_thumb.jpg

post-59912-0-45886700-1457290893_thumb.jpg

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

 

найдите фрагмент в файле GPUTerrain.fx

#if defined(SHD_HDR)
  MaxPow  = 1.0f + saturate(cb_mLights[sUN_LIGHT].mDiffuse.g - 0.2f) * 1.4f * 2.0f;
#else
  MaxPow  = 1.0f + saturate(cb_mLights[sUN_LIGHT].mDiffuse.g - 0.2f) * 1.4f;
#endif
 
В верхней строке формула ДЛЯ HDR:  MaxPow  = 1.0f + saturate(cb_mLights[sUN_LIGHT].mDiffuse.g - 0.2f) * 1.4f * 2.0f; можно изменять силу эффекта (посинение для светлого времени, покраснение для сумерек, хотя они зарезаны, но не совсем), изменяя последний множитель 2.0f. меньше - эффект слабее, больше- сильнее.
 
В нижней строке формула для режима БЕЗ HDR 
     MaxPow  = 1.0f + saturate(cb_mLights[sUN_LIGHT].mDiffuse.g - 0.2f) * 1.4f; т.е. множитель вообще не стоит, поставите туда 2.0f, сила эффекта будет такая же, как в режиме HDR.
Т.о. замените нижнюю строку на  
     MaxPow  = 1.0f + saturate(cb_mLights[sUN_LIGHT].mDiffuse.g - 0.2f) * 1.4f * 2.0f; и потом поварьируйте 2.0f, если покажется недостаточным.

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

Share this post


Link to post
Share on other sites

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

Имеет смысл?

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

Share this post


Link to post
Share on other sites

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

Имеет смысл?

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...