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