@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
@@ -25,7 +25,7 @@ export interface WebGLPassOptions {
25
25
  export declare class WebGLFullQuadPass<I extends string, O extends string> {
26
26
  private readonly _renderer;
27
27
  private _bindings;
28
- private readonly _sourceShader;
28
+ private _sourceShader;
29
29
  private readonly _outputs;
30
30
  private readonly _frameBuffer;
31
31
  private _outputTextures;
@@ -43,6 +43,7 @@ export declare class WebGLFullQuadPass<I extends string, O extends string> {
43
43
  outputs?: O[];
44
44
  outputParams?: Partial<Record<O, WebGLFullQuadPassOutput>>;
45
45
  });
46
+ setShader(shader: FragmentShader): void;
46
47
  reserveCapacity(): void;
47
48
  private _samplingShader;
48
49
  setSize(width: number, height: number): void;
@@ -37,6 +37,10 @@ export class WebGLFullQuadPass {
37
37
  options.outputParams?.[name] || {}
38
38
  ])));
39
39
  }
40
+ setShader(shader) {
41
+ this._sourceShader = shader;
42
+ this._bindings = new WebGLProgramBindings(this._samplingShader(shader, this._reserveCapacity, { ...shader.uniforms, ...this._bindings.uniforms }, this._bindings.defines));
43
+ }
40
44
  reserveCapacity() {
41
45
  if (this._reserveCapacity)
42
46
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"WebGLFullQuadPass.js","sourceRoot":"","sources":["../../src/renderer/WebGLFullQuadPass.ts"],"names":[],"mappings":"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","sourcesContent":["import {scratchGLSLFunctions} from './scratchSampling.js';\nimport {setTextureRegion, textureRegion} from './textureRegion.js';\nimport { FragmentShader, type ShaderDefineValue } from './shader.js';\nimport {\n FrameBuffer,\n WebGLDevice,\n Texture2D,\n type TextureOptions,\n WebGLProgramBindings\n} from './webgl.js';\n\nexport interface WebGLFullQuadPassOutput extends TextureOptions {}\n\nexport interface WebGLPassOptions {\n clear?: boolean;\n blend?: boolean;\n viewport?: { x: number; y: number; width: number; height: number };\n scissor?: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Explicit WebGL 2.0 render pass matching the lifecycle of WGPUFullQuadPass.\n * It owns its output textures and framebuffer; there is no render graph.\n */\nexport class WebGLFullQuadPass<I extends string, O extends string> {\n private readonly _renderer: WebGLDevice;\n private _bindings: WebGLProgramBindings;\n private readonly _sourceShader: FragmentShader;\n private readonly _outputs: O[];\n private readonly _frameBuffer = new FrameBuffer();\n private _outputTextures = {} as Record<O, Texture2D>;\n private readonly _targetOutputs = new Map<object, Record<O, Texture2D>>();\n useTarget(target: object) {\n let outputs = this._targetOutputs.get(target);\n if (!outputs) this._targetOutputs.set(target, outputs = {} as Record<O, Texture2D>);\n this._outputTextures = outputs;\n }\n\n private _outputParams = {} as Record<O, WebGLFullQuadPassOutput>;\n private _reserveCapacity = false;\n private _capacityWidth = 1;\n private _capacityHeight = 1;\n private _width = 1;\n private _height = 1;\n private _renderToScreen = false;\n\n constructor(\n _label: string,\n renderer: WebGLDevice,\n options: {\n shader: FragmentShader;\n outputs?: O[];\n outputParams?: Partial<Record<O, WebGLFullQuadPassOutput>>;\n }\n ) {\n this._renderer = renderer;\n this._sourceShader = options.shader;\n this._bindings = new WebGLProgramBindings(this._samplingShader(options.shader));\n this._outputs = options.outputs || (options.shader.outputs as O[]);\n this.setOutputParams(\n Object.fromEntries(\n this._outputs.map((name) => [\n name,\n options.outputParams?.[name] || {}\n ])\n ) as Record<O, WebGLFullQuadPassOutput>\n );\n }\n\n reserveCapacity() {\n if (this._reserveCapacity) return;\n this._reserveCapacity = true;\n this._bindings = new WebGLProgramBindings(this._samplingShader(\n this._sourceShader, true, this._bindings.uniforms, this._bindings.defines\n ));\n }\n\n private _samplingShader(\n shader: FragmentShader,\n scratch = false,\n uniforms = shader.uniforms,\n defines = shader.defines\n ) {\n const textures = Object.keys(shader.uniforms).filter(name => shader.uniforms[name].type === 'sampler2D');\n uniforms = {...uniforms};\n if (scratch) for (const name of textures) uniforms[`${name}RegionSize`] = {type: 'ivec2', value: [1, 1]};\n const sampled = new FragmentShader({name: shader.name, outputs: shader.outputs, outputTypes: shader.outputTypes, defines, uniforms,\n includes: [{defines: {}, uniforms: {}, main: '', functions: [() => scratchGLSLFunctions(textures, scratch), ...shader.functions]}],\n main: shader.main});\n sampled.parallelCompile = shader.parallelCompile;\n return sampled;\n }\n\n setSize(width: number, height: number) {\n if (this._width === width && this._height === height) return;\n this._width = Math.max(1, width);\n this._height = Math.max(1, height);\n this._capacityWidth = Math.max(this._capacityWidth, this._width);\n this._capacityHeight = Math.max(this._capacityHeight, this._height);\n this.setUniform('viewportSize', [this._width, this._height]);\n }\n\n setOutputs(outputs: readonly O[]) {\n for (const name of this._outputs) if (!outputs.includes(name)) {\n this._outputTextures[name]?.dispose(this._renderer.gl); delete this._outputTextures[name];\n }\n this._outputs.splice(0, this._outputs.length, ...outputs);\n }\n setOutputParams(params: Record<O, WebGLFullQuadPassOutput>) {\n this._outputParams = params;\n }\n\n setRenderToScreen(renderToScreen = true) {\n this._renderToScreen = renderToScreen;\n }\n\n setUniform(label: string, data: unknown) {\n return this._bindings.set(label, data);\n }\n\n setUniforms(values: Record<string, unknown>) {\n this._bindings.setUniforms(values);\n }\n\n getUniform(label: string) {\n return this._bindings.get(label);\n }\n\n setDefines(\n defines: Record<\n string,\n ShaderDefineValue | undefined\n >\n ) {\n let changed = false;\n for (const [name, value] of Object.entries(defines)) {\n const oldValue = this._bindings.defines[name];\n if (!value) {\n if (name in this._bindings.defines) {\n this._bindings.deleteDefine(name);\n changed = true;\n }\n } else if (oldValue !== value) {\n this._bindings.setDefine(name, value);\n changed = true;\n }\n }\n return changed;\n }\n\n private readonly _retainedOutputs = new Set<Texture2D>();\n retainOutput(texture: Texture2D) { if (Object.values(this._outputTextures).includes(texture)) this._retainedOutputs.add(texture); }\n releaseOutput(texture: Texture2D) {\n if (!this._retainedOutputs.delete(texture)) return;\n if (!Object.values(this._outputTextures).includes(texture)) texture.dispose(this._renderer.gl);\n }\n\n // Internal fixed-accumulation loader; transfer ownership to the selected target.\n loadDiagnosticOutputs(outputs: Partial<Record<O, Texture2D>>) {\n for (const name of Object.keys(outputs) as O[]) {\n this._outputTextures[name]?.dispose(this._renderer.gl);\n this._outputTextures[name] = outputs[name]!;\n }\n }\n\n getOutput(name: O) {\n return this._outputTextures[name];\n }\n\n private _prepareOutputs(explicitOutputs?: Partial<Record<O, Texture2D>>) {\n const gl = this._renderer.gl;\n for (const name of this._outputs) {\n const explicit = explicitOutputs?.[name];\n const current = this._outputTextures[name];\n const retainedResize = current && this._retainedOutputs.has(current) &&\n (current.width !== this._width || current.height !== this._height);\n const texture =\n explicit ||\n (retainedResize ? new Texture2D(this._outputParams[name]) : undefined) ||\n this._outputTextures[name] ||\n new Texture2D(this._outputParams[name]);\n texture.ensureStorage(\n gl,\n this._reserveCapacity ? this._capacityWidth : this._width,\n this._reserveCapacity ? this._capacityHeight : this._height,\n this._outputParams[name]\n );\n this._outputTextures[name] = texture;\n setTextureRegion(texture, this._width, this._height);\n }\n }\n\n isProgramReady(inputs?: Record<I, Texture2D>) {\n if (inputs) this._bindings.setUniforms(inputs);\n return this._renderer.isProgramCompiled(this._bindings.getProgram(this._renderer));\n }\n\n createPass(\n inputs: Record<I, Texture2D>,\n explicitOutputs?: Partial<Record<O, Texture2D>>,\n options: WebGLPassOptions = {}\n ) {\n const renderer = this._renderer;\n const gl = renderer.gl;\n\n if (this._renderToScreen) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n } else {\n this._prepareOutputs(explicitOutputs);\n this._frameBuffer.bind(\n renderer,\n this._outputs.map((name) => this._outputTextures[name])\n );\n }\n\n const viewport = options.viewport || {\n x: 0,\n y: 0,\n width: this._width,\n height: this._height\n };\n renderer.setViewport(\n viewport.x,\n viewport.y,\n viewport.width,\n viewport.height\n );\n\n // Clear the full accumulation target before enabling the tile scissor.\n // Otherwise every tile outside the first one retains stale camera data.\n if (options.clear) {\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n if (options.scissor) {\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n options.scissor.x,\n options.scissor.y,\n options.scissor.width,\n options.scissor.height\n );\n } else {\n gl.disable(gl.SCISSOR_TEST);\n }\n\n if (this._reserveCapacity) for (const [name, texture] of Object.entries(inputs) as [string, Texture2D][]) {\n const region = textureRegion(texture);\n this.setUniform(`${name}RegionSize`, [region.width, region.height]);\n }\n this._bindings.setUniforms(inputs);\n if (!this._bindings.bind(renderer)) {\n gl.disable(gl.SCISSOR_TEST);\n return false;\n }\n gl.disable(gl.DEPTH_TEST);\n if (options.blend) {\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE);\n } else {\n gl.disable(gl.BLEND);\n }\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.disable(gl.SCISSOR_TEST);\n return true;\n }\n\n releaseTarget(target: object) {\n const outputs = this._targetOutputs.get(target);\n if (!outputs) return;\n this._targetOutputs.delete(target);\n for (const texture of (Object.values(outputs) as Texture2D[])) texture.dispose(this._renderer.gl);\n if (outputs === this._outputTextures) this._outputTextures = {} as Record<O, Texture2D>;\n }\n\n getMemoryBytes(target?: object): number {\n const outputs = target ? this._targetOutputs.get(target) ?? {} : this._outputTextures;\n return Array.from(new Set([...Object.values(outputs) as Texture2D[], ...this._retainedOutputs]))\n .reduce((sum, texture) => sum + texture.getMemoryBytes(), 0);\n }\n\n dispose() {\n const gl = this._renderer.gl;\n (Array.from(new Set([this._outputTextures, ...this._targetOutputs.values()])).flatMap(outputs => Object.values(outputs)) as Texture2D[]).forEach((texture) =>\n texture.dispose(gl)\n );\n this._retainedOutputs.forEach(texture => texture.dispose(gl));\n this._retainedOutputs.clear();\n this._frameBuffer.dispose(this._renderer);\n }\n}\n"]}
1
+ {"version":3,"file":"WebGLFullQuadPass.js","sourceRoot":"","sources":["../../src/renderer/WebGLFullQuadPass.ts"],"names":[],"mappings":"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","sourcesContent":["import {scratchGLSLFunctions} from './scratchSampling.js';\nimport {setTextureRegion, textureRegion} from './textureRegion.js';\nimport { FragmentShader, type ShaderDefineValue } from './shader.js';\nimport {\n FrameBuffer,\n WebGLDevice,\n Texture2D,\n type TextureOptions,\n WebGLProgramBindings\n} from './webgl.js';\n\nexport interface WebGLFullQuadPassOutput extends TextureOptions {}\n\nexport interface WebGLPassOptions {\n clear?: boolean;\n blend?: boolean;\n viewport?: { x: number; y: number; width: number; height: number };\n scissor?: { x: number; y: number; width: number; height: number };\n}\n\n/**\n * Explicit WebGL 2.0 render pass matching the lifecycle of WGPUFullQuadPass.\n * It owns its output textures and framebuffer; there is no render graph.\n */\nexport class WebGLFullQuadPass<I extends string, O extends string> {\n private readonly _renderer: WebGLDevice;\n private _bindings: WebGLProgramBindings;\n private _sourceShader: FragmentShader;\n private readonly _outputs: O[];\n private readonly _frameBuffer = new FrameBuffer();\n private _outputTextures = {} as Record<O, Texture2D>;\n private readonly _targetOutputs = new Map<object, Record<O, Texture2D>>();\n useTarget(target: object) {\n let outputs = this._targetOutputs.get(target);\n if (!outputs) this._targetOutputs.set(target, outputs = {} as Record<O, Texture2D>);\n this._outputTextures = outputs;\n }\n\n private _outputParams = {} as Record<O, WebGLFullQuadPassOutput>;\n private _reserveCapacity = false;\n private _capacityWidth = 1;\n private _capacityHeight = 1;\n private _width = 1;\n private _height = 1;\n private _renderToScreen = false;\n\n constructor(\n _label: string,\n renderer: WebGLDevice,\n options: {\n shader: FragmentShader;\n outputs?: O[];\n outputParams?: Partial<Record<O, WebGLFullQuadPassOutput>>;\n }\n ) {\n this._renderer = renderer;\n this._sourceShader = options.shader;\n this._bindings = new WebGLProgramBindings(this._samplingShader(options.shader));\n this._outputs = options.outputs || (options.shader.outputs as O[]);\n this.setOutputParams(\n Object.fromEntries(\n this._outputs.map((name) => [\n name,\n options.outputParams?.[name] || {}\n ])\n ) as Record<O, WebGLFullQuadPassOutput>\n );\n }\n\n setShader(shader: FragmentShader) {\n this._sourceShader = shader;\n this._bindings = new WebGLProgramBindings(this._samplingShader(\n shader, this._reserveCapacity, {...shader.uniforms, ...this._bindings.uniforms}, this._bindings.defines\n ));\n }\n\n reserveCapacity() {\n if (this._reserveCapacity) return;\n this._reserveCapacity = true;\n this._bindings = new WebGLProgramBindings(this._samplingShader(\n this._sourceShader, true, this._bindings.uniforms, this._bindings.defines\n ));\n }\n\n private _samplingShader(\n shader: FragmentShader,\n scratch = false,\n uniforms = shader.uniforms,\n defines = shader.defines\n ) {\n const textures = Object.keys(shader.uniforms).filter(name => shader.uniforms[name].type === 'sampler2D');\n uniforms = {...uniforms};\n if (scratch) for (const name of textures) uniforms[`${name}RegionSize`] = {type: 'ivec2', value: [1, 1]};\n const sampled = new FragmentShader({name: shader.name, outputs: shader.outputs, outputTypes: shader.outputTypes, defines, uniforms,\n includes: [{defines: {}, uniforms: {}, main: '', functions: [() => scratchGLSLFunctions(textures, scratch), ...shader.functions]}],\n main: shader.main});\n sampled.parallelCompile = shader.parallelCompile;\n return sampled;\n }\n\n setSize(width: number, height: number) {\n if (this._width === width && this._height === height) return;\n this._width = Math.max(1, width);\n this._height = Math.max(1, height);\n this._capacityWidth = Math.max(this._capacityWidth, this._width);\n this._capacityHeight = Math.max(this._capacityHeight, this._height);\n this.setUniform('viewportSize', [this._width, this._height]);\n }\n\n setOutputs(outputs: readonly O[]) {\n for (const name of this._outputs) if (!outputs.includes(name)) {\n this._outputTextures[name]?.dispose(this._renderer.gl); delete this._outputTextures[name];\n }\n this._outputs.splice(0, this._outputs.length, ...outputs);\n }\n setOutputParams(params: Record<O, WebGLFullQuadPassOutput>) {\n this._outputParams = params;\n }\n\n setRenderToScreen(renderToScreen = true) {\n this._renderToScreen = renderToScreen;\n }\n\n setUniform(label: string, data: unknown) {\n return this._bindings.set(label, data);\n }\n\n setUniforms(values: Record<string, unknown>) {\n this._bindings.setUniforms(values);\n }\n\n getUniform(label: string) {\n return this._bindings.get(label);\n }\n\n setDefines(\n defines: Record<\n string,\n ShaderDefineValue | undefined\n >\n ) {\n let changed = false;\n for (const [name, value] of Object.entries(defines)) {\n const oldValue = this._bindings.defines[name];\n if (!value) {\n if (name in this._bindings.defines) {\n this._bindings.deleteDefine(name);\n changed = true;\n }\n } else if (oldValue !== value) {\n this._bindings.setDefine(name, value);\n changed = true;\n }\n }\n return changed;\n }\n\n private readonly _retainedOutputs = new Set<Texture2D>();\n retainOutput(texture: Texture2D) { if (Object.values(this._outputTextures).includes(texture)) this._retainedOutputs.add(texture); }\n releaseOutput(texture: Texture2D) {\n if (!this._retainedOutputs.delete(texture)) return;\n if (!Object.values(this._outputTextures).includes(texture)) texture.dispose(this._renderer.gl);\n }\n\n // Internal fixed-accumulation loader; transfer ownership to the selected target.\n loadDiagnosticOutputs(outputs: Partial<Record<O, Texture2D>>) {\n for (const name of Object.keys(outputs) as O[]) {\n this._outputTextures[name]?.dispose(this._renderer.gl);\n this._outputTextures[name] = outputs[name]!;\n }\n }\n\n getOutput(name: O) {\n return this._outputTextures[name];\n }\n\n private _prepareOutputs(explicitOutputs?: Partial<Record<O, Texture2D>>) {\n const gl = this._renderer.gl;\n for (const name of this._outputs) {\n const explicit = explicitOutputs?.[name];\n const current = this._outputTextures[name];\n const retainedResize = current && this._retainedOutputs.has(current) &&\n (current.width !== this._width || current.height !== this._height);\n const texture =\n explicit ||\n (retainedResize ? new Texture2D(this._outputParams[name]) : undefined) ||\n this._outputTextures[name] ||\n new Texture2D(this._outputParams[name]);\n texture.ensureStorage(\n gl,\n this._reserveCapacity ? this._capacityWidth : this._width,\n this._reserveCapacity ? this._capacityHeight : this._height,\n this._outputParams[name]\n );\n this._outputTextures[name] = texture;\n setTextureRegion(texture, this._width, this._height);\n }\n }\n\n isProgramReady(inputs?: Record<I, Texture2D>) {\n if (inputs) this._bindings.setUniforms(inputs);\n return this._renderer.isProgramCompiled(this._bindings.getProgram(this._renderer));\n }\n\n createPass(\n inputs: Record<I, Texture2D>,\n explicitOutputs?: Partial<Record<O, Texture2D>>,\n options: WebGLPassOptions = {}\n ) {\n const renderer = this._renderer;\n const gl = renderer.gl;\n\n if (this._renderToScreen) {\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n } else {\n this._prepareOutputs(explicitOutputs);\n this._frameBuffer.bind(\n renderer,\n this._outputs.map((name) => this._outputTextures[name])\n );\n }\n\n const viewport = options.viewport || {\n x: 0,\n y: 0,\n width: this._width,\n height: this._height\n };\n renderer.setViewport(\n viewport.x,\n viewport.y,\n viewport.width,\n viewport.height\n );\n\n // Clear the full accumulation target before enabling the tile scissor.\n // Otherwise every tile outside the first one retains stale camera data.\n if (options.clear) {\n gl.disable(gl.SCISSOR_TEST);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n }\n\n if (options.scissor) {\n gl.enable(gl.SCISSOR_TEST);\n gl.scissor(\n options.scissor.x,\n options.scissor.y,\n options.scissor.width,\n options.scissor.height\n );\n } else {\n gl.disable(gl.SCISSOR_TEST);\n }\n\n if (this._reserveCapacity) for (const [name, texture] of Object.entries(inputs) as [string, Texture2D][]) {\n const region = textureRegion(texture);\n this.setUniform(`${name}RegionSize`, [region.width, region.height]);\n }\n this._bindings.setUniforms(inputs);\n if (!this._bindings.bind(renderer)) {\n gl.disable(gl.SCISSOR_TEST);\n return false;\n }\n gl.disable(gl.DEPTH_TEST);\n if (options.blend) {\n gl.enable(gl.BLEND);\n gl.blendEquation(gl.FUNC_ADD);\n gl.blendFunc(gl.ONE, gl.ONE);\n } else {\n gl.disable(gl.BLEND);\n }\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n gl.disable(gl.SCISSOR_TEST);\n return true;\n }\n\n releaseTarget(target: object) {\n const outputs = this._targetOutputs.get(target);\n if (!outputs) return;\n this._targetOutputs.delete(target);\n for (const texture of (Object.values(outputs) as Texture2D[])) texture.dispose(this._renderer.gl);\n if (outputs === this._outputTextures) this._outputTextures = {} as Record<O, Texture2D>;\n }\n\n getMemoryBytes(target?: object): number {\n const outputs = target ? this._targetOutputs.get(target) ?? {} : this._outputTextures;\n return Array.from(new Set([...Object.values(outputs) as Texture2D[], ...this._retainedOutputs]))\n .reduce((sum, texture) => sum + texture.getMemoryBytes(), 0);\n }\n\n dispose() {\n const gl = this._renderer.gl;\n (Array.from(new Set([this._outputTextures, ...this._targetOutputs.values()])).flatMap(outputs => Object.values(outputs)) as Texture2D[]).forEach((texture) =>\n texture.dispose(gl)\n );\n this._retainedOutputs.forEach(texture => texture.dispose(gl));\n this._retainedOutputs.clear();\n this._frameBuffer.dispose(this._renderer);\n }\n}\n"]}
@@ -45,27 +45,27 @@ void main() {
45
45
  ivec2 p = ivec2(gl_FragCoord.xy);
46
46
  ivec2 size = rawGuideTexRegion();
47
47
  vec2 center = load_rawGuideTex(p, 0).xy;
48
- float mf = 0.0;
49
- float jx = 0.0;
50
- float nW = 0.0;
51
- float jp = 0.0;
48
+ float lM = 0.0;
49
+ float je = 0.0;
50
+ float nM = 0.0;
51
+ float iV = 0.0;
52
52
  for (int dy = -1; dy <= 1; dy++) {
53
53
  for (int dx = -1; dx <= 1; dx++) {
54
54
  vec2 value = load_rawGuideTex(clamp(p + ivec2(dx, dy), ivec2(0), size - 1), 0).xy;
55
- nW += value.x;
56
- jp += value.x * value.x;
55
+ nM += value.x;
56
+ iV += value.x * value.x;
57
57
  if (value.y >= 0.0) {
58
- mf += value.y;
59
- jx += 1.0;
58
+ lM += value.y;
59
+ je += 1.0;
60
60
  }
61
61
  }
62
62
  }
63
63
  float variance;
64
64
  if (center.y >= 0.0) {
65
- variance = mf / jx;
65
+ variance = lM / je;
66
66
  } else {
67
- float me = nW / 9.0;
68
- variance = max(jp / 9.0 - me * me, 0.0) * 9.0 / 8.0;
67
+ float lL = nM / 9.0;
68
+ variance = max(iV / 9.0 - lL * lL, 0.0) * 9.0 / 8.0;
69
69
  }
70
70
  out_guide = vec4(center.x, variance, 0.0, 1.0);
71
71
  }`
@@ -110,38 +110,38 @@ return load_guideTex(clamp(p, ivec2(0), imageSize - 1), 0).xy;
110
110
  }
111
111
 
112
112
 
113
- vec4 sL(ivec2 p) {
113
+ vec4 sI(ivec2 p) {
114
114
  vec4 c = load_colorTex(p, 0);
115
115
  if (decodeInput) c.rgb = mix(pow((max(c.rgb, 0.0) + 0.055) / 1.055, vec3(2.4)),
116
116
  c.rgb / 12.92, lessThanEqual(c.rgb, vec3(0.04045)));
117
117
  return vec4(c.rgb * c.a, c.a);
118
118
  }
119
119
 
120
- float mi(ivec2 q, vec4 bC, vec3 hg) {
120
+ float lP(ivec2 q, vec4 bo, vec3 gO) {
121
121
  vec4 albedo = load_albedoTex(q, 0);
122
122
 
123
123
 
124
- vec3 qd = max((albedo.rgb + bC.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
125
- vec3 lN = (albedo.rgb - bC.rgb) / qd;
126
- float jk = albedo.a - bC.a;
127
- vec3 lX = load_normalTex(q, 0).rgb - hg;
124
+ vec3 pY = max((albedo.rgb + bo.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
125
+ vec3 lu = (albedo.rgb - bo.rgb) / pY;
126
+ float iQ = albedo.a - bo.a;
127
+ vec3 lG = load_normalTex(q, 0).rgb - gO;
128
128
  return max(
129
- dot(lN, lN) * INV_ALBEDO_BANDWIDTH2
130
- + jk * jk * INV_COVERAGE_BANDWIDTH2,
131
- dot(lX, lX) * INV_NORMAL_BANDWIDTH2
129
+ dot(lu, lu) * INV_ALBEDO_BANDWIDTH2
130
+ + iQ * iQ * INV_COVERAGE_BANDWIDTH2,
131
+ dot(lG, lG) * INV_NORMAL_BANDWIDTH2
132
132
  );
133
133
  }
134
134
 
135
135
  void main() {
136
136
  imageSize = guideTexRegion();
137
137
  ivec2 p = ivec2(gl_FragCoord.xy);
138
- vec4 bC = load_albedoTex(p, 0);
139
- vec4 fR = load_normalTex(p, 0);
140
- vec3 hg = fR.rgb;
138
+ vec4 bo = load_albedoTex(p, 0);
139
+ vec4 fC = load_normalTex(p, 0);
140
+ vec3 gO = fC.rgb;
141
141
 
142
142
 
143
- if (fR.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {
144
- vec4 c = sL(p);
143
+ if (fC.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {
144
+ vec4 c = sI(p);
145
145
  vec3 rgb = c.rgb / max(c.a, 1e-6);
146
146
  if (encodeOutput) rgb = mix(1.055 * pow(max(rgb, 0.0), vec3(1.0 / 2.4)) - 0.055,
147
147
  rgb * 12.92, lessThanEqual(rgb, vec3(0.0031308)));
@@ -150,25 +150,25 @@ out_guide = vec4(loadGuide(p), 0.0, 1.0);
150
150
  return;
151
151
  }
152
152
 
153
- vec2 lP[PATCH_SIZE];
153
+ vec2 lA[PATCH_SIZE];
154
154
  int k = 0;
155
155
  for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
156
156
  for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
157
- lP[k] = loadGuide(p + ivec2(dx, dy) * dilation);
157
+ lA[k] = loadGuide(p + ivec2(dx, dy) * dilation);
158
158
  k++;
159
159
  }
160
160
  }
161
161
  float k2 = colorSensitivity * colorSensitivity;
162
162
 
163
163
  vec4 sum = vec4(0.0);
164
- vec3 hk = max(bC.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
165
- vec3 ng = vec3(0.0);
166
- vec3 gN = vec3(0.0);
167
- vec3 hG = vec3(0.0);
168
- float qp = 0.0;
169
- float gP = 0.0;
170
- float oP = 0.0;
171
- float lt = 0.0;
164
+ vec3 gR = max(bo.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
165
+ vec3 mQ = vec3(0.0);
166
+ vec3 gv = vec3(0.0);
167
+ vec3 hm = vec3(0.0);
168
+ float qf = 0.0;
169
+ float gx = 0.0;
170
+ float oE = 0.0;
171
+ float kX = 0.0;
172
172
  for (int sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {
173
173
  for (int sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {
174
174
  ivec2 q = p + ivec2(sx, sy) * dilation;
@@ -176,60 +176,60 @@ if (
176
176
  (sx == 0 && sy == 0) ||
177
177
  q.x < 0 || q.y < 0 || q.x >= imageSize.x || q.y >= imageSize.y
178
178
  ) continue;
179
- float features = mi(q, bC, hg);
179
+ float features = lP(q, bo, gO);
180
180
  if (features > 16.0) continue;
181
181
 
182
- float gk = 0.0;
182
+ float fW = 0.0;
183
183
  k = 0;
184
184
  for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
185
185
  for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
186
- vec2 a = lP[k];
186
+ vec2 a = lA[k];
187
187
  vec2 b = loadGuide(q + ivec2(dx, dy) * dilation);
188
- float rZ = a.x - b.x;
189
- gk += (rZ * rZ
188
+ float rV = a.x - b.x;
189
+ fW += (rV * rV
190
190
  - VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))
191
191
  / (1e-10 + k2 * (a.y + b.y));
192
192
  k++;
193
193
  }
194
194
  }
195
- gk /= float(PATCH_SIZE);
195
+ fW /= float(PATCH_SIZE);
196
196
 
197
- float weight = exp(-max(max(gk, 0.0), features));
197
+ float weight = exp(-max(max(fW, 0.0), features));
198
198
  vec2 g = loadGuide(q);
199
199
 
200
- vec3 a = (load_albedoTex(q, 0).rgb - bC.rgb) / hk;
201
- vec4 value = sL(q);
200
+ vec3 a = (load_albedoTex(q, 0).rgb - bo.rgb) / gR;
201
+ vec4 value = sI(q);
202
202
  sum += value * weight;
203
- ng += a * weight;
204
- gN += a * a * weight;
205
- hG += a * value.rgb * weight;
206
- qp += g.x * weight;
207
- gP += g.y * weight * weight;
208
- oP += weight;
209
- lt = max(lt, weight);
203
+ mQ += a * weight;
204
+ gv += a * a * weight;
205
+ hm += a * value.rgb * weight;
206
+ qf += g.x * weight;
207
+ gx += g.y * weight * weight;
208
+ oE += weight;
209
+ kX = max(kX, weight);
210
210
  }
211
211
  }
212
212
 
213
213
 
214
214
 
215
- vec4 center = sL(p);
216
- vec2 lO = loadGuide(p);
217
- float dR = max(lt, CENTER_WEIGHT_MIN);
218
- float totalWeight = oP + dR;
219
- vec4 mean = (sum + center * dR) / totalWeight;
215
+ vec4 center = sI(p);
216
+ vec2 lw = loadGuide(p);
217
+ float dE = max(kX, CENTER_WEIGHT_MIN);
218
+ float totalWeight = oE + dE;
219
+ vec4 mean = (sum + center * dE) / totalWeight;
220
220
 
221
221
 
222
- vec3 eI = ng / totalWeight;
223
- vec3 mj = max(gN / totalWeight - eI * eI, vec3(0.0));
224
- vec3 rv = hG / totalWeight - eI * mean.rgb;
222
+ vec3 er = mQ / totalWeight;
223
+ vec3 lQ = max(gv / totalWeight - er * er, vec3(0.0));
224
+ vec3 rq = hm / totalWeight - er * mean.rgb;
225
225
 
226
226
 
227
227
 
228
- vec3 rI = bC.rgb + eI * hk;
229
- vec3 po = mean.rgb * hk / max(rI, vec3(${JNLM_ALBEDO_FLOOR}));
230
- vec3 xg = clamp(rv / (mj + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), po);
231
- vec3 sD = mean.rgb - xg * eI;
232
- vec4 filtered = vec4(max(sD, vec3(0.0)), max(mean.a, 0.0));
228
+ vec3 rD = bo.rgb + er * gR;
229
+ vec3 pd = mean.rgb * gR / max(rD, vec3(${JNLM_ALBEDO_FLOOR}));
230
+ vec3 xI = clamp(rq / (lQ + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), pd);
231
+ vec3 sz = mean.rgb - xI * er;
232
+ vec4 filtered = vec4(max(sz, vec3(0.0)), max(mean.a, 0.0));
233
233
  vec3 rgb = filtered.a > 1e-6
234
234
  ? filtered.rgb / max(filtered.a, 1e-6)
235
235
  : center.rgb / max(center.a, 1e-6);
@@ -237,8 +237,8 @@ if (encodeOutput) rgb = mix(1.055 * pow(max(rgb, 0.0), vec3(1.0 / 2.4)) - 0.055,
237
237
  rgb * 12.92, lessThanEqual(rgb, vec3(0.0031308)));
238
238
  out_color = vec4(rgb, filtered.a);
239
239
  out_guide = vec4(
240
- (qp + lO.x * dR) / totalWeight,
241
- (gP + lO.y * dR * dR)
240
+ (qf + lw.x * dE) / totalWeight,
241
+ (gx + lw.y * dE * dE)
242
242
  / (totalWeight * totalWeight),
243
243
  0.0,
244
244
  1.0
@@ -42,11 +42,11 @@ vec4 mask = sample_shadowCatcherTex(v_Texcoord);
42
42
  vec4 background = sample_catcherBackgroundTex(v_Texcoord);
43
43
  float hit = sample_albedoTex(v_Texcoord).a;
44
44
 
45
- float rj = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;
46
- float jo = max(hit - mask.b * rj, 0.0);
45
+ float qZ = max(sample_normalTex(v_Texcoord).a, 1.0) / sampleCount;
46
+ float iT = max(hit - mask.b * qZ, 0.0);
47
47
  out_foreground = vec4(
48
- (light.rgb - background.rgb * rj)
49
- / (jo > 0.0 ? jo : sampleCount),
48
+ (light.rgb - background.rgb * qZ)
49
+ / (iT > 0.0 ? iT : sampleCount),
50
50
  clamp((light.a - background.a) / sampleCount, 0.0, 1.0)
51
51
  );
52
52
  out_catcherBackground = background / sampleCount;
@@ -12,6 +12,10 @@ declare class WebGLRayTracePass {
12
12
  private _aovPrimitiveCache;
13
13
  private readonly _renderer;
14
14
  private _meshes;
15
+ private _emissiveActive;
16
+ private _directLightLegacy?;
17
+ private _emissiveCache;
18
+ private _emissiveTex;
15
19
  private _sceneEnvironment;
16
20
  private _rectLightTextures;
17
21
  private _analyticLights;
@@ -136,8 +140,9 @@ declare class WebGLRayTracePass {
136
140
  bevel: boolean;
137
141
  dispersionWavelengths: 1 | 3;
138
142
  directLightCandidates: number;
143
+ caustics?: import('../Render.js').CausticSettings;
139
144
  }): void;
140
- setWavelength(wavelength: number): void;
145
+ setSpectralChannel(channel: number): void;
141
146
  setSampleCount(sampleCount: number): void;
142
147
  isInvalid(): boolean;
143
148
  hasShadowCatcher(): boolean;
@@ -1,3 +1,6 @@
1
+ import { researchTransport } from './researchTransport.js';
2
+ import { EmissiveTriangleCache } from './lightSampling.js';
3
+ import { prepareWebGLLightSampling } from './webglLightSampling.js';
1
4
  import { AovPrimitiveCache } from './AovPrimitiveCache.js';
2
5
  import { aovTraceFragment } from './glsl/aovTrace.frag.js';
3
6
  import { packAovScene } from './aovScene.js';
@@ -64,6 +67,10 @@ class WebGLRayTracePass {
64
67
  _aovPrimitiveCache = new AovPrimitiveCache();
65
68
  _renderer;
66
69
  _meshes = [];
70
+ _emissiveActive = false;
71
+ _directLightLegacy;
72
+ _emissiveCache = new EmissiveTriangleCache();
73
+ _emissiveTex = new WebGLTexture2D(commonNearestFloatProps);
67
74
  _sceneEnvironment = new SceneEnvironmentCache();
68
75
  _rectLightTextures = new RectLightTextureTracker();
69
76
  _analyticLights = [];
@@ -679,6 +686,7 @@ class WebGLRayTracePass {
679
686
  ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +
680
687
  POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)
681
688
  : fallbackPmf);
689
+ this._directLightLegacy = { env: this._envLightSelectionPmf, pmfs: this._analyticLightSelectionPmfs };
682
690
  let cumulativePmf = this._envLightSelectionPmf;
683
691
  this._analyticLightSelectionCdfs = Float32Array.from(this._analyticLightSelectionPmfs, (pmf) => {
684
692
  cumulativePmf += pmf;
@@ -751,15 +759,16 @@ class WebGLRayTracePass {
751
759
  this._shadowCatcherPass.useTarget(target);
752
760
  }
753
761
  setQuality(options) {
762
+ researchTransport()?.configure(this, 'webgl');
754
763
  this._tracePasses.forEach(pass => {
755
764
  pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
756
765
  pass.setUniform('bevelEnabled', options.bevel);
757
766
  pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
758
767
  });
759
768
  }
760
- setWavelength(wavelength) {
769
+ setSpectralChannel(channel) {
761
770
  this._tracePasses.forEach((pass) => {
762
- pass.setUniform('wavelength', wavelength);
771
+ pass.setUniform('spectralChannel', channel);
763
772
  });
764
773
  }
765
774
  setSampleCount(sampleCount) {
@@ -791,6 +800,29 @@ class WebGLRayTracePass {
791
800
  this._updateMeshColors();
792
801
  if (this._pendingMaterialUpdate)
793
802
  this._updateMaterialData();
803
+ researchTransport()?.prepare(this, 'webgl');
804
+ const res = this._preparedMeshData;
805
+ if (res) {
806
+ const triangles = this._emissiveCache.collect(res.emissiveBindings, res.materials);
807
+ this._mainPass.setDefines({ HAS_EMISSIVE_LIGHTS: triangles.length > 0 });
808
+ if (!triangles.length && this._emissiveActive && this._directLightLegacy) {
809
+ this._envLightSelectionPmf = this._directLightLegacy.env;
810
+ this._analyticLightSelectionPmfs = Float32Array.from(this._directLightLegacy.pmfs);
811
+ this._tracePasses.forEach(pass => pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf));
812
+ this._needsUpdateAnalyticLightsBuffer = true;
813
+ }
814
+ this._emissiveActive = triangles.length > 0;
815
+ if (triangles.length) {
816
+ const lighting = prepareWebGLLightSampling(this._analyticLights, triangles, estimateEnvironmentPower(this._envImageSource));
817
+ this._envLightSelectionPmf = lighting.environmentPmf;
818
+ this._analyticLightSelectionPmfs = Float32Array.from(lighting.analyticPmfs);
819
+ const columns = setDataTexture(this._emissiveTex, lighting.data, 4).columnsLog;
820
+ this._mainPass.setUniforms({ emissiveLightData: this._emissiveTex, emissiveLightColumns: columns,
821
+ emissiveChoiceOffset: lighting.emissiveTexels, emissiveChoiceCount: lighting.choiceCount,
822
+ emissivePmfOffset: lighting.pmfOffset, emissiveWeightTotal: lighting.totalWeight, envLightSelectionPmf: lighting.environmentPmf });
823
+ this._needsUpdateAnalyticLightsBuffer = true;
824
+ }
825
+ }
794
826
  if (this._needsUpdateAnalyticLightsBuffer) {
795
827
  const analyticLights = this._analyticLights;
796
828
  analyticLights.length > 0 &&
@@ -843,12 +875,15 @@ class WebGLRayTracePass {
843
875
  // WebGL has uniform per-pixel counts; setSampleCount already includes offset.
844
876
  setSampleSequenceOffset(_offset) { }
845
877
  prepareAovs(state, camera, width, height, kinds) {
846
- if (!kinds.length || !this._preparedMeshData || !this._tlas)
878
+ if (!kinds.length)
879
+ return true;
880
+ // An AOV channel may be the first thing to render a new scene.
881
+ this.prepare();
882
+ if (!this._preparedMeshData || !this._tlas)
847
883
  return true;
848
884
  const gl = this._renderer.gl;
849
885
  if (!gl.getExtension('EXT_color_buffer_float'))
850
886
  throw new Error('AOV requires EXT_color_buffer_float');
851
- this.prepare();
852
887
  state.resize(width, height);
853
888
  this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & 24) !== 0 });
854
889
  if (!state.frame) {
@@ -868,10 +903,10 @@ class WebGLRayTracePass {
868
903
  return center && accumulation;
869
904
  }
870
905
  renderAovs(state, camera, width, height, samples, cap, kinds, sequenceOffset = 0) {
871
- if (!kinds.length || !this._preparedMeshData || !this._tlas)
872
- return true;
873
906
  if (!this.prepareAovs(state, camera, width, height, kinds))
874
907
  return false;
908
+ if (!kinds.length || !this._preparedMeshData || !this._tlas)
909
+ return true;
875
910
  if (!state.centerReady) {
876
911
  this._aovCenter.createPass({}, state.center);
877
912
  state.centerReady = true;
@@ -901,6 +936,7 @@ class WebGLRayTracePass {
901
936
  return unpackDepthSamples(rgba);
902
937
  }
903
938
  dispose() {
939
+ researchTransport()?.dispose(this, 'webgl');
904
940
  this._skySource.dispose();
905
941
  this._depthAbort.abort();
906
942
  this._materialData?.dispose(this._renderer.gl);
@@ -909,6 +945,7 @@ class WebGLRayTracePass {
909
945
  const gl = this._renderer.gl;
910
946
  [
911
947
  this._lightTex,
948
+ this._emissiveTex,
912
949
  this._openPbrEnergyLut,
913
950
  this._envMap,
914
951
  this._envMapDistribution,