75 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			75 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
									Vector2
							 | 
						||
| 
								 | 
							
								} from 'three';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Triangle blur shader
							 | 
						||
| 
								 | 
							
								 * based on glfx.js triangle blur shader
							 | 
						||
| 
								 | 
							
								 * https://github.com/evanw/glfx.js
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * A basic blur filter, which convolves the image with a
							 | 
						||
| 
								 | 
							
								 * pyramid filter. The pyramid filter is separable and is applied as two
							 | 
						||
| 
								 | 
							
								 * perpendicular triangle filters.
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const TriangleBlurShader = {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									name: 'TriangleBlurShader',
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									uniforms: {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										'texture': { value: null },
							 | 
						||
| 
								 | 
							
										'delta': { value: new Vector2( 1, 1 ) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									},
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									vertexShader: /* glsl */`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										varying vec2 vUv;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										void main() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											vUv = uv;
							 | 
						||
| 
								 | 
							
											gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}`,
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									fragmentShader: /* glsl */`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										#include <common>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										#define ITERATIONS 10.0
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										uniform sampler2D texture;
							 | 
						||
| 
								 | 
							
										uniform vec2 delta;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										varying vec2 vUv;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										void main() {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											vec4 color = vec4( 0.0 );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											float total = 0.0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// randomize the lookup values to hide the fixed number of samples
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											float offset = rand( vUv );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											for ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												float percent = ( t + offset - 0.5 ) / ITERATIONS;
							 | 
						||
| 
								 | 
							
												float weight = 1.0 - abs( percent );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
												color += texture2D( texture, vUv + delta * percent ) * weight;
							 | 
						||
| 
								 | 
							
												total += weight;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											gl_FragColor = color / total;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										}`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export { TriangleBlurShader };
							 |