@react-three/postprocessing 2.15.5 → 2.15.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/effects/N8AO/BlueNoise.cjs +4 -0
  2. package/dist/effects/N8AO/BlueNoise.cjs.map +1 -0
  3. package/dist/effects/N8AO/BlueNoise.js +5 -0
  4. package/dist/effects/N8AO/BlueNoise.js.map +1 -0
  5. package/dist/effects/N8AO/DepthDownSample.cjs +183 -0
  6. package/dist/effects/N8AO/DepthDownSample.cjs.map +1 -0
  7. package/dist/effects/N8AO/DepthDownSample.js +166 -0
  8. package/dist/effects/N8AO/DepthDownSample.js.map +1 -0
  9. package/dist/effects/N8AO/EffectCompositer.cjs +276 -0
  10. package/dist/effects/N8AO/EffectCompositer.cjs.map +1 -0
  11. package/dist/effects/N8AO/EffectCompositer.js +259 -0
  12. package/dist/effects/N8AO/EffectCompositer.js.map +1 -0
  13. package/dist/effects/N8AO/EffectShader.cjs +236 -0
  14. package/dist/effects/N8AO/EffectShader.cjs.map +1 -0
  15. package/dist/effects/N8AO/EffectShader.js +219 -0
  16. package/dist/effects/N8AO/EffectShader.js.map +1 -0
  17. package/dist/effects/N8AO/FullScreenTriangle.cjs +59 -0
  18. package/dist/effects/N8AO/FullScreenTriangle.cjs.map +1 -0
  19. package/dist/effects/N8AO/FullScreenTriangle.js +42 -0
  20. package/dist/effects/N8AO/FullScreenTriangle.js.map +1 -0
  21. package/dist/effects/N8AO/N8AOPostPass.cjs +501 -0
  22. package/dist/effects/N8AO/N8AOPostPass.cjs.map +1 -0
  23. package/dist/effects/N8AO/N8AOPostPass.js +484 -0
  24. package/dist/effects/N8AO/N8AOPostPass.js.map +1 -0
  25. package/dist/effects/N8AO/PoissionBlur.cjs +186 -0
  26. package/dist/effects/N8AO/PoissionBlur.cjs.map +1 -0
  27. package/dist/effects/N8AO/PoissionBlur.js +169 -0
  28. package/dist/effects/N8AO/PoissionBlur.js.map +1 -0
  29. package/dist/effects/{N8AO.cjs → N8AO/index.cjs} +3 -3
  30. package/dist/effects/N8AO/index.cjs.map +1 -0
  31. package/dist/effects/{N8AO.js → N8AO/index.js} +3 -3
  32. package/dist/effects/N8AO/index.js.map +1 -0
  33. package/dist/index.cjs +2 -2
  34. package/dist/index.js +1 -1
  35. package/package.json +2 -1
  36. package/dist/effects/N8AO.cjs.map +0 -1
  37. package/dist/effects/N8AO.js.map +0 -1
  38. package/dist/node_modules/n8ao/dist/N8AO.cjs +0 -1439
  39. package/dist/node_modules/n8ao/dist/N8AO.cjs.map +0 -1
  40. package/dist/node_modules/n8ao/dist/N8AO.js +0 -1439
  41. package/dist/node_modules/n8ao/dist/N8AO.js.map +0 -1
  42. /package/dist/effects/{N8AO.d.ts → N8AO/index.d.ts} +0 -0
