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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
// based upon http://kaioa.com/node/91
// DYNAMIC: "NEED_BLINDMK" "0..1"
// DYNAMIC: "NEED_ANOMYLIZE" "0..1"
// DYNAMIC: "NEED_MONOCHROME" "0..1"
#include "shader_constant_register_map.h"
#include "common_ps_fxc.h"
struct PS_INPUT
{
float2 vScreenUV : TEXCOORD0;
};
sampler FrameSampler : register( s4 );
const float4 g_vColorParms : register( c1 );
#define cpu g_vColorParms.x
#define cpv g_vColorParms.y
#define am g_vColorParms.z
#define ayi g_vColorParms.w
float3 rgb_from_xyz( float3 vNum )
{
float3 vResult;
vResult.r = dot( vNum, float3( 3.063218f, -1.393325f, -0.475802f ) );
vResult.g = dot( vNum, float3( -0.969243f, 1.875966f, 0.041555f ) );
vResult.b = dot( vNum, float3( 0.067871f, -0.228834f, 1.069251f ) );
return vResult;
}
float3 xyz_from_rgb( float3 vNum )
{
float3 vResult;
vResult.x = dot( vNum, float3( 0.430574f, 0.341550f, 0.178325f ) );
vResult.y = dot( vNum, float3( 0.222015f, 0.706655f, 0.071330f ) );
vResult.z = dot( vNum, float3( 0.020183f, 0.129553f, 0.939180f ) );
return vResult;
}
float3 anomylize( float3 a, float3 b )
{
return ( ( 1.75f * b ) + a ) / 2.75f;
}
float3 monochrome( float3 r )
{
return dot( r, float3( 0.299f, 0.587f, 0.114f ) );
}
const static float3 w_xyz = float3( 0.312713f, 0.329016f, 0.358271f );
float3 blindMK( float3 vColor )
{
float3 c_xyz = xyz_from_rgb( vColor );
float sum_xyz = c_xyz.x + c_xyz.y + c_xyz.z;
float2 c_uv = 0.0f;
if ( sum_xyz != 0.0f )
{
c_uv = c_xyz.xy / sum_xyz;
}
float2 n_xz = w_xyz.xz * c_xyz.y / w_xyz.y;
float clm;
if ( c_uv.x < cpu )
{
clm = ( cpv - c_uv.y ) / ( cpu - c_uv.x );
}
else
{
clm = ( c_uv.y - cpv ) / ( c_uv.x - cpu );
}
float clyi = c_uv.y - c_uv.x * clm;
float2 d_uv;
d_uv.x = ( ayi - clyi ) / ( clm - am );
d_uv.y = ( clm * d_uv.x ) + clyi;
float3 s_xyz;
s_xyz.x = d_uv.x * c_xyz.y / d_uv.y;
s_xyz.y = c_xyz.y;
s_xyz.z = ( 1.0f - ( d_uv.x + d_uv.y ) ) * c_xyz.y / d_uv.y;
float3 s_rgb = rgb_from_xyz( s_xyz );
float3 d_xyz = 0.0f;
d_xyz.xz = n_xz - s_xyz.xz;
float3 d_rgb = rgb_from_xyz( d_xyz );
float3 adj_rgb = ( d_rgb != 0.0f ? ( ( s_rgb < 0.0f ? 0.0f : 1.0f ) - s_rgb / d_rgb ) : 0.0f );
adj_rgb = ( adj_rgb < 0.0f ? 0.0f : adj_rgb > 1.0f ? 0.0f : adj_rgb );
float adjust = max( max( adj_rgb.r, adj_rgb.g ), adj_rgb.b );
s_rgb = s_rgb + ( adjust * d_rgb );
return s_rgb;
}
float4 main( PS_INPUT i ) : COLOR
{
float4 vDiffuse = tex2D( FrameSampler, i.vScreenUV );
// vDiffuse = float4( 1, 0, 0, 1 );
float4 vResult = vDiffuse;
#if ( NEED_BLINDMK == 1 )
vResult.rgb = blindMK( vResult.rgb );
#endif
#if ( NEED_MONOCHROME == 1 )
vResult.rgb = monochrome( vResult.rgb );
#endif
#if ( NEED_ANOMYLIZE == 1 )
vResult.rgb = anomylize( vDiffuse.rgb, vResult.rgb );
#endif
return vResult;
}
|