Created
October 22, 2021 09:27
-
-
Save maxmonax/d42b957bde4b891b33381159dc6695c1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
export function applyHueShader( | |
aTexture: THREE.MeshStandardMaterial, | |
aHueDataObject: any | |
) { | |
aTexture.onBeforeCompile = shader => { | |
shader.uniforms.hueShift = aHueDataObject.hueShift; | |
let main = "void main("; | |
let out = "gl_FragColor = vec4( outgoingLight, diffuseColor.a );"; | |
shader.fragmentShader = shader.fragmentShader | |
.split(main) | |
.join( | |
` | |
uniform float hueShift; | |
vec3 hsl2rgb(vec3 c) { | |
vec3 rgb = clamp(abs(mod(c.x*6.0+vec3(0.0,4.0,2.0),6.0)-3.0)-1.0, 0.0, 1.0); | |
return c.z + c.y * (rgb-0.5)*(1.0-abs(2.0*c.z-1.0)); | |
} | |
vec3 rgb2hsl(vec3 c){ | |
float cMin=min(min(c.r,c.g),c.b), | |
cMax=max(max(c.r,c.g),c.b), | |
delta=cMax-cMin; | |
vec3 hsl=vec3(0.,0.,(cMax+cMin)/2.); | |
if(delta!=0.0){ //If it has chroma and isn't gray. | |
if(hsl.z<.5){ | |
hsl.y=delta/(cMax+cMin); //Saturation. | |
}else{ | |
hsl.y=delta/(2.-cMax-cMin); //Saturation. | |
} | |
float deltaR=(((cMax-c.r)/6.)+(delta/2.))/delta, | |
deltaG=(((cMax-c.g)/6.)+(delta/2.))/delta, | |
deltaB=(((cMax-c.b)/6.)+(delta/2.))/delta; | |
//Hue. | |
if(c.r==cMax){ | |
hsl.x=deltaB-deltaG; | |
}else if(c.g==cMax){ | |
hsl.x=(1./3.)+deltaR-deltaB; | |
}else{ //if(c.b==cMax){ | |
hsl.x=(2./3.)+deltaG-deltaR; | |
} | |
hsl.x=fract(hsl.x); | |
} | |
return hsl; | |
} | |
` + main | |
) | |
.split(out) | |
.join( | |
out + | |
` | |
vec3 hsl = rgb2hsl(gl_FragColor.rgb); | |
hsl.x = fract(hsl.x + hueShift); | |
gl_FragColor.rgb = hsl2rgb(hsl); | |
` | |
); | |
}; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment