| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | 
							- import {
 
- 	Color,
 
- 	ShaderChunk,
 
- 	ShaderLib,
 
- 	UniformsUtils
 
- } from '../../../build/three.module.js';
 
- /**
 
-  * ------------------------------------------------------------------------------------------
 
-  * Subsurface Scattering shader
 
-  * Based on GDC 2011 – Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look
 
-  * https://colinbarrebrisebois.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/
 
-  *------------------------------------------------------------------------------------------
 
-  */
 
- function replaceAll( string, find, replace ) {
 
- 	return string.split( find ).join( replace );
 
- }
 
- const meshphong_frag_head = ShaderChunk[ 'meshphong_frag' ].slice( 0, ShaderChunk[ 'meshphong_frag' ].indexOf( 'void main() {' ) );
 
- const meshphong_frag_body = ShaderChunk[ 'meshphong_frag' ].slice( ShaderChunk[ 'meshphong_frag' ].indexOf( 'void main() {' ) );
 
- const SubsurfaceScatteringShader = {
 
- 	uniforms: UniformsUtils.merge( [
 
- 		ShaderLib[ 'phong' ].uniforms,
 
- 		{
 
- 			'thicknessMap': { value: null },
 
- 			'thicknessColor': { value: new Color( 0xffffff ) },
 
- 			'thicknessDistortion': { value: 0.1 },
 
- 			'thicknessAmbient': { value: 0.0 },
 
- 			'thicknessAttenuation': { value: 0.1 },
 
- 			'thicknessPower': { value: 2.0 },
 
- 			'thicknessScale': { value: 10.0 }
 
- 		}
 
- 	] ),
 
- 	vertexShader: [
 
- 		'#define USE_UV',
 
- 		ShaderChunk[ 'meshphong_vert' ],
 
- 	].join( '\n' ),
 
- 	fragmentShader: [
 
- 		'#define USE_UV',
 
- 		'#define SUBSURFACE',
 
- 		meshphong_frag_head,
 
- 		'uniform sampler2D thicknessMap;',
 
- 		'uniform float thicknessPower;',
 
- 		'uniform float thicknessScale;',
 
- 		'uniform float thicknessDistortion;',
 
- 		'uniform float thicknessAmbient;',
 
- 		'uniform float thicknessAttenuation;',
 
- 		'uniform vec3 thicknessColor;',
 
- 		'void RE_Direct_Scattering(const in IncidentLight directLight, const in vec2 uv, const in GeometricContext geometry, inout ReflectedLight reflectedLight) {',
 
- 		'	vec3 thickness = thicknessColor * texture2D(thicknessMap, uv).r;',
 
- 		'	vec3 scatteringHalf = normalize(directLight.direction + (geometry.normal * thicknessDistortion));',
 
- 		'	float scatteringDot = pow(saturate(dot(geometry.viewDir, -scatteringHalf)), thicknessPower) * thicknessScale;',
 
- 		'	vec3 scatteringIllu = (scatteringDot + thicknessAmbient) * thickness;',
 
- 		'	reflectedLight.directDiffuse += scatteringIllu * thicknessAttenuation * directLight.color;',
 
- 		'}',
 
- 		meshphong_frag_body.replace( '#include <lights_fragment_begin>',
 
- 			replaceAll(
 
- 				ShaderChunk[ 'lights_fragment_begin' ],
 
- 				'RE_Direct( directLight, geometry, material, reflectedLight );',
 
- 				[
 
- 					'RE_Direct( directLight, geometry, material, reflectedLight );',
 
- 					'#if defined( SUBSURFACE ) && defined( USE_UV )',
 
- 					' RE_Direct_Scattering(directLight, vUv, geometry, reflectedLight);',
 
- 					'#endif',
 
- 				].join( '\n' )
 
- 			),
 
- 		),
 
- 	].join( '\n' ),
 
- };
 
- export { SubsurfaceScatteringShader };
 
 
  |