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