1 2// Parameter lines go here: 3#pragma parameter WP "Color Temperature %" 0.0 -100.0 100.0 5.0 4#pragma parameter wp_saturation "Saturation Adjustment" 1.0 0.0 2.0 0.05 5 6#if defined(VERTEX) 7 8#if __VERSION__ >= 130 9#define COMPAT_VARYING out 10#define COMPAT_ATTRIBUTE in 11#define COMPAT_TEXTURE texture 12#else 13#define COMPAT_VARYING varying 14#define COMPAT_ATTRIBUTE attribute 15#define COMPAT_TEXTURE texture2D 16#endif 17 18#ifdef GL_ES 19#define COMPAT_PRECISION mediump 20#else 21#define COMPAT_PRECISION 22#endif 23 24COMPAT_ATTRIBUTE vec4 VertexCoord; 25COMPAT_ATTRIBUTE vec4 COLOR; 26COMPAT_ATTRIBUTE vec4 TexCoord; 27COMPAT_VARYING vec4 COL0; 28COMPAT_VARYING vec4 TEX0; 29 30uniform mat4 MVPMatrix; 31uniform COMPAT_PRECISION int FrameDirection; 32uniform COMPAT_PRECISION int FrameCount; 33uniform COMPAT_PRECISION vec2 OutputSize; 34uniform COMPAT_PRECISION vec2 TextureSize; 35uniform COMPAT_PRECISION vec2 InputSize; 36 37void main() 38{ 39 gl_Position = MVPMatrix * VertexCoord; 40 COL0 = COLOR; 41 TEX0.xy = TexCoord.xy; 42} 43 44#elif defined(FRAGMENT) 45 46#if __VERSION__ >= 130 47#define COMPAT_VARYING in 48#define COMPAT_TEXTURE texture 49out vec4 FragColor; 50#else 51#define COMPAT_VARYING varying 52#define FragColor gl_FragColor 53#define COMPAT_TEXTURE texture2D 54#endif 55 56#ifdef GL_ES 57#ifdef GL_FRAGMENT_PRECISION_HIGH 58precision highp float; 59#else 60precision mediump float; 61#endif 62#define COMPAT_PRECISION mediump 63#else 64#define COMPAT_PRECISION 65#endif 66 67uniform COMPAT_PRECISION int FrameDirection; 68uniform COMPAT_PRECISION int FrameCount; 69uniform COMPAT_PRECISION vec2 OutputSize; 70uniform COMPAT_PRECISION vec2 TextureSize; 71uniform COMPAT_PRECISION vec2 InputSize; 72uniform sampler2D Texture; 73COMPAT_VARYING vec4 TEX0; 74 75// compatibility #defines 76#define Source Texture 77#define vTexCoord TEX0.xy 78 79#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 80#define outsize vec4(OutputSize, 1.0 / OutputSize) 81 82#ifdef PARAMETER_UNIFORM 83// All parameter floats need to have COMPAT_PRECISION in front of them 84uniform COMPAT_PRECISION float WP, wp_saturation; 85#else 86#define WP 0.0 87#define wp_saturation 1.0 88#endif 89 90const mat3 D65_to_XYZ = mat3 ( 91 0.4306190, 0.2220379, 0.0201853, 92 0.3415419, 0.7066384, 0.1295504, 93 0.1783091, 0.0713236, 0.9390944); 94 95const mat3 XYZ_to_D65 = mat3 ( 96 3.0628971, -0.9692660, 0.0678775, 97 -1.3931791, 1.8760108, -0.2288548, 98 -0.4757517, 0.0415560, 1.0693490); 99 100const mat3 D50_to_XYZ = mat3 ( 101 0.4552773, 0.2323025, 0.0145457, 102 0.3675500, 0.7077956, 0.1049154, 103 0.1413926, 0.0599019, 0.7057489); 104 105const mat3 XYZ_to_D50 = mat3 ( 106 2.9603944, -0.9787684, 0.0844874, 107 -1.4678519, 1.9161415, -0.2545973, 108 -0.4685105, 0.0334540, 1.4216174); 109 110void main() 111{ 112 113 vec3 color = COMPAT_TEXTURE(Source, TEX0.xy).rgb; 114 115 color = normalize(pow(color + 1e-4, vec3(wp_saturation)))*length(color); 116 117 float p = 2.4; 118 119 color = pow(color, vec3(p)); 120 121 vec3 warmer = D50_to_XYZ*color; 122 warmer = XYZ_to_D65*warmer; 123 124 vec3 cooler = D65_to_XYZ*color; 125 cooler = XYZ_to_D50*cooler; 126 127 float m = abs(WP)/100.0; 128 129 vec3 comp = (WP < 0.0) ? cooler : warmer; 130 131 color = mix(color, comp, m); 132 133 color = pow(color, vec3(1.0/p)); 134 135 FragColor = vec4(color,1.0); 136} 137#endif 138