@meimu/mutracer 0.2.0 → 0.3.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 (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WebGLAov} from './WebGLAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport type { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport type {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\nconst wavelengths = [650, 510, 475];\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let batchSamples = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n const aov=new WebGLAov(renderer);\n let aovCamera: Camera | undefined;\n let displayTrace: string[] | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive wavelength enables stochastic hero-wavelength sampling\n // in the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setWavelength(wavelengths[0]);\n rayTracePass.createPass(clear, tile);\n } else {\n wavelengths.forEach((wavelength, index) => {\n rayTracePass.setWavelength(wavelength);\n rayTracePass.createPass(clear && index === 0, tile, index > 0);\n });\n }\n } else {\n rayTracePass.setWavelength(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n presentationTexture = copy.copy(aov.visualize(aovKind,aovDisplayOptions), renderWidth, renderHeight, presentationTexture);\n presentationDenoised = false;\n return;\n }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n displayTrace?.push('Compose:DisplayEncoded');\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n }, displayTrace);\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind,aovDisplayOptions);\n } else if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n if (!renderer.isAllProgramCompiled()) {\n isFirstFrame = true;\n sampleCount = 0;\n tileRender.reset();\n return true;\n }\n\n rayTracePass.setCamera(camera);\n aovCamera=camera;\n if (!rayTracePass.preparePrograms()) return true;\n const resetAccumulation = isFirstFrame;\n if(resetAccumulation) aov.reset();\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov,camera,renderWidth,renderHeight,execution.aovs)) return true;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !batchSamples ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if(sampleCount!==frameSampleCount){\n if(execution?.aovs?.length) rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n if(settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16)<1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // A reduced preview set can retire the previously displayed AOV before\n // Display applies its next channel after tracing.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if(previousMask && !nextMask){aov.dispose();aov.history.clear();aov.width=aov.height=0;aov.reset();}\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n aov.reset();\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n setSize(input.width, input.height);\n denoiseValid = false; pendingDenoiser = undefined;\n const texture = (data: Float32Array) => {\n const t = new Texture2D({width: input.width, height: input.height,\n source: {data, width: input.width, height: input.height}, type: constants.FLOAT,\n minFilter: constants.NEAREST, magFilter: constants.NEAREST});\n return t;\n };\n const shadow = Float32Array.from({length: input.width * input.height * 4}, (_, i) =>\n i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);\n const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);\n const inputs = {color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),\n moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),\n shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments)};\n rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher; isFirstFrame = false;\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n };\n },\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n rayTracePass.setCamera(camera); aovCamera = camera;\n return rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,samples,execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n },\n async readAov(kind) {\n if(!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount<1 && aov.samples<1)) throw new Error('AOV output is not ready');\n rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov,aovCamera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset)) {\n if (disposed || renderer.gl.isContextLost()) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n aov.dispose();\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
1
+ {"version":3,"file":"WebGLRenderingPipeline.js","sourceRoot":"","sources":["../../src/renderer/WebGLRenderingPipeline.ts"],"names":[],"mappings":"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","sourcesContent":["import type {DisplayParityAccumulation, DisplayParityTarget} from './displayParityDiagnostics.js';\nimport {displayAovKind, DEFAULT_AOV_DISPLAY, type AovDisplayOptions} from './aovDisplay.js';\nimport {WebGLAov} from './WebGLAov.js';\nimport {aovMask} from './aov.js';\nimport {scheduleFrame} from '../util/frame.js';\nimport type {DenoiserHandle} from './denoiser.js';\nimport { WebGLScratchCopy } from './WebGLScratchCopy.js';\nimport { ScratchPool } from './ScratchPool.js';\nimport { makeRenderPipeline, type TraceSettings, type RenderPipeline } from './renderPipeline.js';\nimport type { TargetPipeline } from './accumulationTarget.js';\nimport { readRgbaPixels } from './WebGLReadback.js';\n// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport Camera from '../scene/Camera.js';\nimport type { ColorRGB } from '../types.js';\nimport { vec3 } from '../math.js';\nimport halton from './halton.js';\nimport { makeTileRender } from './TileRender.js';\nimport type {\n DisplayChannel,\n ToneMappingParams\n} from './RenderingPipeline.js';\nimport { constants, WebGLDevice, Texture2D } from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport WebGLRayTracePass from './WebGLRayTracePass.js';\nimport { WebGLRayTraceOutputPass } from './WebGLRayTraceOutputPass.js';\nimport WebGLBloomPass from './WebGLBloomPass.js';\nimport {\n composeFragment,\n outputFragment\n} from './glsl/webglPipeline.frag.js';\nimport { type JNLMDenoiser } from './jnlm.js';\nimport { WebGLJNLMDenoisePass } from './WebGLJNLMDenoiser.js';\n\n\n/**\n * WebGL 2.0 counterpart of WGPURenderingPipeline.\n *\n * The frame is encoded as a fixed pass sequence. Each pass owns explicit\n * textures/FBOs, so no compositor graph or node lifecycle participates here.\n */\nfunction makeWebGLAccumulationTarget(renderer: WebGLDevice, rayTracePass: WebGLRayTracePass, scratch: ScratchPool) {\n let sampleRenderedCallback = (\n _sampleCount: number,\n _isFirstFrame: boolean,\n _frameTime: number\n ) => { };\n let batchSamples = false;\n let offlineSamplesPerBatch = 0;\n let deferPostProcess = false;\n let sampleSequenceOffset = 0;\n const aov=new WebGLAov(renderer);\n let aovCamera: Camera | undefined;\n let displayTrace: string[] | undefined;\n let sampleCount = 0;\n let elapsedFrameTime = 32;\n let elapsedTileTime: number | undefined;\n let tileTimingGeneration = 0;\n let isFirstFrame = true;\n let renderFailed = false;\n let disposed = false;\n let renderWidth = 1;\n let renderHeight = 1;\n let screenWidth = 1;\n let screenHeight = 1;\n\n const targetKey = {};\n let execution: TraceSettings | undefined;\n\n let resolvedSamples = 0;\n let resolvedHasShadowCatcher = false;\n let presentationTexture: Texture2D | undefined;\n let presentationDenoised = false;\n\n let maxTimePerTile = 21;\n\n let bloomIntensity = 0;\n let bloomThreshold = 1;\n let bloomRadius = 0.6;\n let exposure = 1;\n let toneMappingMode = 0;\n let contrast = 1;\n let saturation = 1;\n let temperature = 0;\n let tint = 0;\n let vignette = 0;\n let output: DisplayChannel = 'final';\n let aovDisplayOptions: AovDisplayOptions = DEFAULT_AOV_DISPLAY;\n let pageLeaveTime = performance.now();\n let pageInvisibleTime = 0;\n const shadowCatcherColor = vec3.create();\n let shadowCatcherAlpha = 1;\n\n // Preview frames have a different resolution, bounce limit, and timing\n // target. Keep their measurements out of the full-resolution estimator so\n // returning from preview does not split a 4K sample into hundreds of tiles.\n const tileRender = makeTileRender(renderer.gl);\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n\n const rayTraceOutputPass = new WebGLRayTraceOutputPass(renderer);\n let bloomPass: WebGLBloomPass | undefined;\n\n const composePass = scratch.get('composePass', () => new WebGLFullQuadPass<\n 'colorTex' | 'foregroundTex' | 'catcherBackgroundTex' | 'shadowCatcherTex' | 'bloomTex',\n 'color'\n >('compose', renderer, {\n shader: composeFragment,\n outputs: ['color'],\n outputParams: { color: { type: constants.UNSIGNED_BYTE } }\n }));\n composePass.setUniforms({\n exposure,\n shadowCatcherColor,\n shadowCatcherAlpha,\n shadowCatcherEnabled: 0,\n bloomIntensity: 0,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette,\n outputMode: 0,\n sRGBOutput: 1\n });\n\n const outputPass = scratch.get('outputPass', () => new WebGLFullQuadPass<\n 'colorTex' | 'colorDenoisedTex',\n 'color'\n >('output', renderer, { shader: outputFragment, outputs: ['color'] }));\n outputPass.setRenderToScreen();\n const copy = scratch.get('image copy', () => new WebGLScratchCopy(renderer));\n const rawReadFrameBuffer = copy.readFrameBuffer;\n\n // Built-in JNLM denoising. WebGL runs it synchronously inside the\n // post-process, between composition and output.\n let jnlmPass: WebGLJNLMDenoisePass | undefined;\n let pendingDenoiser: JNLMDenoiser | undefined;\n let denoisedTexture: Texture2D | undefined;\n let denoiseValid = false;\n // Keep the last denoised image visible while while-converging batches\n // accumulate (see RenderingPipeline.setPreserveDenoisedOutput).\n let preserveDenoisedOutput = false;\n\n function updateSeed(useJitter: boolean) {\n const sequenceSample = sampleCount + sampleSequenceOffset;\n const jitterX = useJitter ? halton(sequenceSample, 2) - 0.5 : 0;\n const jitterY = useJitter ? halton(sequenceSample, 3) - 0.5 : 0;\n rayTracePass.setJitter(jitterX / renderWidth, jitterY / renderHeight);\n }\n\n function traceSample(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number }\n ) {\n rayTracePass.setSampleCount(sampleCount + sampleSequenceOffset);\n rayTracePass.setSampleSequenceOffset(sampleSequenceOffset);\n updateSeed(true);\n if (rayTracePass.hasDispersion()) {\n if (execution?.dispersionWavelengths === 1) {\n // A positive channel enables stochastic hero-wavelength sampling in\n // the shader. Preview traces one random RGB channel per pixel.\n rayTracePass.setSpectralChannel(1);\n rayTracePass.createPass(clear, tile);\n } else {\n for (let channel = 1; channel <= 3; channel++) {\n rayTracePass.setSpectralChannel(channel);\n rayTracePass.createPass(clear && channel === 1, tile, channel > 1);\n }\n }\n } else {\n rayTracePass.setSpectralChannel(0);\n rayTracePass.createPass(clear, tile);\n }\n }\n\n function drawPostProcess(_forceNeedsDenoise = false, resolve = false) {\n if (resolve) { resolvedSamples = sampleCount; resolvedHasShadowCatcher = rayTracePass.hasShadowCatcher(); }\n const aovKind = displayAovKind(output);\n if (aovKind && sampleCount === 0) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n if (!aov.samples) return;\n presentationTexture = copy.copy(aov.visualize(aovKind,aovDisplayOptions), renderWidth, renderHeight, presentationTexture);\n presentationDenoised = false;\n return;\n }\n if (resolvedSamples === 0) return;\n if (resolve) {\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n\n composePass.setSize(renderWidth, renderHeight);\n composePass.setUniforms({ exposure, toneMappingMode, contrast, saturation, temperature, tint, vignette, shadowCatcherColor, shadowCatcherAlpha });\n const colorTexture = rayTraceOutputPass.getOutput('color');\n const bloomEnabled = bloomIntensity > 0;\n const samplesSkipped = sampleCount < 10 || sampleCount % 10 > 0;\n const bloomState = scratch.get('bloom state', () => ({ owner: undefined as object | undefined, settings: '', dispose() { } }));\n const bloomSettings = `${bloomThreshold}/${bloomRadius}`;\n const needsUpdateBloom = bloomEnabled && sampleCount >= 10 && (!samplesSkipped || bloomState.owner !== targetKey || bloomState.settings !== bloomSettings);\n let currentBloomIntensity = bloomIntensity;\n if (needsUpdateBloom) {\n bloomPass ||= scratch.get('bloom', () => new WebGLBloomPass(renderer));\n bloomPass.setSize(renderWidth, renderHeight);\n bloomState.owner = targetKey; bloomState.settings = bloomSettings;\n bloomPass.setBrightThreshold(bloomThreshold);\n bloomPass.setRadius(bloomRadius);\n displayTrace?.push('Bloom:SceneLinear');\n bloomPass.createPass(colorTexture);\n } else if (bloomEnabled && sampleCount < 10) {\n currentBloomIntensity = 0;\n }\n\n composePass.setUniforms({\n bloomIntensity: currentBloomIntensity,\n shadowCatcherEnabled: +resolvedHasShadowCatcher,\n outputMode: output === 'shadow' ? 1 : 0\n });\n displayTrace?.push('Compose:DisplayEncoded');\n composePass.createPass({\n colorTex: colorTexture,\n foregroundTex: rayTraceOutputPass.getOutput('foreground'),\n catcherBackgroundTex: rayTraceOutputPass.getOutput('catcherBackground'),\n shadowCatcherTex: rayTraceOutputPass.getOutput('shadowCatcher'),\n bloomTex:\n bloomEnabled && bloomPass\n ? bloomPass.getOutput()\n : renderer.emptyTexture\n });\n\n if (pendingDenoiser) {\n jnlmPass ??= scratch.get('jnlm', () => new WebGLJNLMDenoisePass(renderer));\n const filtered = jnlmPass.render({\n width: renderWidth,\n height: renderHeight,\n moments: rayTracePass.getOutput('moments'),\n catcherMoments: rayTracePass.hasShadowCatcher()\n ? rayTracePass.getOutput('catcherMoments')\n : undefined,\n color: composePass.getOutput('color'),\n albedo: rayTraceOutputPass.getOutput('albedo'),\n normal: rayTraceOutputPass.getOutput('normal'),\n shadowCatcher: rayTraceOutputPass.getOutput('shadowCatcher'),\n strength: pendingDenoiser.strength,\n shape: pendingDenoiser.shape\n }, displayTrace);\n denoisedTexture = copy.copy(filtered, renderWidth, renderHeight, denoisedTexture); denoiseValid = true;\n pendingDenoiser = undefined;\n }\n\n let displayTexture =\n (output === 'final' && denoiseValid && denoisedTexture) || composePass.getOutput('color');\n if (aovKind) {\n if (!execution?.aovs?.includes(aovKind)) throw new Error(`AOV ${aovKind} is not enabled`);\n displayTexture = aov.visualize(aovKind,aovDisplayOptions);\n } else if (output === 'normal' || output === 'albedo') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput(output);\n } else if (output === 'shadowCatcher') {\n displayTrace?.push('AOV:Raw');\n displayTexture = rayTraceOutputPass.getOutput('shadowCatcher');\n }\n presentationTexture = copy.copy(displayTexture, renderWidth, renderHeight, presentationTexture);\n presentationDenoised = output === 'final' && denoiseValid && !!denoisedTexture;\n\n }\n\n function startRecordFrameTime(collectTileTiming: boolean) {\n const start = performance.now();\n const generation = tileTimingGeneration;\n const timedTileRender = tileRender;\n scheduleFrame(() => {\n elapsedFrameTime = Math.max(\n performance.now() - start - pageInvisibleTime,\n pageInvisibleTime > 0 ? 16 : 8\n );\n pageInvisibleTime = 0;\n if (\n generation === tileTimingGeneration &&\n timedTileRender === tileRender && !isFirstFrame\n ) {\n elapsedTileTime = collectTileTiming && renderer.isAllProgramCompiled()\n ? elapsedFrameTime : undefined;\n }\n });\n }\n\n function trace(camera: Camera, maxSamples: number) {\n if (rayTracePass.isInvalid() || renderFailed) return false;\n // Waiting for a shader is not an input change; see the WebGPU pipeline.\n if (!renderer.isAllProgramCompiled()) return true;\n\n rayTracePass.setCamera(camera);\n aovCamera=camera;\n if (!rayTracePass.preparePrograms()) return true;\n const resetAccumulation = isFirstFrame;\n if(resetAccumulation) aov.reset();\n if (execution?.aovs?.length && !rayTracePass.prepareAovs(aov,camera,renderWidth,renderHeight,execution.aovs)) return true;\n if (resetAccumulation) {\n tileTimingGeneration++;\n elapsedTileTime = undefined;\n rayTracePass.setCamera(camera);\n tileRender.reset();\n sampleCount = 0;\n isFirstFrame = false;\n }\n if (sampleCount >= maxSamples) {\n drawPostProcess(true);\n return false;\n }\n // New samples make the denoised image stale.\n if (!preserveDenoisedOutput || resetAccumulation) denoiseValid = false;\n\n // The first draw after an update lazily prepares scene data and shaders.\n // Keep its wall time for reporting, but not for estimating tile throughput.\n startRecordFrameTime(!resetAccumulation);\n const frameSampleCount = sampleCount;\n let tile = tileRender.nextTile(elapsedTileTime);\n if (offlineSamplesPerBatch > 0 && tile.isFirstTile && tile.isLastTile) {\n tile.samplesPerFrame = offlineSamplesPerBatch;\n } else if (\n !batchSamples ||\n !(tile.isFirstTile && tile.isLastTile)\n ) {\n tile.samplesPerFrame = 1;\n }\n\n try {\n for (let i = 0;i < tile.samplesPerFrame && sampleCount < maxSamples;i++) {\n traceSample(sampleCount === 0 && tile.isFirstTile, {\n x: tile.x,\n y: tile.y,\n width: tile.tileWidth,\n height: tile.tileHeight\n });\n if (tile.isLastTile) sampleCount++;\n }\n if(sampleCount!==frameSampleCount){\n if(execution?.aovs?.length) rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n }\n if (sampleCount !== frameSampleCount && (!deferPostProcess || sampleCount >= maxSamples)) {\n drawPostProcess(sampleCount >= maxSamples, true);\n }\n } catch (error) {\n console.error(error);\n renderFailed = true;\n return false;\n }\n\n if (sampleCount !== frameSampleCount) {\n sampleRenderedCallback(\n sampleCount,\n frameSampleCount === 0,\n elapsedFrameTime\n );\n\n }\n return !renderer.isAllProgramCompiled();\n }\n\n function applyRenderResolution() {\n rayTracePass.useTarget(targetKey);\n const scale = 1;\n const nextWidth = Math.max(1, Math.round(screenWidth * scale));\n const nextHeight = Math.max(1, Math.round(screenHeight * scale));\n rayTracePass.setSize(nextWidth, nextHeight, screenWidth / screenHeight);\n if (nextWidth === renderWidth && nextHeight === renderHeight) return;\n renderWidth = nextWidth;\n renderHeight = nextHeight;\n tileRender.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n composePass.setSize(renderWidth, renderHeight);\n bloomPass?.setSize(renderWidth, renderHeight);\n sampleCount = 0;\n resolvedSamples = 0;\n isFirstFrame = true;\n\n }\n\n function setSize(width: number, height: number) {\n width = Math.max(1, width);\n height = Math.max(1, height);\n if (width === screenWidth && height === screenHeight) return;\n screenWidth = width;\n screenHeight = height;\n\n outputPass.setSize(screenWidth, screenHeight);\n applyRenderResolution();\n sampleCount = 0;\n isFirstFrame = true;\n }\n\n function onVisibilityChange() {\n if (document.hidden) pageLeaveTime = performance.now();\n else pageInvisibleTime = performance.now() - pageLeaveTime;\n }\n if (typeof document !== 'undefined') document.addEventListener('visibilitychange', onVisibilityChange);\n\n function activate() {\n rayTracePass.useTarget(targetKey);\n rayTracePass.setSize(renderWidth, renderHeight, screenWidth / screenHeight);\n if (execution) {\n rayTracePass.setQuality(execution);\n rayTracePass.setClamping(execution.clamping);\n rayTracePass.setTransmissiveOutputAlphaMin(execution.transmissiveOutputAlphaMin);\n rayTracePass.setBevelSamples(execution.bevelSamples);\n rayTracePass.setSamplingPattern(execution.samplingPattern, execution.maxSamples);\n }\n }\n\n return {\n invalidateDenoisedOutput() { pendingDenoiser = undefined; denoiseValid = false; preserveDenoisedOutput = false; },\n synchronizeBackground() { },\n configure(settings: TraceSettings) {\n if(settings.aovs?.length && (!Number.isInteger(settings.aovSamples ?? 16) || (settings.aovSamples ?? 16)<1)) throw new RangeError('aovSamples must be a positive integer');\n const previousMask = aovMask(execution?.aovs ?? []), nextMask = aovMask(settings.aovs ?? []);\n if (previousMask !== nextMask || execution?.aovSamples !== settings.aovSamples) aov.samples = 0;\n execution = { ...settings, aovs: [...(settings.aovs ?? [])] };\n // A reduced preview set can retire the previously displayed AOV before\n // Display applies its next channel after tracing.\n const displayedAov = displayAovKind(output);\n if (displayedAov && !settings.aovs?.includes(displayedAov)) output = 'final';\n if(previousMask && !nextMask){aov.dispose();aov.history.clear();aov.width=aov.height=0;aov.reset();}\n maxTimePerTile = Math.max(1, settings.timeBudgetMs);\n batchSamples = settings.batchSamples;\n tileRender.setDesiredMsPerTile(maxTimePerTile);\n tileRender.setMaxTiles(settings.maxTiles);\n },\n activate,\n canCompleteSampleWithin(timeBudgetMs: number) { return elapsedFrameTime <= timeBudgetMs; },\n getOutputTexture() { return undefined; },\n applyPostProcesses() {},\n get presentationComplete() { return !!presentationTexture; },\n get presentationDenoised() { return presentationDenoised; },\n present() {\n if (!presentationTexture) return;\n {\n\n outputPass.setSize(renderer.canvas.width, renderer.canvas.height);\n }\n outputPass.setUniform('denoisedPercent', 0);\n outputPass.createPass({ colorTex: presentationTexture, colorDenoisedTex: presentationTexture });\n },\n getMemory() {\n return {\n width: renderWidth, height: renderHeight,\n bytes: aov.bytes + rayTracePass.getTargetMemoryBytes(targetKey)\n + rayTraceOutputPass.getMemoryBytes() + (presentationTexture?.getMemoryBytes() ?? 0) + (denoisedTexture?.getMemoryBytes() ?? 0)\n };\n },\n isFirstFrame: () => isFirstFrame,\n restartSamples(_preserveTemporalHistory = false) {\n aov.reset();\n tileRender.reset();\n isFirstFrame = true;\n sampleCount = 0;\n denoiseValid = false;\n preserveDenoisedOutput = false;\n },\n /** Denoises the current image. WebGL only supports the built-in JNLM filter. */\n performDenoise(filter: DenoiserHandle): Promise<boolean> {\n if (filter.kind !== 'jnlm') {\n return Promise.reject(new Error('This denoiser requires WebGPU.'));\n }\n if (isFirstFrame || sampleCount < 1) return Promise.resolve(false);\n if (output !== 'final' && output !== 'shadow') return Promise.resolve(true);\n pendingDenoiser = filter.denoiser;\n drawPostProcess(true);\n return Promise.resolve(true);\n },\n cancelDenoise() {\n pendingDenoiser = undefined;\n },\n setPreserveDenoisedOutput(preserve: boolean) {\n preserveDenoisedOutput = preserve;\n },\n trace,\n drawPostProcess: () => drawPostProcess(true),\n setSize,\n setToneMappingParams(params: ToneMappingParams) {\n const nextExposure = params.exposure ?? 1;\n const nextToneMappingMode = {\n agx: 0,\n aces: 1,\n cineon: 2,\n reinhard: 3,\n linear: 4\n }[params.toneMapping ?? 'agx'] ?? 0;\n const nextContrast = params.contrast ?? 1;\n const nextSaturation = params.saturation ?? 1;\n const nextTemperature = params.temperature ?? 0;\n const nextTint = params.tint ?? 0;\n const nextVignette = params.vignette ?? 0;\n if (\n nextExposure === exposure &&\n nextToneMappingMode === toneMappingMode &&\n nextContrast === contrast &&\n nextSaturation === saturation &&\n nextTemperature === temperature &&\n nextTint === tint &&\n nextVignette === vignette\n ) return false;\n exposure = nextExposure;\n toneMappingMode = nextToneMappingMode;\n contrast = nextContrast;\n saturation = nextSaturation;\n temperature = nextTemperature;\n tint = nextTint;\n vignette = nextVignette;\n composePass.setUniforms({\n exposure,\n toneMappingMode,\n contrast,\n saturation,\n temperature,\n tint,\n vignette\n });\n return true;\n },\n setOfflineRenderOptions(options) {\n offlineSamplesPerBatch = Math.max(0, Math.round(options.samplesPerBatch));\n deferPostProcess = options.deferPostProcess;\n sampleSequenceOffset = Math.max(\n 0,\n Math.round(options.sampleSequenceOffset)\n );\n },\n setVarianceMoments(_enabled: boolean) { },\n setAdaptiveSamplingTargets(_targets) { },\n async prepareOfflineAdaptiveSampling(_options) {\n return undefined;\n },\n getTotalSamplesRendered: () => sampleCount,\n /** @internal */\n _displayParity() {\n return {\n record(trace?: string[]) { displayTrace = trace; },\n load(input: DisplayParityAccumulation) {\n setSize(input.width, input.height);\n denoiseValid = false; pendingDenoiser = undefined;\n const texture = (data: Float32Array) => {\n const t = new Texture2D({width: input.width, height: input.height,\n source: {data, width: input.width, height: input.height}, type: constants.FLOAT,\n minFilter: constants.NEAREST, magFilter: constants.NEAREST});\n return t;\n };\n const shadow = Float32Array.from({length: input.width * input.height * 4}, (_, i) =>\n i % 4 === 3 ? input.moments[Math.floor(i / 4) * 4 + 2] : input.shadow[Math.floor(i / 4) * 8 + i % 4]);\n const background = Float32Array.from(shadow, (_, i) => input.shadow[Math.floor(i / 4) * 8 + 4 + i % 4]);\n const inputs = {color: texture(input.color), albedo: texture(input.albedo), normal: texture(input.normal),\n moments: texture(Float32Array.from(input.moments, (v, i) => i % 4 === 2 ? input.samples : v)),\n shadowCatcher: texture(shadow), catcherBackground: texture(background), catcherMoments: texture(input.moments)};\n rayTracePass._loadDiagnosticAccumulation(inputs, input.catcher);\n sampleCount = resolvedSamples = input.samples;\n resolvedHasShadowCatcher = input.catcher; isFirstFrame = false;\n rayTraceOutputPass.setSize(renderWidth, renderHeight);\n rayTraceOutputPass.setSampleCount(sampleCount);\n rayTraceOutputPass.createPass(rayTracePass);\n }\n };\n },\n getDiagnostics: () => ({ ...rayTracePass.getDiagnostics(), shaderCompilation: renderer.getShaderCompilationDiagnostics() }),\n flushDiagnostics: async () => { },\n setShadowCatcherParams(color: ColorRGB, alpha: number) {\n const changed =\n color[0] !== shadowCatcherColor[0] ||\n color[1] !== shadowCatcherColor[1] ||\n color[2] !== shadowCatcherColor[2] ||\n alpha !== shadowCatcherAlpha;\n if (changed) {\n vec3.copy(shadowCatcherColor, color);\n shadowCatcherAlpha = alpha;\n composePass.setUniform('shadowCatcherColor', color);\n composePass.setUniform('shadowCatcherAlpha', alpha);\n }\n return changed;\n },\n setBloomParams({ intensity, threshold, radius }) {\n const changed =\n intensity !== bloomIntensity ||\n threshold !== bloomThreshold ||\n radius !== bloomRadius;\n bloomIntensity = intensity;\n bloomThreshold = threshold;\n bloomRadius = radius;\n return changed;\n },\n setOnSampleRendered(cb) {\n sampleRenderedCallback = cb;\n },\n\n setAovDisplayOptions(options: AovDisplayOptions) { aovDisplayOptions={...options,depthRange:[...options.depthRange]}; },\n setOutput(nextOutput: DisplayChannel) {\n if (output === nextOutput) return false;\n output = nextOutput;\n return true;\n },\n async readPresentation() {\n if (!presentationTexture) throw new Error('Render has no complete image.');\n rawReadFrameBuffer.bind(renderer, [presentationTexture]);\n const width = presentationTexture.width, height = presentationTexture.height;\n return { width, height, data: readRgbaPixels(renderer.gl, width, height, presentationTexture.isByteEncoded) };\n },\n aovReady(kind) { return !!execution?.aovs?.includes(kind) && aov.samples > 0; },\n getAovSamples() { return aov.samples; },\n restartAovs() { aov.reset(); },\n refineAovs(camera, samples = sampleCount) {\n if (samples < 1 || !execution?.aovs?.length) return true;\n rayTracePass.setCamera(camera); aovCamera = camera;\n return rayTracePass.renderAovs(aov,camera,renderWidth,renderHeight,samples,execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset);\n },\n async readAov(kind) {\n if(!execution?.aovs?.includes(kind) || !aovCamera || (sampleCount<1 && aov.samples<1)) throw new Error('AOV output is not ready');\n rayTracePass.setCamera(aovCamera);\n while (!rayTracePass.renderAovs(aov,aovCamera,renderWidth,renderHeight,Math.max(sampleCount,aov.samples),execution.aovSamples ?? 16,execution.aovs,sampleSequenceOffset)) {\n if (disposed || renderer.gl.isContextLost()) throw new Error('AOV compilation was interrupted');\n await new Promise<void>(resolve => scheduleFrame(() => resolve()));\n }\n return aov.read(kind);\n },\n async readOutput(kind) {\n if (kind === 'denoised' && (!denoisedTexture || !denoiseValid)) kind = 'hdr';\n const texture = kind === 'denoised' ? denoisedTexture! : rayTraceOutputPass.getOutput(kind === 'hdr' ? 'color' : kind);\n rawReadFrameBuffer.bind(renderer, [texture]);\n return { data: readRgbaPixels(renderer.gl, renderWidth, renderHeight, kind === 'albedo' || kind === 'normal'), width: renderWidth, height: renderHeight };\n },\n dispose() {\n if (disposed) return; disposed = true;\n if (typeof document !== 'undefined') document.removeEventListener('visibilitychange', onVisibilityChange);\n\n aov.dispose();\n rayTracePass.releaseTarget(targetKey);\n rayTraceOutputPass.dispose();\n presentationTexture?.dispose(renderer.gl);\n denoisedTexture?.dispose(renderer.gl);\n }\n } satisfies TargetPipeline & DisplayParityTarget;\n}\n\n/** Independent render targets, without preview or presentation policy. */\nexport function makeWebGLRenderTargets(renderer: WebGLDevice): RenderPipeline {\n const rayTracePass = new WebGLRayTracePass(renderer);\n const scratch = new ScratchPool();\n return makeRenderPipeline(rayTracePass, () => makeWebGLAccumulationTarget(renderer, rayTracePass, scratch), true, scratch);\n}\n"]}
@@ -41,23 +41,23 @@ uniform float uTurbidity;
41
41
  uniform vec3 uAlbedo;
