109 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			109 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import { ShaderPass } from './ShaderPass.js';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const LUTShader = {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									name: 'LUTShader',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									uniforms: {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										lut: { value: null },
							 | 
						||
| 
								 | 
							
										lutSize: { value: 0 },
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										tDiffuse: { value: null },
							 | 
						||
| 
								 | 
							
										intensity: { value: 1.0 },
							 | 
						||
| 
								 | 
							
									},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									vertexShader: /* glsl */`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										varying vec2 vUv;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										void main() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											vUv = uv;
							 | 
						||
| 
								 | 
							
											gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									`,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fragmentShader: /* glsl */`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										uniform float lutSize;
							 | 
						||
| 
								 | 
							
										uniform sampler3D lut;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										varying vec2 vUv;
							 | 
						||
| 
								 | 
							
										uniform float intensity;
							 | 
						||
| 
								 | 
							
										uniform sampler2D tDiffuse;
							 | 
						||
| 
								 | 
							
										void main() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											vec4 val = texture2D( tDiffuse, vUv );
							 | 
						||
| 
								 | 
							
											vec4 lutVal;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// pull the sample in by half a pixel so the sample begins
							 | 
						||
| 
								 | 
							
											// at the center of the edge pixels.
							 | 
						||
| 
								 | 
							
											float pixelWidth = 1.0 / lutSize;
							 | 
						||
| 
								 | 
							
											float halfPixelWidth = 0.5 / lutSize;
							 | 
						||
| 
								 | 
							
											vec3 uvw = vec3( halfPixelWidth ) + val.rgb * ( 1.0 - pixelWidth );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											lutVal = vec4( texture( lut, uvw ).rgb, val.a );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											gl_FragColor = vec4( mix( val, lutVal, intensity ) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									`,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class LUTPass extends ShaderPass {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									set lut( v ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										const material = this.material;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ( v !== this.lut ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											material.uniforms.lut.value = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if ( v ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												material.uniforms.lutSize.value = v.image.width;
							 | 
						||
| 
								 | 
							
												material.uniforms.lut.value = v;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									get lut() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return this.material.uniforms.lut.value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									set intensity( v ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.material.uniforms.intensity.value = v;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									get intensity() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return this.material.uniforms.intensity.value;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									constructor( options = {} ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										super( LUTShader );
							 | 
						||
| 
								 | 
							
										this.lut = options.lut || null;
							 | 
						||
| 
								 | 
							
										this.intensity = 'intensity' in options ? options.intensity : 1;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export { LUTPass };
							 |