Skip to content

Instantly share code, notes, and snippets.

@maxmonax
Created October 22, 2021 09:27
Show Gist options
  • Save maxmonax/d42b957bde4b891b33381159dc6695c1 to your computer and use it in GitHub Desktop.
Save maxmonax/d42b957bde4b891b33381159dc6695c1 to your computer and use it in GitHub Desktop.
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