42
42
 
43
43
 
44
- float br(float r, float mu, float radius) { return (radius - r) * (radius + r) + r * r * mu * mu; }
45
- bool np(float r, float mu) { return mu < 0.0 && br(r, mu, R_GROUND) >= 0.0; }
46
- float ll(float r, float mu) { return max(-r * mu - sqrt(max(br(r, mu, R_GROUND), 0.0)), 0.0); }
47
- float jm(float r, float mu) { return max(-r * mu + sqrt(max(br(r, mu, R_TOP), 0.0)), 0.0); }
44
+ float bj(float r, float mu, float radius) { return (radius - r) * (radius + r) + r * r * mu * mu; }
45
+ bool mV(float r, float mu) { return mu < 0.0 && bj(r, mu, R_GROUND) >= 0.0; }
46
+ float kT(float r, float mu) { return max(-r * mu - sqrt(max(bj(r, mu, R_GROUND), 0.0)), 0.0); }
47
+ float iS(float r, float mu) { return max(-r * mu + sqrt(max(bj(r, mu, R_TOP), 0.0)), 0.0); }
48
48
 
49
49
 
50
- vec3 oz(float r) {
50
+ vec3 oo(float r) {
51
51
  float h = max(r - R_GROUND, 0.0);
52
52
  return vec3(exp(-h / 8.0), exp(-h / 1.2) * uTurbidity, max(0.0, 1.0 - abs(h - 25.0) / 15.0));
53
53
  }
54
54
  vec3 extinction(vec3 d) { return RAYLEIGH * d.x + MIE_EXTINCTION * d.y + OZONE * d.z; }
55
55
 
56
- float mP(float x) { return x * x * (R_TOP - R_GROUND); }
57
- float hR(float h) { return sqrt(clamp(h / (R_TOP - R_GROUND), 0.0, 1.0)); }
56
+ float mB(float x) { return x * x * (R_TOP - R_GROUND); }
57
+ float hy(float h) { return sqrt(clamp(h / (R_TOP - R_GROUND), 0.0, 1.0)); }
58
58
 
59
59
 
60
- vec3 fh(sampler2D table, vec2 p) {
60
+ vec3 eR(sampler2D table, vec2 p) {
61
61
  ivec2 size = textureSize(table, 0);
62
62
  vec2 q = clamp(p, vec2(0.0), vec2(size - 1));
63
63
  ivec2 i = min(ivec2(floor(q)), max(size - 2, ivec2(0)));
@@ -75,12 +75,12 @@ uniform bool uFull;
75
75
  uniform vec3 uSkyIrradiance;
76
76
 
77
77
 
78
- vec3 fO(float r, float mu) {
79
- return fh(uTransmittance, vec2((clamp(mu, -1.0, 1.0) + 1.0) * 0.5 * float(T_SIZE.x - 1),
80
- hR(r - R_GROUND) * float(T_SIZE.y - 1)));
78
+ vec3 fv(float r, float mu) {
79
+ return eR(uTransmittance, vec2((clamp(mu, -1.0, 1.0) + 1.0) * 0.5 * float(T_SIZE.x - 1),
80
+ hy(r - R_GROUND) * float(T_SIZE.y - 1)));
81
81
  }
82
82
 
83
- float mW(float nu) {
83
+ float mI(float nu) {
84
84
  float g2 = MIE_G * MIE_G;
85
85
  return 3.0 / (8.0 * PI) * ((1.0 - g2) * (1.0 + nu * nu)) / ((2.0 + g2) * pow(1.0 + g2 - 2.0 * MIE_G * nu, 1.5));
86
86
  }
@@ -90,14 +90,14 @@ return 3.0 / (8.0 * PI) * ((1.0 - g2) * (1.0 + nu * nu)) / ((2.0 + g2) * pow(1.0
90
90
 
91
91
 
92
92
 
93
- void vt(vec3 origin, vec3 dir, int steps, out vec3 radiance, out vec3 throughput) {
93
+ void vG(vec3 origin, vec3 dir, int steps, out vec3 radiance, out vec3 throughput) {
94
94
  float r = length(origin);
95
95
  float mu = dot(origin, dir) / r;
96
- bool ground = np(r, mu);
97
- float len = ground ? ll(r, mu) : jm(r, mu);
96
+ bool ground = mV(r, mu);
97
+ float len = ground ? kT(r, mu) : iS(r, mu);
98
98
  float nu = dot(dir, uSun);
99
- float jv = uFull ? 3.0 / (16.0 * PI) * (1.0 + nu * nu) : 1.0 / (4.0 * PI);
100
- float sn = uFull ? mW(nu) : 1.0 / (4.0 * PI);
99
+ float ja = uFull ? 3.0 / (16.0 * PI) * (1.0 + nu * nu) : 1.0 / (4.0 * PI);
100
+ float sh = uFull ? mI(nu) : 1.0 / (4.0 * PI);
101
101
  radiance = vec3(0.0);
102
102
  throughput = vec3(0.0);
103
103
  vec3 view = vec3(1.0);
@@ -110,29 +110,29 @@ float dt = next - previous;
110
110
  vec3 p = origin + dir * (0.5 * (previous + next));
111
111
  previous = next;
112
112
  float pr = length(p);
113
- vec3 d = oz(pr);
113
+ vec3 d = oo(pr);
114
114
  vec3 e = extinction(d);
115
- vec3 vb = fO(pr, dot(p, uSun) / pr);
116
- vec3 nG = RAYLEIGH * d.x;
117
- float nF = MIE_SCATTERING * d.y;
115
+ vec3 vk = fv(pr, dot(p, uSun) / pr);
116
+ vec3 np = RAYLEIGH * d.x;
117
+ float nl = MIE_SCATTERING * d.y;
118
118
  vec3 ms = vec3(0.0);
119
119
  if (uFull) {
120
- float x = hR(pr - R_GROUND) * float(MS_ALTITUDES - 1);
121
- ms = fh(uMultiple, vec2(x, 0.0));
120
+ float x = hy(pr - R_GROUND) * float(MS_ALTITUDES - 1);
121
+ ms = eR(uMultiple, vec2(x, 0.0));
122
122
  }
123
- vec3 source = vb * (nG * jv + nF * sn) + (nG + nF) * ms;
123
+ vec3 source = vk * (np * ja + nl * sh) + (np + nl) * ms;
124
124
 
125
- vec3 st = exp(-e * dt);
126
- vec3 weight = (1.0 - st) / max(e, vec3(1e-9));
125
+ vec3 segment = exp(-e * dt);
126
+ vec3 weight = (1.0 - segment) / max(e, vec3(1e-9));
127
127
  radiance += view * source * weight;
128
- throughput += view * (nG + nF) * weight;
129
- view *= st;
128
+ throughput += view * (np + nl) * weight;
129
+ view *= segment;
130
130
  }
131
131
  if (ground) {
132
132
  vec3 p = origin + dir * len;
133
133
  float pr = length(p);
134
- float tC = dot(p, uSun) / pr;
135
- vec3 irradiance = fO(pr, tC) * max(tC, 0.0) + uSkyIrradiance;
134
+ float tD = dot(p, uSun) / pr;
135
+ vec3 irradiance = fv(pr, tD) * max(tD, 0.0) + uSkyIrradiance;
136
136
  radiance += view * uAlbedo / PI * irradiance;
137
137
  }
138
138
  }
@@ -141,43 +141,43 @@ const TRANSMITTANCE = COMMON + /* glsl */ `
141
141
  void main() {
142
142
  ivec2 p = ivec2(gl_FragCoord.xy);
143
143
  float mu = float(p.x) / float(T_SIZE.x - 1) * 2.0 - 1.0;
144
- float r = R_GROUND + mP(float(p.y) / float(T_SIZE.y - 1));
145
- if (np(r, mu)) { color = vec4(0.0, 0.0, 0.0, 1.0); return; }
146
- float len = jm(r, mu);
144
+ float r = R_GROUND + mB(float(p.y) / float(T_SIZE.y - 1));
145
+ if (mV(r, mu)) { color = vec4(0.0, 0.0, 0.0, 1.0); return; }
146
+ float len = iS(r, mu);
147
147
  vec3 depth = vec3(0.0);
148
148
  const int STEPS = 48;
149
149
  for (int i = 0; i < STEPS; i++) {
150
150
  float t = (float(i) + 0.5) / float(STEPS) * len;
151
- depth += extinction(oz(sqrt(t * t + 2.0 * r * mu * t + r * r))) * (len / float(STEPS));
151
+ depth += extinction(oo(sqrt(t * t + 2.0 * r * mu * t + r * r))) * (len / float(STEPS));
152
152
  }
153
153
  color = vec4(exp(-depth), 1.0);
154
154
  }
155
155
  `;
156
156
  const MULTIPLE = COMMON + ATMOSPHERE + /* glsl */ `
157
157
  void main() {
158
- float r = R_GROUND + mP(floor(gl_FragCoord.x) / float(MS_ALTITUDES - 1));
158
+ float r = R_GROUND + mB(floor(gl_FragCoord.x) / float(MS_ALTITUDES - 1));
159
159
  const int DIRECTIONS = 64;
160
- vec3 second = vec3(0.0), qK = vec3(0.0);
160
+ vec3 second = vec3(0.0), qC = vec3(0.0);
161
161
  for (int i = 0; i < DIRECTIONS; i++) {
162
162
 
163
163
  float mu = 1.0 - 2.0 * (float(i) + 0.5) / float(DIRECTIONS);
164
164
  float phi = float(i) * PI * (3.0 - sqrt(5.0));
165
165
  float s = sqrt(1.0 - mu * mu);
166
166
  vec3 radiance, throughput;
167
- vt(vec3(0.0, r, 0.0), vec3(s * cos(phi), mu, s * sin(phi)), 20, radiance, throughput);
167
+ vG(vec3(0.0, r, 0.0), vec3(s * cos(phi), mu, s * sin(phi)), 20, radiance, throughput);
168
168
  second += radiance / float(DIRECTIONS);
169
- qK += throughput / float(DIRECTIONS);
169
+ qC += throughput / float(DIRECTIONS);
170
170
  }
171
- color = vec4(second / (1.0 - qK), 1.0);
171
+ color = vec4(second / (1.0 - qC), 1.0);
172
172
  }
173
173
  `;
174
174
  // Elevation rows are spaced by the square root so the horizon gets most of them.
175
175
  const ELEVATION_MAPPING = /* glsl */ `
176
- float qk(float row) {
176
+ float qd(float row) {
177
177
  float x = row / float(SV_SIZE.y - 1) * 2.0 - 1.0;
178
178
  return sign(x) * x * x * (PI / 2.0);
179
179
  }
180
- float ik(float e) {
180
+ float hL(float e) {
181
181
  float x = sign(e) * sqrt(abs(e) / (PI / 2.0));
182
182
  return clamp((x + 1.0) * 0.5, 0.0, 1.0) * float(SV_SIZE.y - 1);
183
183
  }
@@ -185,10 +185,10 @@ return clamp((x + 1.0) * 0.5, 0.0, 1.0) * float(SV_SIZE.y - 1);
185
185
  const SKY_VIEW = COMMON + ATMOSPHERE + ELEVATION_MAPPING + /* glsl */ `
186
186
  void main() {
187
187
  ivec2 p = ivec2(gl_FragCoord.xy);
188
- float e = qk(float(p.y));
188
+ float e = qd(float(p.y));
189
189
  float phi = float(p.x) / float(SV_SIZE.x - 1) * PI;
190
190
  vec3 radiance, throughput;
191
- vt(vec3(0.0, R_GROUND + CAMERA_ALTITUDE, 0.0), vec3(cos(e) * cos(phi), sin(e), cos(e) * sin(phi)), 40, radiance, throughput);
191
+ vG(vec3(0.0, R_GROUND + CAMERA_ALTITUDE, 0.0), vec3(cos(e) * cos(phi), sin(e), cos(e) * sin(phi)), 40, radiance, throughput);
192
192
  color = vec4(radiance, 1.0);
193
193
  }
194
194
  `;
@@ -205,19 +205,19 @@ float e = (float(i) + 0.5) / float(ROWS) * (PI / 2.0);
205
205
  float weight = 2.0 * sin(e) * cos(e) * (PI / 2.0 / float(ROWS)) * (PI / float(COLUMNS));
206
206
  for (int j = 0; j < COLUMNS; j++) {
207
207
  float phi = (float(j) + 0.5) / float(COLUMNS) * PI;
208
- sky += fh(uSkyView, vec2(phi / PI * float(SV_SIZE.x - 1), ik(e))) * weight;
208
+ sky += eR(uSkyView, vec2(phi / PI * float(SV_SIZE.x - 1), hL(e))) * weight;
209
209
  }
210
210
  }
211
211
  if (int(gl_FragCoord.x) == 0) { color = vec4(sky, 1.0); return; }
212
212
  float r = R_GROUND + CAMERA_ALTITUDE;
213
- vec3 vb = fh(uTransmittance, vec2((uSun.y + 1.0) * 0.5 * float(T_SIZE.x - 1), hR(CAMERA_ALTITUDE) * float(T_SIZE.y - 1)));
214
- vec3 xc = vec3(0.2126, 0.7152, 0.0722);
215
- float horizontal = dot(sky, xc) + dot(vb, xc) * max(uSun.y, 0.0);
213
+ vec3 vk = eR(uTransmittance, vec2((uSun.y + 1.0) * 0.5 * float(T_SIZE.x - 1), hy(CAMERA_ALTITUDE) * float(T_SIZE.y - 1)));
214
+ vec3 xE = vec3(0.2126, 0.7152, 0.0722);
215
+ float horizontal = dot(sky, xE) + dot(vk, xE) * max(uSun.y, 0.0);
216
216
 
217
217
 
218
218
  const float REFERENCE = ${REFERENCE_ILLUMINANCE};
219
219
  float scale = ${ILLUMINANCE} / sqrt(max(horizontal, REFERENCE * 1e-3) * REFERENCE);
220
- color = vec4(vb, scale);
220
+ color = vec4(vk, scale);
221
221
  }
222
222
  `;
223
223
  const MAP = COMMON + ELEVATION_MAPPING + /* glsl */ `
@@ -229,35 +229,35 @@ uniform vec3 uSunWorld;
229
229
  uniform float uSunRadius;
230
230
 
231
231
 
232
- vec3 hn(vec2 dk) {
233
- float theta = dk.y / uSize.y * PI;
234
- float phi = dk.x / uSize.x * 2.0 * PI;
232
+ vec3 gU(vec2 cR) {
233
+ float theta = cR.y / uSize.y * PI;
234
+ float phi = cR.x / uSize.x * 2.0 * PI;
235
235
  return vec3(-sin(theta) * cos(phi), cos(theta), -sin(theta) * sin(phi));
236
236
  }
237
237
 
238
238
  void main() {
239
- vec3 dir = hn(gl_FragCoord.xy);
240
- float ek = abs(atan(dir.z, dir.x) - uAzimuth);
241
- ek = min(mod(ek, 2.0 * PI), 2.0 * PI - mod(ek, 2.0 * PI));
239
+ vec3 dir = gU(gl_FragCoord.xy);
240
+ float dU = abs(atan(dir.z, dir.x) - uAzimuth);
241
+ dU = min(mod(dU, 2.0 * PI), 2.0 * PI - mod(dU, 2.0 * PI));
242
242
  float e = asin(clamp(dir.y, -1.0, 1.0));
243
- vec3 radiance = fh(uSkyView, vec2(ek / PI * float(SV_SIZE.x - 1), ik(e)));
243
+ vec3 radiance = eR(uSkyView, vec2(dU / PI * float(SV_SIZE.x - 1), hL(e)));
244
244
  vec4 sun = texelFetch(uIrradiance, ivec2(1, 0), 0);
245
245
 
246
246
 
247
- float rP = PI / uSize.y;
248
- if (acos(clamp(dot(dir, uSunWorld), -1.0, 1.0)) < uSunRadius + 3.0 * rP / max(sqrt(1.0 - dir.y * dir.y), 0.05)) {
247
+ float rM = PI / uSize.y;
248
+ if (acos(clamp(dot(dir, uSunWorld), -1.0, 1.0)) < uSunRadius + 3.0 * rM / max(sqrt(1.0 - dir.y * dir.y), 0.05)) {
249
249
  const int N = 6;
250
250
  const float LIMB = 0.6;
251
251
  float coverage = 0.0;
252
252
  for (int y = 0; y < N; y++) for (int x = 0; x < N; x++) {
253
- vec3 d = hn(gl_FragCoord.xy - 0.5 + (vec2(x, y) + 0.5) / float(N));
253
+ vec3 d = gU(gl_FragCoord.xy - 0.5 + (vec2(x, y) + 0.5) / float(N));
254
254
 
255
255
  float angle = 2.0 * asin(min(length(d - uSunWorld) * 0.5, 1.0));
256
256
  float t = angle / uSunRadius;
257
257
  if (t < 1.0) coverage += 1.0 - LIMB * (1.0 - sqrt(1.0 - t * t));
258
258
  }
259
- float rO = 2.0 * PI * (1.0 - cos(uSunRadius));
260
- radiance += coverage / float(N * N) / (rO * (1.0 - LIMB / 3.0)) * sun.rgb;
259
+ float rK = 2.0 * PI * (1.0 - cos(uSunRadius));
260
+ radiance += coverage / float(N * N) / (rK * (1.0 - LIMB / 3.0)) * sun.rgb;
261
261
  }
262
262
  color = vec4(radiance * sun.a, 1.0);
263
263
  }
@@ -14,7 +14,8 @@ export interface TargetPipeline extends RenderPasses {
14
14
  setRealtimeBatchBudget?(milliseconds: number): void;
15
15
  setRealtimeDeferPostProcess?(defer: boolean): void;
16
16
  getRealtimeSampleTime?(): number | undefined;
17
- whenTraceAvailable?(): Promise<void>;
17
+ getRealtimeTileTime?(): number | undefined;
18
+ whenTraceAvailable?(): Promise<boolean>;
18
19
  present(): void;
19
20
  readPresentation(): Promise<{
20
21
  width: number;
@@ -1 +1 @@
1
- {"version":3,"file":"accumulationTarget.js","sourceRoot":"","sources":["../../src/renderer/accumulationTarget.ts"],"names":[],"mappings":"","sourcesContent":["import type { Scene } from '../scene/Scene.js';\nimport type { TraceSettings } from './renderPipeline.js';\nimport type { RenderPasses } from './RenderingPipeline.js';\n\n/** Backend-owned execution and outputs of one resident accumulation. */\nexport interface TargetPipeline extends RenderPasses {\n activate(): void;\n invalidateDenoisedOutput(): void;\n /** Refreshes backend timing after structural scene changes; optional without GPU timestamps. */\n invalidateTiming?(): void;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n canCompleteSampleWithin(timeBudgetMs: number): boolean;\n /** Optional WebGPU throughput controls; do not alter the tile budget. */\n setRealtimeBatchBudget?(milliseconds: number): void;\n setRealtimeDeferPostProcess?(defer: boolean): void;\n getRealtimeSampleTime?(): number | undefined;\n whenTraceAvailable?(): Promise<void>;\n present(): void;\n readPresentation(): Promise<{width: number; height: number; data: Float32Array}>;\n readonly presentationComplete: boolean;\n readonly presentationDenoised: boolean;\n getMemory(): {width: number; height: number; bytes: number};\n}\n"]}
1
+ {"version":3,"file":"accumulationTarget.js","sourceRoot":"","sources":["../../src/renderer/accumulationTarget.ts"],"names":[],"mappings":"","sourcesContent":["import type { Scene } from '../scene/Scene.js';\nimport type { TraceSettings } from './renderPipeline.js';\nimport type { RenderPasses } from './RenderingPipeline.js';\n\n/** Backend-owned execution and outputs of one resident accumulation. */\nexport interface TargetPipeline extends RenderPasses {\n activate(): void;\n invalidateDenoisedOutput(): void;\n /** Refreshes backend timing after structural scene changes; optional without GPU timestamps. */\n invalidateTiming?(): void;\n configure(settings: TraceSettings): void;\n synchronizeBackground(background: Scene['background']): void;\n canCompleteSampleWithin(timeBudgetMs: number): boolean;\n /** Optional WebGPU throughput controls; do not alter the tile budget. */\n setRealtimeBatchBudget?(milliseconds: number): void;\n setRealtimeDeferPostProcess?(defer: boolean): void;\n getRealtimeSampleTime?(): number | undefined;\n getRealtimeTileTime?(): number | undefined;\n whenTraceAvailable?(): Promise<boolean>;\n present(): void;\n readPresentation(): Promise<{width: number; height: number; data: Float32Array}>;\n readonly presentationComplete: boolean;\n readonly presentationDenoised: boolean;\n getMemory(): {width: number; height: number; bytes: number};\n}\n"]}
@@ -0,0 +1,31 @@
1
+ interface CausticDiagnostics {
2
+ debugGroup: number;
3
+ photonAlpha?: number;
4
+ photonRadiusScaling?: import('./wgsl/photonMap.compute.js').PhotonRadiusScaling;
5
+ /** Fixed progressive batch for isolated query counters. */
6
+ photonDebugBatch?: number;
7
+ photonBudgetBytes?: number;
8
+ photonScreenRadius?: boolean;
9
+ /** Internal photon density comparison; public defaults stay fixed. */
10
+ photonCountDivisor?: number;
11
+ /** Internal direct-receiver A/B override; false restores the original PM shader. */
12
+ photonDirectSubset?: boolean;
13
+ /** Scale experiments; off by default and excluded from public settings. */
14
+ photonPerCasterRadius?: boolean;
15
+ causticViewImportance?: boolean;
16
+ photonDeepScreenPixels?: number;
17
+ photonSkipQuery?: boolean;
18
+ photonSkipVisible?: boolean;
19
+ photonMaxDepth?: number;
20
+ fullEmissionRandom?: boolean;
21
+ aggregateCasters?: boolean;
22
+ capturePhotons?: boolean;
23
+ photonBatch?: {
24
+ device: GPUDevice;
25
+ data: GPUTexture;
26
+ emitted: number;
27
+ packed?: boolean;
28
+ };
29
+ }
30
+ export declare const causticDiagnostics: CausticDiagnostics;
31
+ export {};
@@ -0,0 +1,5 @@
1
+ /** Internal shader instrumentation. A nonnegative group replaces beauty RGB with three transport counters. */
2
+ const diagnosticsKey = Symbol.for('mutracer.internal.causticDiagnostics');
3
+ const diagnosticsScope = globalThis;
4
+ export const causticDiagnostics = diagnosticsScope[diagnosticsKey] ??= ({ debugGroup: -1 });
5
+ //# sourceMappingURL=causticDiagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"causticDiagnostics.js","sourceRoot":"","sources":["../../src/renderer/causticDiagnostics.ts"],"names":[],"mappings":"AAAA,8GAA8G;AAC9G,MAAM,cAAc,GAAC,MAAM,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;AAyBxE,MAAM,gBAAgB,GAAC,UAA6E,CAAC;AACrG,MAAM,CAAC,MAAM,kBAAkB,GAAC,gBAAgB,CAAC,cAAc,CAAC,KAAG,CAAE,EAAC,UAAU,EAAC,CAAC,CAAC,EAAC,CAAE,CAAC","sourcesContent":["/** Internal shader instrumentation. A nonnegative group replaces beauty RGB with three transport counters. */\nconst diagnosticsKey=Symbol.for('mutracer.internal.causticDiagnostics');\ninterface CausticDiagnostics {\n debugGroup:number;\n photonAlpha?:number;\n photonRadiusScaling?: import('./wgsl/photonMap.compute.js').PhotonRadiusScaling;\n /** Fixed progressive batch for isolated query counters. */\n photonDebugBatch?:number;\n photonBudgetBytes?:number;\n photonScreenRadius?:boolean;\n /** Internal photon density comparison; public defaults stay fixed. */\n photonCountDivisor?:number;\n /** Internal direct-receiver A/B override; false restores the original PM shader. */\n photonDirectSubset?:boolean;\n /** Scale experiments; off by default and excluded from public settings. */\n photonPerCasterRadius?:boolean;\n causticViewImportance?:boolean;\n photonDeepScreenPixels?:number;\n photonSkipQuery?:boolean;\n photonSkipVisible?:boolean;\n photonMaxDepth?:number;\n fullEmissionRandom?:boolean;\n aggregateCasters?:boolean;\n capturePhotons?:boolean;\n photonBatch?:{device:GPUDevice;data:GPUTexture;emitted:number;packed?:boolean};\n}\nconst diagnosticsScope=globalThis as typeof globalThis & Record<symbol,CausticDiagnostics|undefined>;\nexport const causticDiagnostics=diagnosticsScope[diagnosticsKey]??=( {debugGroup:-1} );\n"]}
@@ -0,0 +1,10 @@
1
+ import type { AnalyticLightState } from '../scene/lightState.js';
2
+ import { type EmissiveTriangle } from './lightSampling.js';
3
+ /** Emitted flux, independent of the NEE selection heuristic. */
4
+ export declare function causticEmissionPower(light: AnalyticLightState, radius?: number): number;
5
+ /** Two texels per alias choice: probability/alias/type/index, then its PMF. */
6
+ export declare function causticEmissionTable(lights: readonly AnalyticLightState[], triangles: readonly EmissiveTriangle[], radius?: number, environmentPower?: number): {
7
+ data: Float32Array<ArrayBuffer>;
8
+ count: number;
9
+ totalPower: number;
10
+ };
@@ -0,0 +1,40 @@
1
+ import { buildLightAliasTable, colorLuminance, estimateAnalyticLightPower } from './lightSampling.js';
2
+ import { getSpotLightArea, getSpotLightRadiance } from './lightsData.js';
3
+ /** Emitted flux, independent of the NEE selection heuristic. */
4
+ export function causticEmissionPower(light, radius = 1) {
5
+ if (light.type === 'DirectionalLight')
6
+ return colorLuminance(light.color) * light.intensity * Math.PI * radius * radius;
7
+ if (light.type === 'RectLight')
8
+ return estimateAnalyticLightPower(light) * (light.spread <= .001 ? 1 / Math.PI : Math.sin(Math.PI * .5 * light.spread) ** 2);
9
+ if (light.type !== 'SpotLight')
10
+ return estimateAnalyticLightPower(light);
11
+ const outer = Math.cos(light.outerAngle * Math.PI / 180), inner = Math.cos(Math.min(light.innerAngle, light.outerAngle) * Math.PI / 180);
12
+ const rows = 128, columns = 128;
13
+ let integral = 0;
14
+ for (let y = 0; y < rows; y++)
15
+ for (let x = 0; x < columns; x++) {
16
+ const cosine = 1 - (1 - outer) * (y + .5) / rows;
17
+ const t = inner > outer ? Math.min(1, Math.max(0, (cosine - outer) / (inner - outer))) : 1;
18
+ const ies = light.iesProfile?.sampleBaked(Math.acos(cosine), 2 * Math.PI * (x + .5) / columns - Math.PI) ?? 1;
19
+ integral += t * t * (3 - 2 * t) * ies;
20
+ }
21
+ integral *= 2 * Math.PI * (1 - outer) / (rows * columns);
22
+ // A sphere projects to one quarter of its surface area in any direction.
23
+ const intensity = colorLuminance(light.color) * (light.radius === 0 ? light.intensity : getSpotLightRadiance(light) * getSpotLightArea(light) / 4);
24
+ return intensity * integral;
25
+ }
26
+ /** Two texels per alias choice: probability/alias/type/index, then its PMF. */
27
+ export function causticEmissionTable(lights, triangles, radius = 1, environmentPower = 0) {
28
+ const entries = lights.map((light, sourceIndex) => ({ sourceType: 2, sourceIndex, weight: causticEmissionPower(light, radius) }));
29
+ triangles.forEach((triangle, sourceIndex) => entries.push({ sourceType: 3, sourceIndex, weight: Math.PI * triangle.area * triangle.samplingLuminance }));
30
+ if (environmentPower > 0)
31
+ entries.push({ sourceType: 1, sourceIndex: 0, weight: environmentPower * Math.PI * radius * radius });
32
+ const distribution = buildLightAliasTable(entries), count = distribution.pmfs.length;
33
+ const data = new Float32Array(count * 8), words = new Uint32Array(data.buffer);
34
+ for (let i = 0; i < count; i++) {
35
+ words.set(distribution.choices.subarray(i * 4, i * 4 + 4), i * 8);
36
+ data[i * 8 + 4] = distribution.pmfs[i];
37
+ }
38
+ return { data, count, totalPower: distribution.totalWeight };
39
+ }
40
+ //# sourceMappingURL=causticEmission.js.map