forked from crosire/reshade-shaders
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Levels.fx
76 lines (66 loc) · 2.75 KB
/
Levels.fx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* Levels version 1.2
* by Christian Cann Schuldt Jensen ~ CeeJay.dk
*
* Allows you to set a new black and a white level.
* This increases contrast, but clips any colors outside the new range to either black or white
* and so some details in the shadows or highlights can be lost.
*
* The shader is very useful for expanding the 16-235 TV range to 0-255 PC range.
* You might need it if you're playing a game meant to display on a TV with an emulator that does not do this.
* But it's also a quick and easy way to uniformly increase the contrast of an image.
*
* -- Version 1.0 --
* First release
* -- Version 1.1 --
* Optimized to only use 1 instruction (down from 2 - a 100% performance increase :) )
* -- Version 1.2 --
* Added the ability to highlight clipping regions of the image with #define HighlightClipping 1
*/
uniform int BlackPoint <
ui_type = "drag";
ui_min = 0; ui_max = 255;
ui_tooltip = "The black point is the new black - literally. Everything darker than this will become completely black.";
> = 16;
uniform int WhitePoint <
ui_type = "drag";
ui_min = 0; ui_max = 255;
ui_tooltip = "The new white point. Everything brighter than this becomes completely white";
> = 235;
uniform bool HighlightClipping <
ui_tooltip = "Colors between the two points will stretched, which increases contrast, but details above and below the points are lost (this is called clipping). Highlight the pixels that clip. Red = Some detail is lost in the highlights, Yellow = All detail is lost in the highlights, Blue = Some detail is lost in the shadows, Cyan = All detail is lost in the shadows.";
> = false;
#include "ReShade.fxh"
float3 LevelsPass(float4 vpos : SV_Position, float2 texcoord : TexCoord) : SV_Target
{
float black_point_float = BlackPoint / 255.0;
float white_point_float = WhitePoint == BlackPoint ? (255.0 / 0.00025) : (255.0 / (WhitePoint - BlackPoint)); // Avoid division by zero if the white and black point are the same
float3 color = tex2D(ReShade::BackBuffer, texcoord).rgb;
color = color * white_point_float - (black_point_float * white_point_float);
if (HighlightClipping)
{
float3 clipped_colors;
clipped_colors = any(color > saturate(color)) // any colors whiter than white?
? float3(1.0, 0.0, 0.0)
: color;
clipped_colors = all(color > saturate(color)) // all colors whiter than white?
? float3(1.0, 1.0, 0.0)
: clipped_colors;
clipped_colors = any(color < saturate(color)) // any colors blacker than black?
? float3(0.0, 0.0, 1.0)
: clipped_colors;
clipped_colors = all(color < saturate(color)) // all colors blacker than black?
? float3(0.0, 1.0, 1.0)
: clipped_colors;
color = clipped_colors;
}
return color;
}
technique Levels
{
pass
{
VertexShader = PostProcessVS;
PixelShader = LevelsPass;
}
}