添加关照、全局等高线、修改图层问题
This commit is contained in:
84
dist/electron/static/sdk/three/jsm/nodes/materials/MeshSSSNodeMaterial.js
vendored
Normal file
84
dist/electron/static/sdk/three/jsm/nodes/materials/MeshSSSNodeMaterial.js
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
import { addNodeMaterial } from './NodeMaterial.js';
|
||||
import { transformedNormalView } from '../accessors/NormalNode.js';
|
||||
import { positionViewDirection } from '../accessors/PositionNode.js';
|
||||
import PhysicalLightingModel from '../functions/PhysicalLightingModel.js';
|
||||
import MeshPhysicalNodeMaterial from './MeshPhysicalNodeMaterial.js';
|
||||
import { float, vec3 } from '../shadernode/ShaderNode.js';
|
||||
|
||||
class SSSLightingModel extends PhysicalLightingModel {
|
||||
|
||||
constructor( useClearcoat, useSheen, useIridescence, useSSS ) {
|
||||
|
||||
super( useClearcoat, useSheen, useIridescence );
|
||||
|
||||
this.useSSS = useSSS;
|
||||
|
||||
}
|
||||
|
||||
direct( { lightDirection, lightColor, reflectedLight }, stack, builder ) {
|
||||
|
||||
if ( this.useSSS === true ) {
|
||||
|
||||
const material = builder.material;
|
||||
|
||||
const { thicknessColorNode, thicknessDistortionNode, thicknessAmbientNode, thicknessAttenuationNode, thicknessPowerNode, thicknessScaleNode } = material;
|
||||
|
||||
const scatteringHalf = lightDirection.add( transformedNormalView.mul( thicknessDistortionNode ) ).normalize();
|
||||
const scatteringDot = float( positionViewDirection.dot( scatteringHalf.negate() ).saturate().pow( thicknessPowerNode ).mul( thicknessScaleNode ) );
|
||||
const scatteringIllu = vec3( scatteringDot.add( thicknessAmbientNode ).mul( thicknessColorNode ) );
|
||||
|
||||
reflectedLight.directDiffuse.addAssign( scatteringIllu.mul( thicknessAttenuationNode.mul( lightColor ) ) );
|
||||
|
||||
}
|
||||
|
||||
super.direct( { lightDirection, lightColor, reflectedLight }, stack, builder );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
class MeshSSSNodeMaterial extends MeshPhysicalNodeMaterial {
|
||||
|
||||
constructor( parameters ) {
|
||||
|
||||
super( parameters );
|
||||
|
||||
this.thicknessColorNode = null;
|
||||
this.thicknessDistortionNode = float( 0.1 );
|
||||
this.thicknessAmbientNode = float( 0.0 );
|
||||
this.thicknessAttenuationNode = float( .1 );
|
||||
this.thicknessPowerNode = float( 2.0 );
|
||||
this.thicknessScaleNode = float( 10.0 );
|
||||
|
||||
}
|
||||
|
||||
get useSSS() {
|
||||
|
||||
return this.thicknessColorNode !== null;
|
||||
|
||||
}
|
||||
|
||||
setupLightingModel( /*builder*/ ) {
|
||||
|
||||
return new SSSLightingModel( this.useClearcoat, this.useSheen, this.useIridescence, this.useSSS );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
this.thicknessColorNode = source.thicknessColorNode;
|
||||
this.thicknessDistortionNode = source.thicknessDistortionNode;
|
||||
this.thicknessAmbientNode = source.thicknessAmbientNode;
|
||||
this.thicknessAttenuationNode = source.thicknessAttenuationNode;
|
||||
this.thicknessPowerNode = source.thicknessPowerNode;
|
||||
this.thicknessScaleNode = source.thicknessScaleNode;
|
||||
|
||||
return super.copy( source );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default MeshSSSNodeMaterial;
|
||||
|
||||
addNodeMaterial( 'MeshSSSNodeMaterial', MeshSSSNodeMaterial );
|
Reference in New Issue
Block a user