UNPKG

@polygonjs/polygonjs

Version:

node-based WebGL 3D engine https://polygonjs.com

62 lines (54 loc) 1.91 kB
/** * Creates an antialiasing pass * * */ import {TypedPostNode, TypedPostNodeContext, PostParamOptions} from './_Base'; import {NodeParamsConfig, ParamConfig} from '../utils/params/ParamsConfig'; import {BlendFunction, EffectPass, PredicationMode, SMAAEffect, TextureEffect, SMAAPreset} from 'postprocessing'; class AntialiasingPostParamsConfig extends NodeParamsConfig { /** @param opacity */ opacity = ParamConfig.FLOAT(1, { range: [0, 1], rangeLocked: [true, true], ...PostParamOptions, }); } const ParamsConfig = new AntialiasingPostParamsConfig(); export class AntialiasingPostNode extends TypedPostNode<EffectPass, AntialiasingPostParamsConfig> { override paramsConfig = ParamsConfig; static override type() { return 'antialiasing'; } override createPass(context: TypedPostNodeContext) { const smaaEffect = new SMAAEffect( { preset: SMAAPreset.ULTRA, } // assets.get("smaa-search"), // assets.get("smaa-area"), // SMAAPreset.HIGH, // EdgeDetectionMode.COLOR ); smaaEffect.edgeDetectionMaterial.edgeDetectionThreshold = 0.02; smaaEffect.edgeDetectionMaterial.predicationMode = PredicationMode.DEPTH; smaaEffect.edgeDetectionMaterial.predicationThreshold = 0.002; smaaEffect.edgeDetectionMaterial.predicationScale = 1.0; const edgesTextureEffect = new TextureEffect({ blendFunction: BlendFunction.SKIP, texture: smaaEffect.edgesTexture, }); const weightsTextureEffect = new TextureEffect({ blendFunction: BlendFunction.SKIP, texture: smaaEffect.weightsTexture, }); // const copyPass = new ShaderPass(new CopyMaterial()); const pass = new EffectPass(context.camera, smaaEffect, edgesTextureEffect, weightsTextureEffect); this.updatePass(pass); return pass; } override updatePass(pass: EffectPass) { const effect = (pass as any).effects[0] as SMAAEffect; effect.blendMode.opacity.value = this.pv.opacity; } }