summit/frontend/node_modules/three-stdlib/postprocessing/SSAARenderPass.cjs.map

1 line
11 KiB
Plaintext
Raw Normal View History

2025-12-08 16:31:30 +00:00
{"version":3,"file":"SSAARenderPass.cjs","sources":["../../src/postprocessing/SSAARenderPass.js"],"sourcesContent":["import { AdditiveBlending, Color, HalfFloatType, ShaderMaterial, UniformsUtils, WebGLRenderTarget } from 'three'\nimport { Pass, FullScreenQuad } from './Pass'\nimport { CopyShader } from '../shaders/CopyShader'\n\n/**\n *\n * Supersample Anti-Aliasing Render Pass\n *\n * This manual approach to SSAA re-renders the scene ones for each sample with camera jitter and accumulates the results.\n *\n * References: https://en.wikipedia.org/wiki/Supersampling\n *\n */\n\nclass SSAARenderPass extends Pass {\n constructor(scene, camera, clearColor, clearAlpha) {\n super()\n\n this.scene = scene\n this.camera = camera\n\n this.sampleLevel = 4 // specified as n, where the number of samples is 2^n, so sampleLevel = 4, is 2^4 samples, 16.\n this.unbiased = true\n\n // as we need to clear the buffer in this pass, clearColor must be set to something, defaults to black.\n this.clearColor = clearColor !== undefined ? clearColor : 0x000000\n this.clearAlpha = clearAlpha !== undefined ? clearAlpha : 0\n this._oldClearColor = new Color()\n\n const copyShader = CopyShader\n this.copyUniforms = UniformsUtils.clone(copyShader.uniforms)\n\n this.copyMaterial = new ShaderMaterial({\n uniforms: this.copyUniforms,\n vertexShader: copyShader.vertexShader,\n fragmentShader: copyShader.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n premultipliedAlpha: true,\n blending: AdditiveBlending,\n })\n\n this.fsQuad = new FullScreenQuad(this.copyMaterial)\n }\n\n dispose() {\n if (this.sampleRenderTarget) {\n this.sampleRenderTarget.dispose()\n this.sampleRenderTarget = null\n }\n\n this.copyMaterial.dispose()\n\n this.fsQuad.dispose()\n }\n\n setSize(width, height) {\n if (this.sampleRenderTarget) this.sampleRenderTarget.setSize(width, height)\n }\n\n render(renderer, writeBuffer, readBuffer) {\n if (!this.sampleRenderTarget) {\n this.sampleRenderTarget = new WebGLRenderTarget(readBuffer.width, readBuffer.height, { type: HalfFloatType })\n this.sampleRenderTarget.texture.name = 'SSAARenderPass.sample'\n }\n\n const jitterOffsets = _JitterVectors[Math.max(0, Math.min(this.sampleLevel, 5))]\n\n const autoClear = renderer.autoClear\n renderer.autoClear = false\n\n renderer.getClearColor(this._oldClearColor)\n const oldClearAlpha = renderer.getClearAlpha()\n\n const baseSampleWeight = 1.0 / jitterOffsets.length\n const roundingRange = 1 / 32\n this.copyUniforms['tDiffuse'].value = this.sampleRenderTarget.texture\n\n const viewOffset = {\n fullWidth: readBuffer.width,\n fullHeight: readBuffer.height,\n offsetX: 0,\n offsetY: 0,\n width: readBuffer.width,\n height: readBuffer.height,\n }\n\n const originalViewOffset = Object.assign({}, this.camera.view)\n\n if (originalViewOffset.enabled) Object.assign(viewOffset, originalViewOffset)\n\n // render the scene multiple times, each slightly jitter offset from the last and accumulate the results.\n for (let i = 0; i < jitterOffsets.length; i++) {\n const jitterOffset = jitterOffsets[i]\n\n if (this.camera.setViewOffset) {\n this.camera.setViewOffset(\n viewOffset.fullWidth,\n viewOffset.fullHeight,\n\n viewOffset.offsetX + jitterOffset[0] * 0.0625,\n viewOffset.offsetY + jitterOffset[1] * 0.0625, // 0.0625 = 1 / 16\n\n viewOffset.width,\n viewOffset.height,\n )\n }\n\n let sampleWeight = baseSampleWeight\n\n if (this.unbiased) {\n // the theory is that equal weights for each sample lead to an accumulation of rounding errors.\n // The following equation varies the sampleWeight per sample so that it is uniformly distributed\n // across a range of values whose rounding errors cancel each other out.\n\n const uniformCenteredDistribution = -0.5 + (i + 0.5) / j