@@ -0,0 +1,501 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const THREE = require("three");
4
+ const postprocessing = require("postprocessing");
5
+ const buffer = require("buffer");
6
+ const FullScreenTriangle = require("./FullScreenTriangle.cjs");
7
+ const EffectShader = require("./EffectShader.cjs");
8
+ const EffectCompositer = require("./EffectCompositer.cjs");
9
+ const PoissionBlur = require("./PoissionBlur.cjs");
10
+ const DepthDownSample = require("./DepthDownSample.cjs");
11
+ const BlueNoise = require("./BlueNoise.cjs");
12
+ function _interopNamespaceDefault(e) {
13
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
14
+ if (e) {
15
+ for (const k in e) {
16
+ if (k !== "default") {
17
+ const d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: () => e[k]
21
+ });
22
+ }
23
+ }
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+ const THREE__namespace = /* @__PURE__ */ _interopNamespaceDefault(THREE);
29
+ const bluenoiseBits = buffer.Buffer.from(BlueNoise, "base64");
30
+ function checkTimerQuery(timerQuery, gl, pass) {
31
+ const available = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT_AVAILABLE);
32
+ if (available) {
33
+ const elapsedTimeInNs = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT);
34
+ const elapsedTimeInMs = elapsedTimeInNs / 1e6;
35
+ pass.lastTime = elapsedTimeInMs;
36
+ } else {
37
+ setTimeout(() => {
38
+ checkTimerQuery(timerQuery, gl, pass);
39
+ }, 1);
40
+ }
41
+ }
42
+ class N8AOPostPass extends postprocessing.Pass {
43
+ /**
44
+ *
45
+ * @param {THREE.Scene} scene
46
+ * @param {THREE.Camera} camera
47
+ * @param {number} width
48
+ * @param {number} height
49
+ *
50
+ * @property {THREE.Scene} scene
51
+ * @property {THREE.Camera} camera
52
+ * @property {number} width
53
+ * @property {number} height
54
+ */
55
+ constructor(scene, camera, width = 512, height = 512) {
56
+ super();
57
+ this.width = width;
58
+ this.height = height;
59
+ this.clear = true;
60
+ this.camera = camera;
61
+ this.scene = scene;
62
+ this.autosetGamma = true;
63
+ this.configuration = new Proxy(
64
+ {
65
+ aoSamples: 16,
66
+ aoRadius: 5,
67
+ denoiseSamples: 8,
68
+ denoiseRadius: 12,
69
+ distanceFalloff: 1,
70
+ intensity: 5,
71
+ denoiseIterations: 2,
72
+ renderMode: 0,
73
+ color: new THREE__namespace.Color(0, 0, 0),
74
+ gammaCorrection: true,
75
+ logarithmicDepthBuffer: false,
76
+ screenSpaceRadius: false,
77
+ halfRes: false,
78
+ depthAwareUpsampling: true,
79
+ colorMultiply: true
80
+ },
81
+ {
82
+ set: (target, propName, value) => {
83
+ const oldProp = target[propName];
84
+ target[propName] = value;
85
+ if (propName === "aoSamples" && oldProp !== value) {
86
+ this.configureAOPass(this.configuration.logarithmicDepthBuffer);
87
+ }
88
+ if (propName === "denoiseSamples" && oldProp !== value) {
89
+ this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);
90
+ }
91
+ if (propName === "halfRes" && oldProp !== value) {
92
+ this.configureAOPass(this.configuration.logarithmicDepthBuffer);
93
+ this.configureHalfResTargets();
94
+ this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);
95
+ this.setSize(this.width, this.height);
96
+ }
97
+ if (propName === "depthAwareUpsampling" && oldProp !== value) {
98
+ this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);
99
+ }
100
+ if (propName === "gammaCorrection") {
101
+ this.autosetGamma = false;
102
+ }
103
+ return true;
104
+ }
105
+ }
106
+ );
107
+ this.samples = [];
108
+ this.samplesR = [];
109
+ this.samplesDenoise = [];
110
+ this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);
111
+ this.configureSampleDependentPasses();
112
+ this.configureHalfResTargets();
113
+ this.copyQuad = new FullScreenTriangle.FullScreenTriangle(
114
+ new THREE__namespace.ShaderMaterial({
115
+ uniforms: {
116
+ tDiffuse: {
117
+ value: null
118
+ }
119
+ },
120
+ depthWrite: false,
121
+ vertexShader: `
122
+ varying vec2 vUv;
123
+ void main() {
124
+ vUv = uv;
125
+ gl_Position = vec4(position, 1);
126
+ }
127
+ `,
128
+ fragmentShader: `
129
+ uniform sampler2D tDiffuse;
130
+ varying vec2 vUv;
131
+ void main() {
132
+ gl_FragColor = texture2D(tDiffuse, vUv);
133
+ }
134
+ `
135
+ })
136
+ );
137
+ this.writeTargetInternal = new THREE__namespace.WebGLRenderTarget(this.width, this.height, {
138
+ minFilter: THREE__namespace.LinearFilter,
139
+ magFilter: THREE__namespace.LinearFilter,
140
+ depthBuffer: false
141
+ });
142
+ this.readTargetInternal = new THREE__namespace.WebGLRenderTarget(this.width, this.height, {
143
+ minFilter: THREE__namespace.LinearFilter,
144
+ magFilter: THREE__namespace.LinearFilter,
145
+ depthBuffer: false
146
+ });
147
+ this.outputTargetInternal = new THREE__namespace.WebGLRenderTarget(this.width, this.height, {
148
+ minFilter: THREE__namespace.LinearFilter,
149
+ magFilter: THREE__namespace.LinearFilter,
150
+ depthBuffer: false
151
+ });
152
+ this.bluenoise = //bluenoise;
153
+ new THREE__namespace.DataTexture(bluenoiseBits, 128, 128);
154
+ this.bluenoise.colorSpace = THREE__namespace.NoColorSpace;
155
+ this.bluenoise.wrapS = THREE__namespace.RepeatWrapping;
156
+ this.bluenoise.wrapT = THREE__namespace.RepeatWrapping;
157
+ this.bluenoise.minFilter = THREE__namespace.NearestFilter;
158
+ this.bluenoise.magFilter = THREE__namespace.NearestFilter;
159
+ this.bluenoise.needsUpdate = true;
160
+ this.lastTime = 0;
161
+ this.needsDepthTexture = true;
162
+ this.needsSwap = true;
163
+ this._r = new THREE__namespace.Vector2();
164
+ this._c = new THREE__namespace.Color();
165
+ }
166
+ configureHalfResTargets() {
167
+ if (this.configuration.halfRes) {
168
+ this.depthDownsampleTarget = /*new THREE.WebGLRenderTarget(this.width / 2, this.height / 2, {
169
+ minFilter: THREE.NearestFilter,
170
+ magFilter: THREE.NearestFilter,
171
+ depthBuffer: false,
172
+ format: THREE.RedFormat,
173
+ type: THREE.FloatType
174
+ });*/
175
+ new THREE__namespace.WebGLMultipleRenderTargets(this.width / 2, this.height / 2, 2);
176
+ this.depthDownsampleTarget.texture[0].format = THREE__namespace.RedFormat;
177
+ this.depthDownsampleTarget.texture[0].type = THREE__namespace.FloatType;
178
+ this.depthDownsampleTarget.texture[0].minFilter = THREE__namespace.NearestFilter;
179
+ this.depthDownsampleTarget.texture[0].magFilter = THREE__namespace.NearestFilter;
180
+ this.depthDownsampleTarget.texture[0].depthBuffer = false;
181
+ this.depthDownsampleTarget.texture[1].format = THREE__namespace.RGBAFormat;
182
+ this.depthDownsampleTarget.texture[1].type = THREE__namespace.HalfFloatType;
183
+ this.depthDownsampleTarget.texture[1].minFilter = THREE__namespace.NearestFilter;
184
+ this.depthDownsampleTarget.texture[1].magFilter = THREE__namespace.NearestFilter;
185
+ this.depthDownsampleTarget.texture[1].depthBuffer = false;
186
+ this.depthDownsampleQuad = new FullScreenTriangle.FullScreenTriangle(new THREE__namespace.ShaderMaterial(DepthDownSample.DepthDownSample));
187
+ } else {
188
+ if (this.depthDownsampleTarget) {
189
+ this.depthDownsampleTarget.dispose();
190
+ this.depthDownsampleTarget = null;
191
+ }
192
+ if (this.depthDownsampleQuad) {
193
+ this.depthDownsampleQuad.dispose();
194
+ this.depthDownsampleQuad = null;
195
+ }
196
+ }
197
+ }
198
+ configureSampleDependentPasses() {
199
+ this.configureAOPass(this.configuration.logarithmicDepthBuffer);
200
+ this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);
201
+ }
202
+ configureAOPass(logarithmicDepthBuffer = false) {
203
+ this.samples = this.generateHemisphereSamples(this.configuration.aoSamples);
204
+ this.samplesR = this.generateHemisphereSamplesR(this.configuration.aoSamples);
205
+ const e = { ...EffectShader.EffectShader };
206
+ e.fragmentShader = e.fragmentShader.replace("16", this.configuration.aoSamples).replace("16.0", this.configuration.aoSamples + ".0");
207
+ if (logarithmicDepthBuffer) {
208
+ e.fragmentShader = "#define LOGDEPTH\n" + e.fragmentShader;
209
+ }
210
+ if (this.configuration.halfRes) {
211
+ e.fragmentShader = "#define HALFRES\n" + e.fragmentShader;
212
+ }
213
+ if (this.effectShaderQuad) {
214
+ this.effectShaderQuad.material.dispose();
215
+ this.effectShaderQuad.material = new THREE__namespace.ShaderMaterial(e);
216
+ } else {
217
+ this.effectShaderQuad = new FullScreenTriangle.FullScreenTriangle(new THREE__namespace.ShaderMaterial(e));
218
+ }
219
+ }
220
+ configureDenoisePass(logarithmicDepthBuffer = false) {
221
+ this.samplesDenoise = this.generateDenoiseSamples(this.configuration.denoiseSamples, 11);
222
+ const p = { ...PoissionBlur.PoissionBlur };
223
+ p.fragmentShader = p.fragmentShader.replace("16", this.configuration.denoiseSamples);
224
+ if (logarithmicDepthBuffer) {
225
+ p.fragmentShader = "#define LOGDEPTH\n" + p.fragmentShader;
226
+ }
227
+ if (this.poissonBlurQuad) {
228
+ this.poissonBlurQuad.material.dispose();
229
+ this.poissonBlurQuad.material = new THREE__namespace.ShaderMaterial(p);
230
+ } else {
231
+ this.poissonBlurQuad = new FullScreenTriangle.FullScreenTriangle(new THREE__namespace.ShaderMaterial(p));
232
+ }
233
+ }
234
+ configureEffectCompositer(logarithmicDepthBuffer = false) {
235
+ const e = { ...EffectCompositer.EffectCompositer };
236
+ if (logarithmicDepthBuffer) {
237
+ e.fragmentShader = "#define LOGDEPTH\n" + e.fragmentShader;
238
+ }
239
+ if (this.configuration.halfRes && this.configuration.depthAwareUpsampling) {
240
+ e.fragmentShader = "#define HALFRES\n" + e.fragmentShader;
241
+ }
242
+ if (this.effectCompositerQuad) {
243
+ this.effectCompositerQuad.material.dispose();
244
+ this.effectCompositerQuad.material = new THREE__namespace.ShaderMaterial(e);
245
+ } else {
246
+ this.effectCompositerQuad = new FullScreenTriangle.FullScreenTriangle(new THREE__namespace.ShaderMaterial(e));
247
+ }
248
+ }
249
+ /**
250
+ *
251
+ * @param {Number} n
252
+ * @returns {THREE.Vector3[]}
253
+ */
254
+ generateHemisphereSamples(n) {
255
+ const points = [];
256
+ for (let k = 0; k < n; k++) {
257
+ const theta = 2.399963 * k;
258
+ const r = Math.sqrt(k + 0.5) / Math.sqrt(n);
259
+ const x = r * Math.cos(theta);
260
+ const y = r * Math.sin(theta);
261
+ const z = Math.sqrt(1 - (x * x + y * y));
262
+ points.push(new THREE__namespace.Vector3(x, y, z));
263
+ }
264
+ return points;
265
+ }
266
+ /**
267
+ *
268
+ * @param {number} n
269
+ * @returns {number[]}
270
+ */
271
+ generateHemisphereSamplesR(n) {
272
+ let samplesR = [];
273
+ for (let i = 0; i < n; i++) {
274
+ samplesR.push((i + 1) / n);
275
+ }
276
+ return samplesR;
277
+ }
278
+ /**
279
+ *
280
+ * @param {number} numSamples
281
+ * @param {number} numRings
282
+ * @returns {THREE.Vector2[]}
283
+ */
284
+ generateDenoiseSamples(numSamples, numRings) {
285
+ const angleStep = 2 * Math.PI * numRings / numSamples;
286
+ const invNumSamples = 1 / numSamples;
287
+ const radiusStep = invNumSamples;
288
+ const samples = [];
289
+ let radius = invNumSamples;
290
+ let angle = 0;
291
+ for (let i = 0; i < numSamples; i++) {
292
+ samples.push(new THREE__namespace.Vector2(Math.cos(angle), Math.sin(angle)).multiplyScalar(Math.pow(radius, 0.75)));
293
+ radius += radiusStep;
294
+ angle += angleStep;
295
+ }
296
+ return samples;
297
+ }
298
+ setSize(width, height) {
299
+ this.width = width;
300
+ this.height = height;
301
+ const c = this.configuration.halfRes ? 0.5 : 1;
302
+ this.writeTargetInternal.setSize(width * c, height * c);
303
+ this.readTargetInternal.setSize(width * c, height * c);
304
+ if (this.configuration.halfRes) {
305
+ this.depthDownsampleTarget.setSize(width * c, height * c);
306
+ }
307
+ this.outputTargetInternal.setSize(width, height);
308
+ }
309
+ setDepthTexture(depthTexture) {
310
+ this.depthTexture = depthTexture;
311
+ }
312
+ render(renderer, inputBuffer, outputBuffer) {
313
+ const xrEnabled = renderer.xr.enabled;
314
+ renderer.xr.enabled = false;
315
+ if (renderer.capabilities.logarithmicDepthBuffer !== this.configuration.logarithmicDepthBuffer) {
316
+ this.configuration.logarithmicDepthBuffer = renderer.capabilities.logarithmicDepthBuffer;
317
+ this.configureAOPass(this.configuration.logarithmicDepthBuffer);
318
+ this.configureDenoisePass(this.configuration.logarithmicDepthBuffer);
319
+ this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer);
320
+ }
321
+ if (inputBuffer.texture.type !== this.outputTargetInternal.texture.type) {
322
+ this.outputTargetInternal.texture.type = inputBuffer.texture.type;
323
+ this.outputTargetInternal.texture.needsUpdate = true;
324
+ }
325
+ let gl;
326
+ let ext;
327
+ let timerQuery;
328
+ if (this.debugMode) {
329
+ gl = renderer.getContext();
330
+ ext = gl.getExtension("EXT_disjoint_timer_query_webgl2");
331
+ if (ext === null) {
332
+ console.error("EXT_disjoint_timer_query_webgl2 not available, disabling debug mode.");
333
+ this.debugMode = false;
334
+ }
335
+ }
336
+ if (this.debugMode) {
337
+ timerQuery = gl.createQuery();
338
+ gl.beginQuery(ext.TIME_ELAPSED_EXT, timerQuery);
339
+ }
340
+ this.camera.updateMatrixWorld();
341
+ this._r.set(this.width, this.height);
342
+ let trueRadius = this.configuration.aoRadius;
343
+ if (this.configuration.halfRes && this.configuration.screenSpaceRadius) {
344
+ trueRadius *= 0.5;
345
+ }
346
+ if (this.configuration.halfRes) {
347
+ renderer.setRenderTarget(this.depthDownsampleTarget);
348
+ this.depthDownsampleQuad.material.uniforms.sceneDepth.value = this.depthTexture;
349
+ this.depthDownsampleQuad.material.uniforms.resolution.value = this._r;
350
+ this.depthDownsampleQuad.material.uniforms["near"].value = this.camera.near;
351
+ this.depthDownsampleQuad.material.uniforms["far"].value = this.camera.far;
352
+ this.depthDownsampleQuad.material.uniforms["projectionMatrixInv"].value = this.camera.projectionMatrixInverse;
353
+ this.depthDownsampleQuad.material.uniforms["viewMatrixInv"].value = this.camera.matrixWorld;
354
+ this.depthDownsampleQuad.material.uniforms["logDepth"].value = this.configuration.logarithmicDepthBuffer;
355
+ this.depthDownsampleQuad.render(renderer);
356
+ }
357
+ this.effectShaderQuad.material.uniforms["sceneDiffuse"].value = inputBuffer.texture;
358
+ this.effectShaderQuad.material.uniforms["sceneDepth"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;
359
+ this.effectShaderQuad.material.uniforms["sceneNormal"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[1] : null;
360
+ this.effectShaderQuad.material.uniforms["projMat"].value = this.camera.projectionMatrix;
361
+ this.effectShaderQuad.material.uniforms["viewMat"].value = this.camera.matrixWorldInverse;
362
+ this.effectShaderQuad.material.uniforms["projViewMat"].value = this.camera.projectionMatrix.clone().multiply(this.camera.matrixWorldInverse.clone());
363
+ this.effectShaderQuad.material.uniforms["projectionMatrixInv"].value = this.camera.projectionMatrixInverse;
364
+ this.effectShaderQuad.material.uniforms["viewMatrixInv"].value = this.camera.matrixWorld;
365
+ this.effectShaderQuad.material.uniforms["cameraPos"].value = this.camera.getWorldPosition(new THREE__namespace.Vector3());
366
+ this.effectShaderQuad.material.uniforms["resolution"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(1 / 2).floor() : this._r;
367
+ this.effectShaderQuad.material.uniforms["time"].value = performance.now() / 1e3;
368
+ this.effectShaderQuad.material.uniforms["samples"].value = this.samples;
369
+ this.effectShaderQuad.material.uniforms["samplesR"].value = this.samplesR;
370
+ this.effectShaderQuad.material.uniforms["bluenoise"].value = this.bluenoise;
371
+ this.effectShaderQuad.material.uniforms["radius"].value = trueRadius;
372
+ this.effectShaderQuad.material.uniforms["distanceFalloff"].value = this.configuration.distanceFalloff;
373
+ this.effectShaderQuad.material.uniforms["near"].value = this.camera.near;
374
+ this.effectShaderQuad.material.uniforms["far"].value = this.camera.far;
375
+ this.effectShaderQuad.material.uniforms["logDepth"].value = renderer.capabilities.logarithmicDepthBuffer;
376
+ this.effectShaderQuad.material.uniforms["ortho"].value = this.camera.isOrthographicCamera;
377
+ this.effectShaderQuad.material.uniforms["screenSpaceRadius"].value = this.configuration.screenSpaceRadius;
378
+ renderer.setRenderTarget(this.writeTargetInternal);
379
+ this.effectShaderQuad.render(renderer);
380
+ for (let i = 0; i < this.configuration.denoiseIterations; i++) {
381
+ [this.writeTargetInternal, this.readTargetInternal] = [this.readTargetInternal, this.writeTargetInternal];
382
+ this.poissonBlurQuad.material.uniforms["tDiffuse"].value = this.readTargetInternal.texture;
383
+ this.poissonBlurQuad.material.uniforms["sceneDepth"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;
384
+ this.poissonBlurQuad.material.uniforms["projMat"].value = this.camera.projectionMatrix;
385
+ this.poissonBlurQuad.material.uniforms["viewMat"].value = this.camera.matrixWorldInverse;
386
+ this.poissonBlurQuad.material.uniforms["projectionMatrixInv"].value = this.camera.projectionMatrixInverse;
387
+ this.poissonBlurQuad.material.uniforms["viewMatrixInv"].value = this.camera.matrixWorld;
388
+ this.poissonBlurQuad.material.uniforms["cameraPos"].value = this.camera.getWorldPosition(new THREE__namespace.Vector3());
389
+ this.poissonBlurQuad.material.uniforms["resolution"].value = this.configuration.halfRes ? this._r.clone().multiplyScalar(1 / 2).floor() : this._r;
390
+ this.poissonBlurQuad.material.uniforms["time"].value = performance.now() / 1e3;
391
+ this.poissonBlurQuad.material.uniforms["blueNoise"].value = this.bluenoise;
392
+ this.poissonBlurQuad.material.uniforms["radius"].value = this.configuration.denoiseRadius * (this.configuration.halfRes ? 1 / 2 : 1);
393
+ this.poissonBlurQuad.material.uniforms["worldRadius"].value = trueRadius;
394
+ this.poissonBlurQuad.material.uniforms["distanceFalloff"].value = this.configuration.distanceFalloff;
395
+ this.poissonBlurQuad.material.uniforms["index"].value = i;
396
+ this.poissonBlurQuad.material.uniforms["poissonDisk"].value = this.samplesDenoise;
397
+ this.poissonBlurQuad.material.uniforms["near"].value = this.camera.near;
398
+ this.poissonBlurQuad.material.uniforms["far"].value = this.camera.far;
399
+ this.poissonBlurQuad.material.uniforms["logDepth"].value = renderer.capabilities.logarithmicDepthBuffer;
400
+ this.poissonBlurQuad.material.uniforms["screenSpaceRadius"].value = this.configuration.screenSpaceRadius;
401
+ renderer.setRenderTarget(this.writeTargetInternal);
402
+ this.poissonBlurQuad.render(renderer);
403
+ }
404
+ this.effectCompositerQuad.material.uniforms["sceneDiffuse"].value = inputBuffer.texture;
405
+ this.effectCompositerQuad.material.uniforms["sceneDepth"].value = this.depthTexture;
406
+ this.effectCompositerQuad.material.uniforms["near"].value = this.camera.near;
407
+ this.effectCompositerQuad.material.uniforms["far"].value = this.camera.far;
408
+ this.effectCompositerQuad.material.uniforms["projectionMatrixInv"].value = this.camera.projectionMatrixInverse;
409
+ this.effectCompositerQuad.material.uniforms["viewMatrixInv"].value = this.camera.matrixWorld;
410
+ this.effectCompositerQuad.material.uniforms["logDepth"].value = renderer.capabilities.logarithmicDepthBuffer;
411
+ this.effectCompositerQuad.material.uniforms["ortho"].value = this.camera.isOrthographicCamera;
412
+ this.effectCompositerQuad.material.uniforms["downsampledDepth"].value = this.configuration.halfRes ? this.depthDownsampleTarget.texture[0] : this.depthTexture;
413
+ this.effectCompositerQuad.material.uniforms["resolution"].value = this._r;
414
+ this.effectCompositerQuad.material.uniforms["blueNoise"].value = this.bluenoise;
415
+ this.effectCompositerQuad.material.uniforms["intensity"].value = this.configuration.intensity;
416
+ this.effectCompositerQuad.material.uniforms["renderMode"].value = this.configuration.renderMode;
417
+ this.effectCompositerQuad.material.uniforms["screenSpaceRadius"].value = this.configuration.screenSpaceRadius;
418
+ this.effectCompositerQuad.material.uniforms["radius"].value = trueRadius;
419
+ this.effectCompositerQuad.material.uniforms["distanceFalloff"].value = this.configuration.distanceFalloff;
420
+ this.effectCompositerQuad.material.uniforms["gammaCorrection"].value = this.autosetGamma ? this.renderToScreen : this.configuration.gammaCorrection;
421
+ this.effectCompositerQuad.material.uniforms["tDiffuse"].value = this.writeTargetInternal.texture;
422
+ this.effectCompositerQuad.material.uniforms["color"].value = this._c.copy(this.configuration.color).convertSRGBToLinear();
423
+ this.effectCompositerQuad.material.uniforms["colorMultiply"].value = this.configuration.colorMultiply;
424
+ this.effectCompositerQuad.material.uniforms["cameraPos"].value = this.camera.getWorldPosition(new THREE__namespace.Vector3());
425
+ this.effectCompositerQuad.material.uniforms["fog"].value = !!this.scene.fog;
426
+ if (this.scene.fog) {
427
+ if (this.scene.fog.isFog) {
428
+ this.effectCompositerQuad.material.uniforms["fogExp"].value = false;
429
+ this.effectCompositerQuad.material.uniforms["fogNear"].value = this.scene.fog.near;
430
+ this.effectCompositerQuad.material.uniforms["fogFar"].value = this.scene.fog.far;
431
+ } else if (this.scene.fog.isFogExp2) {
432
+ this.effectCompositerQuad.material.uniforms["fogExp"].value = true;
433
+ this.effectCompositerQuad.material.uniforms["fogDensity"].value = this.scene.fog.density;
434
+ } else {
435
+ console.error(`Unsupported fog type ${this.scene.fog.constructor.name} in SSAOPass.`);
436
+ }
437
+ }
438
+ renderer.setRenderTarget(
439
+ /* this.renderToScreen ? null :
440
+ outputBuffer*/
441
+ this.outputTargetInternal
442
+ );
443
+ this.effectCompositerQuad.render(renderer);
444
+ renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer);
445
+ this.copyQuad.material.uniforms["tDiffuse"].value = this.outputTargetInternal.texture;
446
+ this.copyQuad.render(renderer);
447
+ if (this.debugMode) {
448
+ gl.endQuery(ext.TIME_ELAPSED_EXT);
449
+ checkTimerQuery(timerQuery, gl, this);
450
+ }
451
+ renderer.xr.enabled = xrEnabled;
452
+ }
453
+ /**
454
+ * Enables the debug mode of the AO, meaning the lastTime value will be updated.
455
+ */
456
+ enableDebugMode() {
457
+ this.debugMode = true;
458
+ }
459
+ /**
460
+ * Disables the debug mode of the AO, meaning the lastTime value will not be updated.
461
+ */
462
+ disableDebugMode() {
463
+ this.debugMode = false;
464
+ }
465
+ /**
466
+ * Sets the display mode of the AO
467
+ * @param {"Combined" | "AO" | "No AO" | "Split" | "Split AO"} mode - The display mode.
468
+ */
469
+ setDisplayMode(mode) {
470
+ this.configuration.renderMode = ["Combined", "AO", "No AO", "Split", "Split AO"].indexOf(mode);
471
+ }
472
+ /**
473
+ *
474
+ * @param {"Performance" | "Low" | "Medium" | "High" | "Ultra"} mode
475
+ */
476
+ setQualityMode(mode) {
477
+ if (mode === "Performance") {
478
+ this.configuration.aoSamples = 8;
479
+ this.configuration.denoiseSamples = 4;
480
+ this.configuration.denoiseRadius = 12;
481
+ } else if (mode === "Low") {
482
+ this.configuration.aoSamples = 16;
483
+ this.configuration.denoiseSamples = 4;
484
+ this.configuration.denoiseRadius = 12;
485
+ } else if (mode === "Medium") {
486
+ this.configuration.aoSamples = 16;
487
+ this.configuration.denoiseSamples = 8;
488
+ this.configuration.denoiseRadius = 12;
489
+ } else if (mode === "High") {
490
+ this.configuration.aoSamples = 64;
491
+ this.configuration.denoiseSamples = 8;
492
+ this.configuration.denoiseRadius = 6;
493
+ } else if (mode === "Ultra") {
494
+ this.configuration.aoSamples = 64;
495
+ this.configuration.denoiseSamples = 16;
496
+ this.configuration.denoiseRadius = 6;
497
+ }
498
+ }
499
+ }
500
+ exports.N8AOPostPass = N8AOPostPass;
501
+ //# sourceMappingURL=N8AOPostPass.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"N8AOPostPass.cjs","sources":["../../../src/effects/N8AO/N8AOPostPass.js"],"sourcesContent":["import * as THREE from 'three'\nimport { Pass } from 'postprocessing'\nimport { Buffer } from 'buffer'\nimport { FullScreenTriangle } from './FullScreenTriangle'\nimport { EffectShader } from './EffectShader'\nimport { EffectCompositer } from './EffectCompositer'\nimport { PoissionBlur } from './PoissionBlur'\nimport { DepthDownSample } from './DepthDownSample'\nimport BlueNoise from './BlueNoise'\n\nconst bluenoiseBits = Buffer.from(BlueNoise, 'base64')\n\n/**\n *\n * @param {*} timerQuery\n * @param {THREE.WebGLRenderer} gl\n * @param {N8AOPass} pass\n */\nfunction checkTimerQuery(timerQuery, gl, pass) {\n const available = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT_AVAILABLE)\n if (available) {\n const elapsedTimeInNs = gl.getQueryParameter(timerQuery, gl.QUERY_RESULT)\n const elapsedTimeInMs = elapsedTimeInNs / 1000000\n pass.lastTime = elapsedTimeInMs\n } else {\n // If the result is not available yet, check again after a delay\n setTimeout(() => {\n checkTimerQuery(timerQuery, gl, pass)\n }, 1)\n }\n}\nclass N8AOPostPass extends Pass {\n /**\n *\n * @param {THREE.Scene} scene\n * @param {THREE.Camera} camera\n * @param {number} width\n * @param {number} height\n *\n * @property {THREE.Scene} scene\n * @property {THREE.Camera} camera\n * @property {number} width\n * @property {number} height\n */\n constructor(scene, camera, width = 512, height = 512) {\n super()\n this.width = width\n this.height = height\n\n this.clear = true\n\n this.camera = camera\n this.scene = scene\n /**\n * @type {Proxy & {\n * aoSamples: number,\n * aoRadius: number,\n * denoiseSamples: number,\n * denoiseRadius: number,\n * distanceFalloff: number,\n * intensity: number,\n * denoiseIterations: number,\n * renderMode: 0 | 1 | 2 | 3 | 4,\n * color: THREE.Color,\n * gammaCorrection: boolean,\n * logarithmicDepthBuffer: boolean\n * screenSpaceRadius: boolean,\n * halfRes: boolean,\n * depthAwareUpsampling: boolean\n * colorMultiply: boolean\n * }\n */\n this.autosetGamma = true\n this.configuration = new Proxy(\n {\n aoSamples: 16,\n aoRadius: 5.0,\n denoiseSamples: 8,\n denoiseRadius: 12,\n distanceFalloff: 1.0,\n intensity: 5,\n denoiseIterations: 2.0,\n renderMode: 0,\n color: new THREE.Color(0, 0, 0),\n gammaCorrection: true,\n logarithmicDepthBuffer: false,\n screenSpaceRadius: false,\n halfRes: false,\n depthAwareUpsampling: true,\n colorMultiply: true,\n },\n {\n set: (target, propName, value) => {\n const oldProp = target[propName]\n target[propName] = value\n if (propName === 'aoSamples' && oldProp !== value) {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer)\n }\n if (propName === 'denoiseSamples' && oldProp !== value) {\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer)\n }\n if (propName === 'halfRes' && oldProp !== value) {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer)\n this.configureHalfResTargets()\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer)\n this.setSize(this.width, this.height)\n }\n if (propName === 'depthAwareUpsampling' && oldProp !== value) {\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer)\n }\n if (propName === 'gammaCorrection') {\n this.autosetGamma = false\n }\n return true\n },\n }\n )\n /** @type {THREE.Vector3[]} */\n this.samples = []\n /** @type {number[]} */\n this.samplesR = []\n /** @type {THREE.Vector2[]} */\n this.samplesDenoise = []\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer)\n this.configureSampleDependentPasses()\n this.configureHalfResTargets()\n // this.effectCompisterQuad = new FullScreenTriangle(new THREE.ShaderMaterial(EffectCompositer));\n this.copyQuad = new FullScreenTriangle(\n new THREE.ShaderMaterial({\n uniforms: {\n tDiffuse: {\n value: null,\n },\n },\n depthWrite: false,\n vertexShader: `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = vec4(position, 1);\n }\n `,\n fragmentShader: `\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n void main() {\n gl_FragColor = texture2D(tDiffuse, vUv);\n }\n `,\n })\n )\n this.writeTargetInternal = new THREE.WebGLRenderTarget(this.width, this.height, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n depthBuffer: false,\n })\n this.readTargetInternal = new THREE.WebGLRenderTarget(this.width, this.height, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n depthBuffer: false,\n })\n this.outputTargetInternal = new THREE.WebGLRenderTarget(this.width, this.height, {\n minFilter: THREE.LinearFilter,\n magFilter: THREE.LinearFilter,\n depthBuffer: false,\n })\n\n /** @type {THREE.DataTexture} */\n this.bluenoise = //bluenoise;\n new THREE.DataTexture(bluenoiseBits, 128, 128)\n this.bluenoise.colorSpace = THREE.NoColorSpace\n this.bluenoise.wrapS = THREE.RepeatWrapping\n this.bluenoise.wrapT = THREE.RepeatWrapping\n this.bluenoise.minFilter = THREE.NearestFilter\n this.bluenoise.magFilter = THREE.NearestFilter\n this.bluenoise.needsUpdate = true\n this.lastTime = 0\n this.needsDepthTexture = true\n this.needsSwap = true\n this._r = new THREE.Vector2()\n this._c = new THREE.Color()\n }\n configureHalfResTargets() {\n if (this.configuration.halfRes) {\n this.depthDownsampleTarget =\n /*new THREE.WebGLRenderTarget(this.width / 2, this.height / 2, {\n minFilter: THREE.NearestFilter,\n magFilter: THREE.NearestFilter,\n depthBuffer: false,\n format: THREE.RedFormat,\n type: THREE.FloatType\n });*/\n new THREE.WebGLMultipleRenderTargets(this.width / 2, this.height / 2, 2)\n this.depthDownsampleTarget.texture[0].format = THREE.RedFormat\n this.depthDownsampleTarget.texture[0].type = THREE.FloatType\n this.depthDownsampleTarget.texture[0].minFilter = THREE.NearestFilter\n this.depthDownsampleTarget.texture[0].magFilter = THREE.NearestFilter\n this.depthDownsampleTarget.texture[0].depthBuffer = false\n this.depthDownsampleTarget.texture[1].format = THREE.RGBAFormat\n this.depthDownsampleTarget.texture[1].type = THREE.HalfFloatType\n this.depthDownsampleTarget.texture[1].minFilter = THREE.NearestFilter\n this.depthDownsampleTarget.texture[1].magFilter = THREE.NearestFilter\n this.depthDownsampleTarget.texture[1].depthBuffer = false\n\n this.depthDownsampleQuad = new FullScreenTriangle(new THREE.ShaderMaterial(DepthDownSample))\n } else {\n if (this.depthDownsampleTarget) {\n this.depthDownsampleTarget.dispose()\n this.depthDownsampleTarget = null\n }\n if (this.depthDownsampleQuad) {\n this.depthDownsampleQuad.dispose()\n this.depthDownsampleQuad = null\n }\n }\n }\n configureSampleDependentPasses() {\n this.configureAOPass(this.configuration.logarithmicDepthBuffer)\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer)\n }\n configureAOPass(logarithmicDepthBuffer = false) {\n this.samples = this.generateHemisphereSamples(this.configuration.aoSamples)\n this.samplesR = this.generateHemisphereSamplesR(this.configuration.aoSamples)\n const e = { ...EffectShader }\n e.fragmentShader = e.fragmentShader\n .replace('16', this.configuration.aoSamples)\n .replace('16.0', this.configuration.aoSamples + '.0')\n if (logarithmicDepthBuffer) {\n e.fragmentShader = '#define LOGDEPTH\\n' + e.fragmentShader\n }\n if (this.configuration.halfRes) {\n e.fragmentShader = '#define HALFRES\\n' + e.fragmentShader\n }\n if (this.effectShaderQuad) {\n this.effectShaderQuad.material.dispose()\n this.effectShaderQuad.material = new THREE.ShaderMaterial(e)\n } else {\n this.effectShaderQuad = new FullScreenTriangle(new THREE.ShaderMaterial(e))\n }\n }\n configureDenoisePass(logarithmicDepthBuffer = false) {\n this.samplesDenoise = this.generateDenoiseSamples(this.configuration.denoiseSamples, 11)\n const p = { ...PoissionBlur }\n p.fragmentShader = p.fragmentShader.replace('16', this.configuration.denoiseSamples)\n if (logarithmicDepthBuffer) {\n p.fragmentShader = '#define LOGDEPTH\\n' + p.fragmentShader\n }\n if (this.poissonBlurQuad) {\n this.poissonBlurQuad.material.dispose()\n this.poissonBlurQuad.material = new THREE.ShaderMaterial(p)\n } else {\n this.poissonBlurQuad = new FullScreenTriangle(new THREE.ShaderMaterial(p))\n }\n }\n configureEffectCompositer(logarithmicDepthBuffer = false) {\n const e = { ...EffectCompositer }\n if (logarithmicDepthBuffer) {\n e.fragmentShader = '#define LOGDEPTH\\n' + e.fragmentShader\n }\n if (this.configuration.halfRes && this.configuration.depthAwareUpsampling) {\n e.fragmentShader = '#define HALFRES\\n' + e.fragmentShader\n }\n if (this.effectCompositerQuad) {\n this.effectCompositerQuad.material.dispose()\n this.effectCompositerQuad.material = new THREE.ShaderMaterial(e)\n } else {\n this.effectCompositerQuad = new FullScreenTriangle(new THREE.ShaderMaterial(e))\n }\n }\n /**\n *\n * @param {Number} n\n * @returns {THREE.Vector3[]}\n */\n generateHemisphereSamples(n) {\n const points = []\n for (let k = 0; k < n; k++) {\n const theta = 2.399963 * k\n const r = Math.sqrt(k + 0.5) / Math.sqrt(n)\n const x = r * Math.cos(theta)\n const y = r * Math.sin(theta)\n // Project to hemisphere\n const z = Math.sqrt(1 - (x * x + y * y))\n points.push(new THREE.Vector3(x, y, z))\n }\n return points\n }\n /**\n *\n * @param {number} n\n * @returns {number[]}\n */\n generateHemisphereSamplesR(n) {\n let samplesR = []\n for (let i = 0; i < n; i++) {\n samplesR.push((i + 1) / n)\n }\n return samplesR\n }\n /**\n *\n * @param {number} numSamples\n * @param {number} numRings\n * @returns {THREE.Vector2[]}\n */\n generateDenoiseSamples(numSamples, numRings) {\n const angleStep = (2 * Math.PI * numRings) / numSamples\n const invNumSamples = 1.0 / numSamples\n const radiusStep = invNumSamples\n const samples = []\n let radius = invNumSamples\n let angle = 0\n for (let i = 0; i < numSamples; i++) {\n samples.push(new THREE.Vector2(Math.cos(angle), Math.sin(angle)).multiplyScalar(Math.pow(radius, 0.75)))\n radius += radiusStep\n angle += angleStep\n }\n return samples\n }\n setSize(width, height) {\n this.width = width\n this.height = height\n const c = this.configuration.halfRes ? 0.5 : 1\n this.writeTargetInternal.setSize(width * c, height * c)\n this.readTargetInternal.setSize(width * c, height * c)\n if (this.configuration.halfRes) {\n this.depthDownsampleTarget.setSize(width * c, height * c)\n }\n this.outputTargetInternal.setSize(width, height)\n }\n setDepthTexture(depthTexture) {\n this.depthTexture = depthTexture\n }\n render(renderer, inputBuffer, outputBuffer) {\n const xrEnabled = renderer.xr.enabled\n renderer.xr.enabled = false\n\n // Copy inputBuffer to outputBuffer\n //renderer.setRenderTarget(outputBuffer);\n // this.copyQuad.material.uniforms.tDiffuse.value = inputBuffer.texture;\n // this.copyQuad.render(renderer);\n\n if (renderer.capabilities.logarithmicDepthBuffer !== this.configuration.logarithmicDepthBuffer) {\n this.configuration.logarithmicDepthBuffer = renderer.capabilities.logarithmicDepthBuffer\n this.configureAOPass(this.configuration.logarithmicDepthBuffer)\n this.configureDenoisePass(this.configuration.logarithmicDepthBuffer)\n this.configureEffectCompositer(this.configuration.logarithmicDepthBuffer)\n }\n if (inputBuffer.texture.type !== this.outputTargetInternal.texture.type) {\n this.outputTargetInternal.texture.type = inputBuffer.texture.type\n this.outputTargetInternal.texture.needsUpdate = true\n }\n let gl\n let ext\n let timerQuery\n if (this.debugMode) {\n gl = renderer.getContext()\n ext = gl.getExtension('EXT_disjoint_timer_query_webgl2')\n if (ext === null) {\n console.error('EXT_disjoint_timer_query_webgl2 not available, disabling debug mode.')\n this.debugMode = false\n }\n }\n if (this.debugMode) {\n timerQuery = gl.createQuery()\n gl.beginQuery(ext.TIME_ELAPSED_EXT, timerQuery)\n }\n this.camera.updateMatrixWorld()\n this._r.set(this.width, this.height)\n let trueRadius = this.configuration.aoRadius\n if (this.configuration.halfRes && this.configuration.screenSpaceRadius) {\n trueRadius *= 0.5\n }\n if (this.configuration.halfRes) {\n renderer.setRenderTarget(this.depthDownsampleTarget)\n this.depthDownsampleQuad.material.uniforms.sceneDepth.value = this.depthTexture\n this.depthDownsampleQuad.material.uniforms.resolution.value = this._r\n this.depthDownsampleQuad.material.uniforms['near'].value = this.camera.near\n this.depthDownsampleQuad.material.uniforms['far'].value = this.camera.far\n this.depthDownsampleQuad.material.uniforms['projectionMatrixInv'].value = this.camera.projectionMatrixInverse\n this.depthDownsampleQuad.material.uniforms['viewMatrixInv'].value = this.camera.matrixWorld\n this.depthDownsampleQuad.material.uniforms['logDepth'].value = this.configuration.logarithmicDepthBuffer\n this.depthDownsampleQuad.render(renderer)\n }\n this.effectShaderQuad.material.uniforms['sceneDiffuse'].value = inputBuffer.texture\n this.effectShaderQuad.material.uniforms['sceneDepth'].value = this.configuration.halfRes\n ? this.depthDownsampleTarget.texture[0]\n : this.depthTexture\n this.effectShaderQuad.material.uniforms['sceneNormal'].value = this.configuration.halfRes\n ? this.depthDownsampleTarget.texture[1]\n : null\n this.effectShaderQuad.material.uniforms['projMat'].value = this.camera.projectionMatrix\n this.effectShaderQuad.material.uniforms['viewMat'].value = this.camera.matrixWorldInverse\n this.effectShaderQuad.material.uniforms['projViewMat'].value = this.camera.projectionMatrix\n .clone()\n .multiply(this.camera.matrixWorldInverse.clone())\n this.effectShaderQuad.material.uniforms['projectionMatrixInv'].value = this.camera.projectionMatrixInverse\n this.effectShaderQuad.material.uniforms['viewMatrixInv'].value = this.camera.matrixWorld\n this.effectShaderQuad.material.uniforms['cameraPos'].value = this.camera.getWorldPosition(new THREE.Vector3())\n this.effectShaderQuad.material.uniforms['resolution'].value = this.configuration.halfRes\n ? this._r\n .clone()\n .multiplyScalar(1 / 2)\n .floor()\n : this._r\n this.effectShaderQuad.material.uniforms['time'].value = performance.now() / 1000\n this.effectShaderQuad.material.uniforms['samples'].value = this.samples\n this.effectShaderQuad.material.uniforms['samplesR'].value = this.samplesR\n this.effectShaderQuad.material.uniforms['bluenoise'].value = this.bluenoise\n this.effectShaderQuad.material.uniforms['radius'].value = trueRadius\n this.effectShaderQuad.material.uniforms['distanceFalloff'].value = this.configuration.distanceFalloff\n this.effectShaderQuad.material.uniforms['near'].value = this.camera.near\n this.effectShaderQuad.material.uniforms['far'].value = this.camera.far\n this.effectShaderQuad.material.uniforms['logDepth'].value = renderer.capabilities.logarithmicDepthBuffer\n this.effectShaderQuad.material.uniforms['ortho'].value = this.camera.isOrthographicCamera\n this.effectShaderQuad.material.uniforms['screenSpaceRadius'].value = this.configuration.screenSpaceRadius\n // Start the AO\n renderer.setRenderTarget(this.writeTargetInternal)\n this.effectShaderQuad.render(renderer)\n // End the AO\n // Start the blur\n for (let i = 0; i < this.configuration.denoiseIterations; i++) {\n ;[this.writeTargetInternal, this.readTargetInternal] = [this.readTargetInternal, this.writeTargetInternal]\n this.poissonBlurQuad.material.uniforms['tDiffuse'].value = this.readTargetInternal.texture\n this.poissonBlurQuad.material.uniforms['sceneDepth'].value = this.configuration.halfRes\n ? this.depthDownsampleTarget.texture[0]\n : this.depthTexture\n this.poissonBlurQuad.material.uniforms['projMat'].value = this.camera.projectionMatrix\n this.poissonBlurQuad.material.uniforms['viewMat'].value = this.camera.matrixWorldInverse\n this.poissonBlurQuad.material.uniforms['projectionMatrixInv'].value = this.camera.projectionMatrixInverse\n this.poissonBlurQuad.material.uniforms['viewMatrixInv'].value = this.camera.matrixWorld\n this.poissonBlurQuad.material.uniforms['cameraPos'].value = this.camera.getWorldPosition(new THREE.Vector3())\n this.poissonBlurQuad.material.uniforms['resolution'].value = this.configuration.halfRes\n ? this._r\n .clone()\n .multiplyScalar(1 / 2)\n .floor()\n : this._r\n this.poissonBlurQuad.material.uniforms['time'].value = performance.now() / 1000\n this.poissonBlurQuad.material.uniforms['blueNoise'].value = this.bluenoise\n this.poissonBlurQuad.material.uniforms['radius'].value =\n this.configuration.denoiseRadius * (this.configuration.halfRes ? 1 / 2 : 1)\n this.poissonBlurQuad.material.uniforms['worldRadius'].value = trueRadius\n this.poissonBlurQuad.material.uniforms['distanceFalloff'].value = this.configuration.distanceFalloff\n this.poissonBlurQuad.material.uniforms['index'].value = i\n this.poissonBlurQuad.material.uniforms['poissonDisk'].value = this.samplesDenoise\n this.poissonBlurQuad.material.uniforms['near'].value = this.camera.near\n this.poissonBlurQuad.material.uniforms['far'].value = this.camera.far\n this.poissonBlurQuad.material.uniforms['logDepth'].value = renderer.capabilities.logarithmicDepthBuffer\n this.poissonBlurQuad.material.uniforms['screenSpaceRadius'].value = this.configuration.screenSpaceRadius\n renderer.setRenderTarget(this.writeTargetInternal)\n this.poissonBlurQuad.render(renderer)\n }\n // Now, we have the blurred AO in writeTargetInternal\n // End the blur\n // Start the composition\n this.effectCompositerQuad.material.uniforms['sceneDiffuse'].value = inputBuffer.texture\n this.effectCompositerQuad.material.uniforms['sceneDepth'].value = this.depthTexture\n this.effectCompositerQuad.material.uniforms['near'].value = this.camera.near\n this.effectCompositerQuad.material.uniforms['far'].value = this.camera.far\n this.effectCompositerQuad.material.uniforms['projectionMatrixInv'].value = this.camera.projectionMatrixInverse\n this.effectCompositerQuad.material.uniforms['viewMatrixInv'].value = this.camera.matrixWorld\n this.effectCompositerQuad.material.uniforms['logDepth'].value = renderer.capabilities.logarithmicDepthBuffer\n this.effectCompositerQuad.material.uniforms['ortho'].value = this.camera.isOrthographicCamera\n this.effectCompositerQuad.material.uniforms['downsampledDepth'].value = this.configuration.halfRes\n ? this.depthDownsampleTarget.texture[0]\n : this.depthTexture\n this.effectCompositerQuad.material.uniforms['resolution'].value = this._r\n this.effectCompositerQuad.material.uniforms['blueNoise'].value = this.bluenoise\n this.effectCompositerQuad.material.uniforms['intensity'].value = this.configuration.intensity\n this.effectCompositerQuad.material.uniforms['renderMode'].value = this.configuration.renderMode\n this.effectCompositerQuad.material.uniforms['screenSpaceRadius'].value = this.configuration.screenSpaceRadius\n this.effectCompositerQuad.material.uniforms['radius'].value = trueRadius\n this.effectCompositerQuad.material.uniforms['distanceFalloff'].value = this.configuration.distanceFalloff\n this.effectCompositerQuad.material.uniforms['gammaCorrection'].value = this.autosetGamma\n ? this.renderToScreen\n : this.configuration.gammaCorrection\n this.effectCompositerQuad.material.uniforms['tDiffuse'].value = this.writeTargetInternal.texture\n this.effectCompositerQuad.material.uniforms['color'].value = this._c\n .copy(this.configuration.color)\n .convertSRGBToLinear()\n this.effectCompositerQuad.material.uniforms['colorMultiply'].value = this.configuration.colorMultiply\n this.effectCompositerQuad.material.uniforms['cameraPos'].value = this.camera.getWorldPosition(new THREE.Vector3())\n this.effectCompositerQuad.material.uniforms['fog'].value = !!this.scene.fog\n if (this.scene.fog) {\n if (this.scene.fog.isFog) {\n this.effectCompositerQuad.material.uniforms['fogExp'].value = false\n this.effectCompositerQuad.material.uniforms['fogNear'].value = this.scene.fog.near\n this.effectCompositerQuad.material.uniforms['fogFar'].value = this.scene.fog.far\n } else if (this.scene.fog.isFogExp2) {\n this.effectCompositerQuad.material.uniforms['fogExp'].value = true\n this.effectCompositerQuad.material.uniforms['fogDensity'].value = this.scene.fog.density\n } else {\n console.error(`Unsupported fog type ${this.scene.fog.constructor.name} in SSAOPass.`)\n }\n }\n renderer.setRenderTarget(\n /* this.renderToScreen ? null :\n outputBuffer*/\n this.outputTargetInternal\n )\n this.effectCompositerQuad.render(renderer)\n renderer.setRenderTarget(this.renderToScreen ? null : outputBuffer)\n this.copyQuad.material.uniforms['tDiffuse'].value = this.outputTargetInternal.texture\n this.copyQuad.render(renderer)\n if (this.debugMode) {\n gl.endQuery(ext.TIME_ELAPSED_EXT)\n checkTimerQuery(timerQuery, gl, this)\n }\n\n renderer.xr.enabled = xrEnabled\n }\n /**\n * Enables the debug mode of the AO, meaning the lastTime value will be updated.\n */\n enableDebugMode() {\n this.debugMode = true\n }\n /**\n * Disables the debug mode of the AO, meaning the lastTime value will not be updated.\n */\n disableDebugMode() {\n this.debugMode = false\n }\n /**\n * Sets the display mode of the AO\n * @param {\"Combined\" | \"AO\" | \"No AO\" | \"Split\" | \"Split AO\"} mode - The display mode.\n */\n setDisplayMode(mode) {\n this.configuration.renderMode = ['Combined', 'AO', 'No AO', 'Split', 'Split AO'].indexOf(mode)\n }\n /**\n *\n * @param {\"Performance\" | \"Low\" | \"Medium\" | \"High\" | \"Ultra\"} mode\n */\n setQualityMode(mode) {\n if (mode === 'Performance') {\n this.configuration.aoSamples = 8\n this.configuration.denoiseSamples = 4\n this.configuration.denoiseRadius = 12\n } else if (mode === 'Low') {\n this.configuration.aoSamples = 16\n this.configuration.denoiseSamples = 4\n this.configuration.denoiseRadius = 12\n } else if (mode === 'Medium') {\n this.configuration.aoSamples = 16\n this.configuration.denoiseSamples = 8\n this.configuration.denoiseRadius = 12\n } else if (mode === 'High') {\n this.configuration.aoSamples = 64\n this.configuration.denoiseSamples = 8\n this.configuration.denoiseRadius = 6\n } else if (mode === 'Ultra') {\n this.configuration.aoSamples = 64\n this.configuration.denoiseSamples = 16\n this.configuration.denoiseRadius = 6\n }\n }\n}\nexport { N8AOPostPass }\n"],"names":["Buffer","Pass","THREE","FullScreenTriangle","DepthDownSample","EffectShader","PoissionBlur","EffectCompositer"],"mappings":"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"}