waves/public/assets/g/burgerandfrights/js/framework/three.js/brightnessmaterial.js
2025-04-09 17:11:14 -05:00

60 lines
1.5 KiB
JavaScript

/**
* @file brightnessmaterial.js
* @version 1.0.0
*/
import * as THREE from '../../lib/three.js/three.module.js';
const BrightnessShader = {
uniforms: {
tDiffuse: { value: null },
brightness: { value: new THREE.Vector3() },
contrast: { value: new THREE.Vector3() },
},
vertexShader: `
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
}`,
fragmentShader: `
uniform sampler2D tDiffuse;
uniform vec3 brightness;
uniform vec3 contrast;
varying vec2 vUv;
void main() {
gl_FragColor = sRGBToLinear(texture2D(tDiffuse, vUv));
gl_FragColor.rgb += brightness;
// Inspired by
// https://github.com/evanw/glfx.js/blob/master/src/filters/adjust/brightnesscontrast.js
vec3 cSign = sign(contrast);
gl_FragColor.rgb =
((gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5) * max(-cSign, 0.0) +
((gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5) * max(cSign, 0.0);
gl_FragColor = LinearTosRGB(gl_FragColor);
}`,
};
export default class BrightnessMaterial extends THREE.ShaderMaterial {
constructor(parameters) {
super({
type: 'BrightnessMaterial',
uniforms: THREE.UniformsUtils.clone(BrightnessShader.uniforms),
vertexShader: BrightnessShader.vertexShader,
fragmentShader: BrightnessShader.fragmentShader,
});
}
setRenderTarget(rt) {
this.uniforms.tDiffuse.value = rt.texture;
}
}