@react-three/postprocessing 2.15.5 → 2.15.7

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