1#pragma name MMJ_ColorPass 2 3/* 4---------------------------------------------------------------- 5MMJ's Cel Shader v2.01 - Multi-Pass 6---------------------------------------------------------------- 7Parameters: 8----------- 9Color Saturation = Increase or decrease color saturation. 10 11Color Levels = Determines number of color "bands". 12 13Color Weight = Changes the strength of the color adjustments. 14---------------------------------------------------------------- 15*/ 16 17#pragma parameter ColorLevels "Color Levels" 12.0 1.0 32.0 1.0 18#pragma parameter ColorSaturation "Color Saturation" 1.15 0.00 2.00 0.05 19#pragma parameter ColorWeight "Color Weight" 0.50 0.00 1.00 0.05 20 21 22#if defined(VERTEX) 23 24#if __VERSION__ >= 130 25#define COMPAT_VARYING out 26#define COMPAT_ATTRIBUTE in 27#define COMPAT_TEXTURE texture 28#else 29#define COMPAT_VARYING varying 30#define COMPAT_ATTRIBUTE attribute 31#define COMPAT_TEXTURE texture2D 32#endif 33 34#ifdef GL_ES 35#define COMPAT_PRECISION mediump 36#else 37#define COMPAT_PRECISION 38#endif 39 40COMPAT_ATTRIBUTE vec4 VertexCoord; 41COMPAT_ATTRIBUTE vec4 TexCoord; 42COMPAT_VARYING vec4 TEX0; 43 44vec4 _oPosition1; 45uniform mat4 MVPMatrix; 46uniform COMPAT_PRECISION vec2 OutputSize; 47uniform COMPAT_PRECISION vec2 TextureSize; 48 49// compatibility #defines 50#define vTexCoord TEX0.xy 51#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 52#define OutSize vec4(OutputSize, 1.0 / OutputSize) 53 54void main() 55{ 56 gl_Position = MVPMatrix * VertexCoord; 57 TEX0 = TexCoord; 58} 59 60 61#elif defined(FRAGMENT) 62 63#if __VERSION__ >= 130 64#define COMPAT_VARYING in 65#define COMPAT_TEXTURE texture 66out vec4 FragColor; 67#else 68#define COMPAT_VARYING varying 69#define FragColor gl_FragColor 70#define COMPAT_TEXTURE texture2D 71#endif 72 73#ifdef GL_ES 74#ifdef GL_FRAGMENT_PRECISION_HIGH 75precision highp float; 76#else 77precision mediump float; 78#endif 79#define COMPAT_PRECISION mediump 80#else 81#define COMPAT_PRECISION 82#endif 83 84uniform COMPAT_PRECISION vec2 OutputSize; 85uniform COMPAT_PRECISION vec2 TextureSize; 86uniform sampler2D OrigTexture; 87uniform sampler2D PassPrev1Texture; 88COMPAT_VARYING vec4 TEX0; 89 90// compatibility #defines 91#define Source Texture 92#define vTexCoord TEX0.xy 93 94#define SourceSize vec4(TextureSize, 1.0 / TextureSize) //either TextureSize or InputSize 95#define OutSize vec4(OutputSize, 1.0 / OutputSize) 96 97#ifdef PARAMETER_UNIFORM 98uniform COMPAT_PRECISION float ColorLevels; 99uniform COMPAT_PRECISION float ColorSaturation; 100uniform COMPAT_PRECISION float ColorWeight; 101#else 102#define ColorLevels 12.0 103#define ColorSaturation 1.15 104#define ColorWeight 0.50 105#endif 106 107 108vec3 RGB2HSL(vec3 cRGB) 109{ 110 float cR = cRGB[0], cG = cRGB[1], cB = cRGB[2]; 111 float vMin = min(min(cR, cG), cB), vMax = max(max(cR, cG), cB); 112 float dMax = vMax - vMin, vS = 0.0, vH = 0.0, vL = (vMax + vMin) / 2.0; 113 114 // gray, no chroma 115 if(dMax == 0.0) { 116 vH = 0.0; vS = vH; 117 118 // chromatic data 119 } else { 120 if(vL < 0.5) { vS = dMax / (vMax + vMin); } 121 else { vS = dMax / (2.0 - vMax - vMin); } 122 123 float dR = (((vMax - cR) * 0.1667) + (dMax * 0.5)) / dMax; 124 float dG = (((vMax - cG) * 0.1667) + (dMax * 0.5)) / dMax; 125 float dB = (((vMax - cB) * 0.1667) + (dMax * 0.5)) / dMax; 126 127 if (cR >= vMax) { vH = dB - dG; } 128 else if(cG >= vMax) { vH = 0.3333 + dR - dB; } 129 else if(cB >= vMax) { vH = 0.6667 + dG - dR; } 130 131 if (vH < 0.0) { vH += 1.0; } 132 else if(vH > 1.0) { vH -= 1.0; } 133 } 134 return vec3(vH, vS, vL); 135} 136 137float Hue2RGB(float v1, float v2, float vH) 138{ 139 float v3 = 0.0; 140 141 if (vH < 0.0) { vH += 1.0; } 142 else if(vH > 1.0) { vH -= 1.0; } 143 144 if ((6.0 * vH) < 1.0) { v3 = v1 + (v2 - v1) * 6.0 * vH; } 145 else if((2.0 * vH) < 1.0) { v3 = v2; } 146 else if((3.0 * vH) < 2.0) { v3 = v1 + (v2 - v1) * (0.6667 - vH) * 6.0; } 147 else { v3 = v1; } 148 149 return v3; 150} 151 152vec3 HSL2RGB(vec3 vHSL) 153{ 154 float cR = 0.0, cG = cR, cB = cR; 155 156 if(vHSL[1] == 0.0) { 157 cR = vHSL[2], cG = cR, cB = cR; 158 159 } else { 160 float v1 = 0.0, v2 = v1; 161 162 if(vHSL[2] < 0.5) { v2 = vHSL[2] * (1.0 + vHSL[1] ); } 163 else { v2 = (vHSL[2] + vHSL[1] ) - (vHSL[1] * vHSL[2] ); } 164 165 v1 = 2.0 * vHSL[2] - v2; 166 167 cR = Hue2RGB(v1, v2, vHSL[0] + 0.3333); 168 cG = Hue2RGB(v1, v2, vHSL[0] ); 169 cB = Hue2RGB(v1, v2, vHSL[0] - 0.3333); 170 } 171 return vec3(cR, cG, cB); 172} 173 174vec3 colorAdjust(vec3 cRGB) 175{ 176 vec3 cHSL = RGB2HSL(cRGB); 177 178 float cr = 1.0 / ColorLevels; 179 180 // brightness modifier 181 float BrtModify = mod(cHSL[2], cr); 182 183 cHSL[1] *= ColorSaturation; 184 cHSL[2] += (cHSL[2] * cr - BrtModify); 185 cRGB = 1.2 * HSL2RGB(cHSL); 186 187 return cRGB; 188} 189 190void main() 191{ 192 vec3 cOriginal = COMPAT_TEXTURE(OrigTexture, vTexCoord).rgb; 193 vec3 cOutline = COMPAT_TEXTURE(PassPrev1Texture, vTexCoord).rgb; 194 195 vec3 cNew = cOriginal; 196 cNew = min(vec3(1.0), min(cNew, cNew + dot(vec3(1.0), cNew))); 197 FragColor.rgb = mix(cOriginal * cOutline, colorAdjust(cNew * cOutline), ColorWeight); 198} 199#endif