2023-09-23 14:39:09 +06:00

132 lines
3.1 KiB
HLSL

/*------------------.
| :: Description :: |
'-------------------/
Monochrome (version 1.1)
Author: CeeJay.dk
License: MIT
About:
Removes color making everything monochrome.
Ideas for future improvement:
* Tinting
* Select a hue to keep its color, thus making it stand out against a monochrome background
* Try Lab colorspace
* Apply color gradient
* Add an option to normalize the coefficients
* Publish best-selling book titled "256 shades of grey"
History:
(*) Feature (+) Improvement (x) Bugfix (-) Information (!) Compatibility
Version 1.0
* Converts image to monochrome
* Allows users to add saturation back in.
Version 1.1
* Added many presets based on B/W camera films
+ Improved settings UI
! Made settings backwards compatible with SweetFX
*/
/*---------------.
| :: Includes :: |
'---------------*/
#include "ReShade.fxh"
#include "ReShadeUI.fxh"
uniform int Monochrome_preset <
ui_type = "combo";
ui_label = "Preset";
ui_tooltip = "Choose a preset";
//ui_category = "";
ui_items = "Custom\0"
"Monitor or modern TV\0"
"Equal weight\0"
"Agfa 200X\0"
"Agfapan 25\0"
"Agfapan 100\0"
"Agfapan 400\0"
"Ilford Delta 100\0"
"Ilford Delta 400\0"
"Ilford Delta 400 Pro & 3200\0"
"Ilford FP4\0"
"Ilford HP5\0"
"Ilford Pan F\0"
"Ilford SFX\0"
"Ilford XP2 Super\0"
"Kodak Tmax 100\0"
"Kodak Tmax 400\0"
"Kodak Tri-X\0";
> = 0;
uniform float3 Monochrome_conversion_values < __UNIFORM_COLOR_FLOAT3
ui_label = "Custom Conversion values";
> = float3(0.21, 0.72, 0.07);
/*
uniform bool Normalize <
ui_label = "Normalize";
ui_tooltip = "Normalize the coefficients?";
> = false;
*/
uniform float Monochrome_color_saturation < __UNIFORM_SLIDER_FLOAT1
ui_label = "Saturation";
ui_min = 0.0; ui_max = 1.0;
> = 0.0;
float3 MonochromePass(float4 vpos : SV_Position, float2 texcoord : TexCoord) : SV_Target
{
float3 color = tex2D(ReShade::BackBuffer, texcoord).rgb;
float3 Coefficients = float3(0.21, 0.72, 0.07);
float3 Coefficients_array[18] =
{
Monochrome_conversion_values, //Custom
float3(0.21, 0.72, 0.07), //sRGB monitor
float3(0.3333333, 0.3333334, 0.3333333), //Equal weight
float3(0.18, 0.41, 0.41), //Agfa 200X
float3(0.25, 0.39, 0.36), //Agfapan 25
float3(0.21, 0.40, 0.39), //Agfapan 100
float3(0.20, 0.41, 0.39), //Agfapan 400
float3(0.21, 0.42, 0.37), //Ilford Delta 100
float3(0.22, 0.42, 0.36), //Ilford Delta 400
float3(0.31, 0.36, 0.33), //Ilford Delta 400 Pro & 3200
float3(0.28, 0.41, 0.31), //Ilford FP4
float3(0.23, 0.37, 0.40), //Ilford HP5
float3(0.33, 0.36, 0.31), //Ilford Pan F
float3(0.36, 0.31, 0.33), //Ilford SFX
float3(0.21, 0.42, 0.37), //Ilford XP2 Super
float3(0.24, 0.37, 0.39), //Kodak Tmax 100
float3(0.27, 0.36, 0.37), //Kodak Tmax 400
float3(0.25, 0.35, 0.40) //Kodak Tri-X
};
Coefficients = Coefficients_array[Monochrome_preset];
// Calculate monochrome
float3 grey = dot(Coefficients, color);
// Adjust the remaining saturation
color = lerp(grey, color, Monochrome_color_saturation);
// Return the result
return saturate(color);
}
technique Monochrome
{
pass
{
VertexShader = PostProcessVS;
PixelShader = MonochromePass;
}
}