summaryrefslogtreecommitdiff
path: root/materialsystem/stdshaders/color_projection_ps2x.fxc
blob: be4733736259b1cd1880f22f1dbc62e7a2655c5e (plain) (blame)
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;
}