60 lines
1.5 KiB
JavaScript
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;
|
|
}
|
|
}
|