// Copyright (c) 2017-2018 Xiamen Yaji Software Co., Ltd. CCEffect %{ techniques: - passes: - vert: vs frag: fs blendState: targets: - blend: true rasterizerState: cullMode: none properties: texture: { value: white } u_dH: { value: 0.0, inspector: { tooltip: "色相", range: [-180.0, 180.0] } } u_dS: { value: 0.0, inspector: { tooltip: "饱和度", range: [-1.0, 1.0] } } u_dL: { value: 0.0, inspector: { tooltip: "亮度", range: [-1.0, 1.0] } } u_dA: { value: 1.0, inspector: { tooltip: "透明度", range: [0, 1.0] } } }% CCProgram vs %{ precision highp float; #include #include in vec3 a_position; in vec2 a_uv0; out vec2 v_uv0; void main () { gl_Position = cc_matViewProj * vec4(a_position, 1); v_uv0 = a_uv0; } }% CCProgram fs %{ precision highp float; #include #include in vec2 v_uv0; uniform sampler2D texture; uniform ARGS { float u_dH; float u_dS; float u_dL; float u_dA; }; void main () { vec4 texColor=texture2D(texture, v_uv0); float r=texColor.r; float g=texColor.g; float b=texColor.b; float a=texColor.a; //convert rgb to hsl float h; float s; float l; { float max=max(max(r,g),b); float min=min(min(r,g),b); //----h if(max==min){ h=0.0; }else if(max==r&&g>=b){ h=60.0*(g-b)/(max-min)+0.0; }else if(max==r&&g0.5){ s=(max-min)/(2.0-2.0*l); } } //(h,s,l)+(dH,dS,dL) -> (h,s,l) h=h+u_dH; s=min(1.0,max(0.0,s+u_dS)); l=l;//do not use HSL model to adjust lightness, because the effect is not good //convert (h,s,l) to rgb and got final color vec4 finalColor; { float q; if(l<0.5){ q=l*(1.0+s); }else if(l>=0.5){ q=l+s-l*s; } float p=2.0*l-q; float hk=h/360.0; float t[3]; t[0]=hk+1.0/3.0;t[1]=hk;t[2]=hk-1.0/3.0; for(int i=0;i<3;i++){ if(t[i]<0.0)t[i]+=1.0; if(t[i]>1.0)t[i]-=1.0; }//got t[i] float c[3]; for(int i=0;i<3;i++){ if(t[i]<1.0/6.0){ c[i]=p+((q-p)*6.0*t[i]); }else if(1.0/6.0<=t[i] && t[i]<0.5){ c[i]=q; }else if(0.5<=t[i] && t[i]<2.0/3.0){ c[i]=p+((q-p)*6.0*(2.0/3.0-t[i])); }else{ c[i]=p; } } finalColor=vec4(c[0],c[1],c[2],a*u_dA); } //actually, it is not final color. the lightness has not been adjusted //adjust lightness use the simplest method finalColor+=vec4(u_dL,u_dL,u_dL,0.0); gl_FragColor=finalColor; } }%