@meimu/mutracer 0.3.0 → 0.3.1

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 (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -5,70 +5,70 @@ export default glsl `
5
5
 
6
6
 
7
7
  vec3 aA(vec3 view, vec2 alpha, vec2 samplePoint) {
8
- vec3 sn = vec3(alpha, 1.0);
9
- vec3 ce = normalize(sn * view);
10
- float qG = min(ce.z, 1.0);
11
- float jN = 1.0 + qG;
12
- float kf = (1.0 - samplePoint.y) * jN;
13
- float sR = samplePoint.y * jN;
14
- float ub = kf + (1.0 - qG);
15
- float dr = sqrt(max(0.0, ub * sR));
8
+ vec3 qD = vec3(alpha, 1.0);
9
+ vec3 cf = normalize(qD * view);
10
+ float rU = min(cf.z, 1.0);
11
+ float ku = 1.0 + rU;
12
+ float kM = (1.0 - samplePoint.y) * ku;
13
+ float ur = samplePoint.y * ku;
14
+ float vK = kM + (1.0 - rU);
15
+ float dw = sqrt(max(0.0, vK * ur));
16
16
  float azimuth = TWOPI * samplePoint.x;
17
- vec3 lX = vec3(
18
- ce.x + dr * cos(azimuth),
19
- ce.y + dr * sin(azimuth),
20
- kf
17
+ vec3 mR = vec3(
18
+ cf.x + dw * cos(azimuth),
19
+ cf.y + dw * sin(azimuth),
20
+ kM
21
21
  );
22
- return normalize(sn * lX);
22
+ return normalize(qD * mR);
23
23
  }
24
24
 
25
- float sampling_ggx_ndf(vec3 oU, vec2 alpha) {
26
- vec3 hl = vec3(
27
- oU.x / alpha.x,
28
- oU.y / alpha.y,
29
- oU.z
25
+ float sampling_ggx_ndf(vec3 qc, vec2 alpha) {
26
+ vec3 hG = vec3(
27
+ qc.x / alpha.x,
28
+ qc.y / alpha.y,
29
+ qc.z
30
30
  );
31
- float ah = dot(hl, hl);
31
+ float ah = dot(hG, hG);
32
32
  return 1.0 / (
33
33
  PI * alpha.x * alpha.y * ah * ah
34
34
  );
35
35
  }
36
36
 
37
37
  float aD(vec3 direction, vec2 alpha) {
38
- float eB = abs(direction.z);
39
- if (eB <= 1e-8) {
38
+ float eK = abs(direction.z);
39
+ if (eK <= 1e-8) {
40
40
  return 0.0;
41
41
  }
42
- vec2 hZ = alpha * direction.xy;
43
- float lY = dot(hZ, hZ)
44
- / (eB * eB);
45
- return 2.0 / (1.0 + sqrt(1.0 + lY));
42
+ vec2 iK = alpha * direction.xy;
43
+ float mS = dot(iK, iK)
44
+ / (eK * eK);
45
+ return 2.0 / (1.0 + sqrt(1.0 + mS));
46
46
  }
47
47
 
48
- float aH(float cosine) {
49
- float cY = clamp(1.0 - cosine, 0.0, 1.0);
50
- return pow(cY, 5.0);
48
+ float aI(float cosine) {
49
+ float da = clamp(1.0 - cosine, 0.0, 1.0);
50
+ return pow(da, 5.0);
51
51
  }
52
52
 
53
- float sampling_dielectric_fresnel(float J, float cE) {
54
- float iB = clamp(abs(J), 0.0, 1.0);
55
- float kv = cE * cE
56
- * max(0.0, 1.0 - iB * iB);
57
- if (kv >= 1.0) {
53
+ float sampling_dielectric_fresnel(float J, float cH) {
54
+ float ja = clamp(abs(J), 0.0, 1.0);
55
+ float ld = cH * cH
56
+ * max(0.0, 1.0 - ja * ja);
57
+ if (ld >= 1.0) {
58
58
  return 1.0;
59
59
  }
60
60
 
61
- float ml = sqrt(max(0.0, 1.0 - kv));
62
- float bd = (iB - cE * ml)
63
- / max(iB + cE * ml, 1e-8);
64
- float qu = (cE * iB - ml)
65
- / max(cE * iB + ml, 1e-8);
61
+ float nh = sqrt(max(0.0, 1.0 - ld));
62
+ float bf = (ja - cH * nh)
63
+ / max(ja + cH * nh, 1e-8);
64
+ float rH = (cH * ja - nh)
65
+ / max(cH * ja + nh, 1e-8);
66
66
  return 0.5 * (
67
- bd * bd + qu * qu
67
+ bf * bf + rH * rH
68
68
  );
69
69
  }
70
70
 
71
- vec2 gi(vec2 samplePoint) {
71
+ vec2 gA(vec2 samplePoint) {
72
72
  vec2 offset = 2.0 * samplePoint - vec2(1.0);
73
73
  if (offset.x == 0.0 && offset.y == 0.0) {
74
74
  return vec2(0.0);
@@ -88,35 +88,35 @@ return radius * vec2(cos(angle), sin(angle));
88
88
  }
89
89
 
90
90
  vec3 aM(vec2 samplePoint) {
91
- vec2 kS = gi(samplePoint);
91
+ vec2 lL = gA(samplePoint);
92
92
  return vec3(
93
- kS,
94
- sqrt(max(0.0, 1.0 - dot(kS, kS)))
93
+ lL,
94
+ sqrt(max(0.0, 1.0 - dot(lL, lL)))
95
95
  );
96
96
  }
97
97
 
98
- float aF(float firstPdf, float secondPdf) {
98
+ float aG(float firstPdf, float secondPdf) {
99
99
  float scale = max(firstPdf, secondPdf);
100
100
  if (scale <= 0.0) {
101
101
  return 0.0;
102
102
  }
103
103
  vec2 normalized = vec2(firstPdf, secondPdf) / scale;
104
- vec2 pq = normalized * normalized;
105
- return pq.x / (pq.x + pq.y);
104
+ vec2 qC = normalized * normalized;
105
+ return qC.x / (qC.x + qC.y);
106
106
  }
107
107
 
108
108
  void sampling_orthonormal_basis(in vec3 normal, out vec3 tangent, out vec3 bitangent) {
109
- float ik = normal.z >= 0.0 ? 1.0 : -1.0;
110
- float cv = -1.0 / (ik + normal.z);
111
- float xy = normal.x * normal.y * cv;
109
+ float iP = normal.z >= 0.0 ? 1.0 : -1.0;
110
+ float cA = -1.0 / (iP + normal.z);
111
+ float xy = normal.x * normal.y * cA;
112
112
  tangent = vec3(
113
- 1.0 + ik * normal.x * normal.x * cv,
114
- ik * xy,
115
- -ik * normal.x
113
+ 1.0 + iP * normal.x * normal.x * cA,
114
+ iP * xy,
115
+ -iP * normal.x
116
116
  );
117
117
  bitangent = vec3(
118
118
  xy,
119
- ik + normal.y * normal.y * cv,
119
+ iP + normal.y * normal.y * cA,
120
120
  -normal.y
121
121
  );
122
122
  }
@@ -125,37 +125,37 @@ vec3 sampling_spectral_rgb_filter(vec3 rgb, int channel) {
125
125
  if (channel == 0) {
126
126
  return rgb;
127
127
  }
128
- vec3 sZ = vec3(0.0);
129
- sZ[channel - 1] = 1.0;
130
- return rgb * sZ;
128
+ vec3 uC = vec3(0.0);
129
+ uC[channel - 1] = 1.0;
130
+ return rgb * uC;
131
131
  }
132
132
 
133
133
  float sampling_cauchy_ior(
134
134
  float wavelength,
135
- float ha,
136
- float hk,
137
- float rm
135
+ float hy,
136
+ float hF,
137
+ float sD
138
138
  ) {
139
- if (wavelength == 0.0 || hk <= 0.0) {
140
- return ha;
139
+ if (wavelength == 0.0 || hF <= 0.0) {
140
+ return hy;
141
141
  }
142
142
 
143
143
  const float FRAUNHOFER_C = 656.3;
144
144
  const float FRAUNHOFER_D = 587.6;
145
145
  const float FRAUNHOFER_F = 486.1;
146
- float jX = 1.0 / (
146
+ float kD = 1.0 / (
147
147
  1.0 / (FRAUNHOFER_F * FRAUNHOFER_F)
148
148
  - 1.0 / (FRAUNHOFER_C * FRAUNHOFER_C)
149
149
  );
150
- float nU = max(rm / hk, 1e-6);
151
- float rR = (ha - 1.0) * jX / nU;
152
- float uO = ha
153
- - rR / (FRAUNHOFER_D * FRAUNHOFER_D);
154
- return uO + rR / (wavelength * wavelength);
150
+ float oT = max(sD / hF, 1e-6);
151
+ float tj = (hy - 1.0) * kD / oT;
152
+ float wx = hy
153
+ - tj / (FRAUNHOFER_D * FRAUNHOFER_D);
154
+ return wx + tj / (wavelength * wavelength);
155
155
  }
156
156
 
157
- vec3 fj(
158
- vec3 gw,
157
+ vec3 dQ(
158
+ vec3 gQ,
159
159
  float anisotropy,
160
160
  vec2 samplePoint
161
161
  ) {
@@ -164,24 +164,24 @@ if (abs(anisotropy) < 0.001) {
164
164
  cosine = 1.0 - 2.0 * samplePoint.y;
165
165
  }
166
166
  else {
167
- float iZ = (1.0 - anisotropy * anisotropy)
167
+ float fw = (1.0 - anisotropy * anisotropy)
168
168
  / (1.0 + anisotropy - 2.0 * anisotropy * samplePoint.y);
169
169
  cosine = (
170
- iZ * iZ - 1.0 - anisotropy * anisotropy
170
+ fw * fw - 1.0 - anisotropy * anisotropy
171
171
  ) / (2.0 * anisotropy);
172
172
  }
173
173
 
174
- float uC = sqrt(max(0.0, 1.0 - cosine * cosine));
174
+ float wk = sqrt(max(0.0, 1.0 - cosine * cosine));
175
175
  float azimuth = TWOPI * samplePoint.x;
176
176
  vec3 tangent;
177
177
  vec3 bitangent;
178
- sampling_orthonormal_basis(gw, tangent, bitangent);
179
- return tangent * (uC * cos(azimuth))
180
- + bitangent * (uC * sin(azimuth))
181
- + gw * cosine;
178
+ sampling_orthonormal_basis(gQ, tangent, bitangent);
179
+ return tangent * (wk * cos(azimuth))
180
+ + bitangent * (wk * sin(azimuth))
181
+ + gQ * cosine;
182
182
  }
183
183
 
184
- float bB(float cosine, float anisotropy) {
184
+ float ba(float cosine, float anisotropy) {
185
185
  float ah = 1.0 + anisotropy * anisotropy
186
186
  + 2.0 * anisotropy * cosine;
187
187
  return INV4PI * (1.0 - anisotropy * anisotropy)
@@ -24,41 +24,41 @@ const uint BOUNCE_STRIDE = 64u;
24
24
 
25
25
 
26
26
 
27
- uvec2 aI;
27
+ uvec2 aJ;
28
28
  uint aC;
29
29
  uint samplingBounce = 0u;
30
- uint ca = 0u;
31
- uint cB(uint kC) {
32
- uint x = kC;
30
+ uint hashedCounter = 0u;
31
+ uint cD(uint lm) {
32
+ uint x = lm;
33
33
  x ^= x >> 16u; x *= 0x7feb352du;
34
34
  x ^= x >> 15u; x *= 0x846ca68bu;
35
35
  return x ^ (x >> 16u);
36
36
  }
37
37
  uint ak(uint a, uint b) {
38
- return cB(a ^ cB(b + 0x9e3779b9u));
38
+ return cD(a ^ cD(b + 0x9e3779b9u));
39
39
  }
40
- uint iD(uint kC, uint seed) {
41
- uint x = kC + seed;
40
+ uint jc(uint lm, uint seed) {
41
+ uint x = lm + seed;
42
42
  x ^= x * 0x6c50b47cu; x ^= x * 0xb82f1e52u;
43
43
  x ^= x * 0xc7afe638u; x ^= x * 0x8d22f6e6u;
44
44
  return x;
45
45
  }
46
- uint ud(uint x, uint seed) {
47
- return reverseBits(iD(reverseBits(x), seed));
46
+ uint vN(uint x, uint seed) {
47
+ return reverseBits(jc(reverseBits(x), seed));
48
48
  }
49
49
 
50
- uint sm(uint kC) {
51
- uint r = reverseBits(kC);
50
+ uint tP(uint lm) {
51
+ uint r = reverseBits(lm);
52
52
  ${sobolD1Steps.map(([shift, mask]) => `r ^= (r << ${shift}u) & 0x${mask.toString(16)}u;`).join("\n ")}
53
53
  return r;
54
54
  }
55
- vec2 yf(uint index, uint seed) {
56
- uint i = ud(index, ak(seed, 0u));
57
- uint x = reverseBits(iD(i, ak(seed, 1u)));
58
- uint y = ud(sm(i), ak(seed, 2u));
55
+ vec2 Ac(uint index, uint seed) {
56
+ uint i = vN(index, ak(seed, 0u));
57
+ uint x = reverseBits(jc(i, ak(seed, 1u)));
58
+ uint y = vN(tP(i), ak(seed, 2u));
59
59
  return vec2(float(x >> 8u), float(y >> 8u)) * (1.0 / 16777216.0);
60
60
  }
61
- uint uX(uvec2 p) {
61
+ uint wL(uvec2 p) {
62
62
  uvec2 v = p & uvec2(255u);
63
63
  v = (v | (v << uvec2(4u))) & uvec2(0x0f0fu);
64
64
  v = (v | (v << uvec2(2u))) & uvec2(0x3333u);
@@ -66,104 +66,104 @@ v = (v | (v << uvec2(1u))) & uvec2(0x5555u);
66
66
  return v.x | (v.y << 1u);
67
67
  }
68
68
  ${zSobolPackedPermutations.map((v, i) => `const uint Z_PERM_${i} = ${v}u;`).join("\n")}
69
- uint kG(uint va) {
70
- uint group = va >> 2u;
69
+ uint lq(uint wO) {
70
+ uint group = wO >> 2u;
71
71
  uint word = Z_PERM_5;
72
72
  ${[0, 1, 2, 3, 4].map(i => `word = group == ${i}u ? Z_PERM_${i} : word;`).join("\n ")}
73
- return (word >> ((va & 3u) * 8u)) & 255u;
73
+ return (word >> ((wO & 3u) * 8u)) & 255u;
74
74
  }
75
- uint qJ(uint kY, uint dim, uint logSPP) {
75
+ uint rX(uint lS, uint dim, uint logSPP) {
76
76
  uint odd = logSPP & 1u;
77
- uint wb = 8u + ((logSPP + 1u) >> 1u);
77
+ uint xX = 8u + ((logSPP + 1u) >> 1u);
78
78
  uint result = 0u;
79
- for (int digit = int(wb) - 1; digit >= int(odd); digit--) {
79
+ for (int digit = int(xX) - 1; digit >= int(odd); digit--) {
80
80
  uint shift = 2u*uint(digit) - odd;
81
81
 
82
- uint tN = 0u;
83
- if (shift < 30u) { tN = kY >> (shift + 2u); }
84
- uint va = (cB(tN ^ (0x55555555u * dim)) >> 24u) % 24u;
85
- uint d = (kY >> shift) & 3u;
86
- result |= ((kG(va) >> (2u*d)) & 3u) << shift;
82
+ uint vs = 0u;
83
+ if (shift < 30u) { vs = lS >> (shift + 2u); }
84
+ uint wO = (cD(vs ^ (0x55555555u * dim)) >> 24u) % 24u;
85
+ uint d = (lS >> shift) & 3u;
86
+ result |= ((lq(wO) >> (2u*d)) & 3u) << shift;
87
87
  }
88
88
  if (odd != 0u) {
89
- result |= (kY & 1u) ^ (cB((kY >> 1u) ^ (0x55555555u * dim)) & 1u);
89
+ result |= (lS & 1u) ^ (cD((lS >> 1u) ^ (0x55555555u * dim)) & 1u);
90
90
  }
91
91
  return result;
92
92
  }
93
93
 
94
94
 
95
95
 
96
- uint bE(uint slot) {
96
+ uint aX(uint slot) {
97
97
  return CAMERA_BEVEL_BASE + uint(BEVEL_SAMPLES) + samplingBounce * BOUNCE_STRIDE + slot;
98
98
  }
99
99
 
100
- uvec4 hg;
101
- uint hh;
102
- bool fA = false;
103
- bool cX = false;
104
- uint dD;
105
- uint gt;
106
- vec2 eJ;
107
- void dm(uint dim) {
100
+ uvec4 hC;
101
+ uint hD;
102
+ bool fM = false;
103
+ bool cZ = false;
104
+ uint dF;
105
+ uint gM;
106
+ vec2 eT;
107
+ void ds(uint dim) {
108
108
 
109
- uint kl = aI.x + aI.y * uint(round(1.0 / pixelSize.x));
110
- uvec4 key = uvec4(dim, aC, kl, uint(sequenceSeed));
111
- if (fA && all(equal(hg, key)) && hh == uint(zSobolLogSPP)) { return; }
112
- hg = key; hh = uint(zSobolLogSPP);
113
- fA = true; cX = false;
114
- uint seed = ak(ak(kl, dim), uint(sequenceSeed));
109
+ uint kT = aJ.x + aJ.y * uint(round(1.0 / pixelSize.x));
110
+ uvec4 key = uvec4(dim, aC, kT, uint(sequenceSeed));
111
+ if (fM && all(equal(hC, key)) && hD == uint(zSobolLogSPP)) { return; }
112
+ hC = key; hD = uint(zSobolLogSPP);
113
+ fM = true; cZ = false;
114
+ uint seed = ak(ak(kT, dim), uint(sequenceSeed));
115
115
  uint index = aC;
116
116
  if (samplingPattern == 1) {
117
117
  uint logSPP = uint(zSobolLogSPP);
118
118
  if (index == 0u) { logSPP = 0u; }
119
119
  else { index -= 1u; }
120
120
 
121
- uint jd = index >> logSPP;
121
+ uint jH = index >> logSPP;
122
122
  uint mask = (1u << logSPP) - 1u;
123
- uint kY = (uX(aI) << logSPP) | (index & mask);
124
- index = qJ(kY, dim, logSPP);
125
- uvec2 tile = aI >> uvec2(8u);
123
+ uint lS = (wL(aJ) << logSPP) | (index & mask);
124
+ index = rX(lS, dim, logSPP);
125
+ uvec2 tile = aJ >> uvec2(8u);
126
126
  seed = ak(ak(dim, uint(sequenceSeed)), ak(tile.x, tile.y));
127
127
 
128
- if (aC != 0u) { jd += 1u; }
129
- seed = ak(seed, jd);
128
+ if (aC != 0u) { jH += 1u; }
129
+ seed = ak(seed, jH);
130
130
  }
131
- dD = ud(index, ak(seed, 0u));
132
- gt = seed;
133
- uint x = reverseBits(iD(dD, ak(seed, 1u)));
134
- eJ.x = float(x >> 8u) * (1.0 / 16777216.0);
131
+ dF = vN(index, ak(seed, 0u));
132
+ gM = seed;
133
+ uint x = reverseBits(jc(dF, ak(seed, 1u)));
134
+ eT.x = float(x >> 8u) * (1.0 / 16777216.0);
135
135
  }
136
- vec2 le(uint dim) {
137
- dm(dim);
138
- if (!cX) {
139
- uint y = ud(sm(dD), ak(gt, 2u));
140
- eJ.y = float(y >> 8u) * (1.0 / 16777216.0);
141
- cX = true;
136
+ vec2 lZ(uint dim) {
137
+ ds(dim);
138
+ if (!cZ) {
139
+ uint y = vN(tP(dF), ak(gM, 2u));
140
+ eT.y = float(y >> 8u) * (1.0 / 16777216.0);
141
+ cZ = true;
142
142
  }
143
- return EPS + (1.0 - 2.0*EPS) * eJ;
143
+ return EPS + (1.0 - 2.0*EPS) * eT;
144
144
  }
145
145
  float sample1D(uint dim) {
146
146
  if (samplingPattern == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
147
- dm(dim);
148
- return EPS + (1.0 - 2.0*EPS) * eJ.x;
147
+ ds(dim);
148
+ return EPS + (1.0 - 2.0*EPS) * eT.x;
149
149
  }
150
150
  vec2 sample2D(uint dim) {
151
151
  if (samplingPattern == 2) {
152
152
  float x = sample1D(dim); float y = sample1D(dim);
153
153
  return vec2(x,y);
154
154
  }
155
- return le(dim);
155
+ return lZ(dim);
156
156
  }
157
157
 
158
- float ek(uint slot) {
159
- uint dim = ak(ak(samplingBounce, slot), ca) | 0x80000000u;
160
- ca += 1u;
158
+ float cm(uint slot) {
159
+ uint dim = ak(ak(samplingBounce, slot), hashedCounter) | 0x80000000u;
160
+ hashedCounter += 1u;
161
161
  if (samplingPattern == 2) { return EPS + (1.0 - 2.0*EPS)*rand(); }
162
162
 
163
- uint kl = aI.x + aI.y * uint(round(1.0 / pixelSize.x));
164
- uint seed = ak(ak(kl, dim), uint(sequenceSeed));
165
- uint i = ud(aC, ak(seed, 0u));
166
- uint x = reverseBits(iD(i, ak(seed, 1u)));
163
+ uint kT = aJ.x + aJ.y * uint(round(1.0 / pixelSize.x));
164
+ uint seed = ak(ak(kT, dim), uint(sequenceSeed));
165
+ uint i = vN(aC, ak(seed, 0u));
166
+ uint x = reverseBits(jc(i, ak(seed, 1u)));
167
167
  return EPS + (1.0 - 2.0*EPS) * (float(x >> 8u) * (1.0 / 16777216.0));
168
168
  }
169
169
  `;
@@ -0,0 +1,6 @@
1
+ export declare const spectralPrefixGlsl = "\nstruct SpectralCompleted {\n bool ready; vec4 result; RayTraceAuxiliary aux;\n uvec4 rng; uint counter; uint bounce;\n};\nSpectralCompleted spCompleted[2];\nbool spActive = true;\nint spChannel;\nint spCall = 0;\nint spForkCall = -1;\nstruct SpectralPrimary {\n SurfaceInteraction si; OpenPbrResolvedMaterial mat; RayTraceAuxiliary aux;\n uvec4 rng; uint counter; uint bounce;\n};\nSpectralPrimary spPrimary;\nbool spDisperses(OpenPbrResolvedMaterial mat) {\n return mat.transmissionDispersionScale > 0.0 && mat.specularIor != 1.0;\n}\nvoid spFork(inout Path path) {\n spActive = false; pathChannel = spChannel;\n path.li = sampling_spectral_rgb_filter(path.li, spChannel);\n}\nvec4 spReplay(int slot, inout RayTraceAuxiliary aux) {\n SpectralCompleted saved = spCompleted[slot];\n aux = saved.aux; s0 = saved.rng; hashedCounter = saved.counter; samplingBounce = saved.bounce;\n return vec4(sampling_spectral_rgb_filter(saved.result.rgb, spChannel), saved.result.a);\n}\nvec4 spFinish(int slot, vec4 result, RayTraceAuxiliary aux) {\n if (!spActive) return result;\n if (spChannel == 1) spCompleted[slot] = SpectralCompleted(true, result, aux, s0, hashedCounter, samplingBounce);\n return vec4(sampling_spectral_rgb_filter(result.rgb, spChannel), result.a);\n}\n";
2
+ export type PrefixBindings = Record<string, [type: string, expression: string]>;
3
+ export declare const prefixRandomBindings: PrefixBindings;
4
+ export declare function prefixCheckpoint(name: string, bindings: PrefixBindings): string;
5
+ export declare function prefixSave(name: string, bindings: PrefixBindings): string;
6
+ export declare function prefixRestore(name: string, bindings: PrefixBindings): string;
@@ -0,0 +1,47 @@
1
+ // The three wavelength continuations run inside one fragment invocation.
2
+ export const spectralPrefixGlsl = /* glsl */ `
3
+ struct eE {
4
+ bool ready; vec4 result; RayTraceAuxiliary aux;
5
+ uvec4 rng; uint counter; uint bounce;
6
+ };
7
+ eE eB[2];
8
+ bool spActive = true;
9
+ int spChannel;
10
+ int qz = 0;
11
+ int fC = -1;
12
+ struct qI {
13
+ SurfaceInteraction si; OpenPbrResolvedMaterial mat; RayTraceAuxiliary aux;
14
+ uvec4 rng; uint counter; uint bounce;
15
+ };
16
+ qI lY;
17
+ bool gf(OpenPbrResolvedMaterial mat) {
18
+ return mat.transmissionDispersionScale > 0.0 && mat.specularIor != 1.0;
19
+ }
20
+ void qA(inout Path path) {
21
+ spActive = false; pathChannel = spChannel;
22
+ path.li = sampling_spectral_rgb_filter(path.li, spChannel);
23
+ }
24
+ vec4 rN(int slot, inout RayTraceAuxiliary aux) {
25
+ eE oM = eB[slot];
26
+ aux = oM.aux; s0 = oM.rng; hashedCounter = oM.counter; samplingBounce = oM.bounce;
27
+ return vec4(sampling_spectral_rgb_filter(oM.result.rgb, spChannel), oM.result.a);
28
+ }
29
+ vec4 spFinish(int slot, vec4 result, RayTraceAuxiliary aux) {
30
+ if (!spActive) return result;
31
+ if (spChannel == 1) eB[slot] = eE(true, result, aux, s0, hashedCounter, samplingBounce);
32
+ return vec4(sampling_spectral_rgb_filter(result.rgb, spChannel), result.a);
33
+ }
34
+ `;
35
+ export const prefixRandomBindings = {
36
+ rng: ['uvec4', 's0'], counter: ['uint', 'hashedCounter'], bounce: ['uint', 'samplingBounce']
37
+ };
38
+ export function prefixCheckpoint(name, bindings) {
39
+ return `struct ${name}State {\n${Object.entries(bindings).map(([key, [type]]) => ` ${type} ${key};`).join('\n')}\n};\n${name}State ${name};\n`;
40
+ }
41
+ export function prefixSave(name, bindings) {
42
+ return Object.entries(bindings).map(([key, [, value]]) => `${name}.${key} = ${value};`).join('\n');
43
+ }
44
+ export function prefixRestore(name, bindings) {
45
+ return Object.entries(bindings).map(([key, [, value]]) => `${value} = ${name}.${key};`).join('\n');
46
+ }
47
+ //# sourceMappingURL=spectralPrefix.glsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spectralPrefix.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/spectralPrefix.glsl.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5C,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC;CAC7F,CAAC;AACF,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,QAAwB;IACrE,OAAO,UAAU,IAAI,YAAY,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,IAAI,KAAK,CAAC;AAClJ,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,QAAwB;IAC/D,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,GAAG,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrG,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAwB;IAClE,OAAO,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrG,CAAC","sourcesContent":["// The three wavelength continuations run inside one fragment invocation.\nexport const spectralPrefixGlsl = /* glsl */ `\nstruct SpectralCompleted {\n bool ready; vec4 result; RayTraceAuxiliary aux;\n uvec4 rng; uint counter; uint bounce;\n};\nSpectralCompleted spCompleted[2];\nbool spActive = true;\nint spChannel;\nint spCall = 0;\nint spForkCall = -1;\nstruct SpectralPrimary {\n SurfaceInteraction si; OpenPbrResolvedMaterial mat; RayTraceAuxiliary aux;\n uvec4 rng; uint counter; uint bounce;\n};\nSpectralPrimary spPrimary;\nbool spDisperses(OpenPbrResolvedMaterial mat) {\n return mat.transmissionDispersionScale > 0.0 && mat.specularIor != 1.0;\n}\nvoid spFork(inout Path path) {\n spActive = false; pathChannel = spChannel;\n path.li = sampling_spectral_rgb_filter(path.li, spChannel);\n}\nvec4 spReplay(int slot, inout RayTraceAuxiliary aux) {\n SpectralCompleted saved = spCompleted[slot];\n aux = saved.aux; s0 = saved.rng; hashedCounter = saved.counter; samplingBounce = saved.bounce;\n return vec4(sampling_spectral_rgb_filter(saved.result.rgb, spChannel), saved.result.a);\n}\nvec4 spFinish(int slot, vec4 result, RayTraceAuxiliary aux) {\n if (!spActive) return result;\n if (spChannel == 1) spCompleted[slot] = SpectralCompleted(true, result, aux, s0, hashedCounter, samplingBounce);\n return vec4(sampling_spectral_rgb_filter(result.rgb, spChannel), result.a);\n}\n`;\nexport type PrefixBindings = Record<string, [type: string, expression: string]>;\nexport const prefixRandomBindings: PrefixBindings = {\n rng: ['uvec4', 's0'], counter: ['uint', 'hashedCounter'], bounce: ['uint', 'samplingBounce']\n};\nexport function prefixCheckpoint(name: string, bindings: PrefixBindings) {\n return `struct ${name}State {\\n${Object.entries(bindings).map(([key, [type]]) => ` ${type} ${key};`).join('\\n')}\\n};\\n${name}State ${name};\\n`;\n}\nexport function prefixSave(name: string, bindings: PrefixBindings) {\n return Object.entries(bindings).map(([key, [, value]]) => `${name}.${key} = ${value};`).join('\\n');\n}\nexport function prefixRestore(name: string, bindings: PrefixBindings) {\n return Object.entries(bindings).map(([key, [, value]]) => `${value} = ${name}.${key};`).join('\\n');\n}\n"]}
@@ -9,16 +9,16 @@ vec4 textureLinear(sampler2D map, vec2 uv) {
9
9
  return texture(map, uv);
10
10
  #else
11
11
  vec2 size = vec2(textureSize(map, 0));
12
- vec2 qQ = 1.0 / size;
12
+ vec2 se = 1.0 / size;
13
13
 
14
14
  uv = uv * size - 0.5;
15
15
  vec2 f = fract(uv);
16
16
  uv = floor(uv) + 0.5;
17
17
 
18
- vec4 s1 = texture(map, (uv + vec2(0, 0)) * qQ);
19
- vec4 s2 = texture(map, (uv + vec2(1, 0)) * qQ);
20
- vec4 s3 = texture(map, (uv + vec2(0, 1)) * qQ);
21
- vec4 s4 = texture(map, (uv + vec2(1, 1)) * qQ);
18
+ vec4 s1 = texture(map, (uv + vec2(0, 0)) * se);
19
+ vec4 s2 = texture(map, (uv + vec2(1, 0)) * se);
20
+ vec4 s3 = texture(map, (uv + vec2(0, 1)) * se);
21
+ vec4 s4 = texture(map, (uv + vec2(1, 1)) * se);
22
22
 
23
23
  return mix(mix(s1, s2, f.x), mix(s3, s4, f.x), f.y);
24
24
  #endif
@@ -8,12 +8,12 @@ float phi = acos(n.y) / PI;
8
8
  return vec2(theta, 1.0 - phi);
9
9
  }
10
10
 
11
- vec2 iO(vec3 pos, vec3 normal, vec2 uvScale) {
12
- vec3 dg = abs(normal);
11
+ vec2 jq(vec3 pos, vec3 normal, vec2 uvScale) {
12
+ vec3 dj = abs(normal);
13
13
  vec2 uv = vec2(0.0);
14
- if (dg.x > dg.y && dg.x > dg.z) {
14
+ if (dj.x > dj.y && dj.x > dj.z) {
15
15
  uv = pos.yz;
16
- } else if (dg.y > dg.x && dg.y > dg.z) {
16
+ } else if (dj.y > dj.x && dj.y > dj.z) {
17
17
  uv = pos.xz;
18
18
  } else {
19
19
  uv = pos.xy;
@@ -53,18 +53,18 @@ return fract(uv * uvScale);
53
53
 
54
54
 
55
55
 
56
- vec2 hA(vec3 pos, vec3 normal) {
56
+ vec2 hW(vec3 pos, vec3 normal) {
57
57
  float theta = atan(pos.z, pos.x) / (2.0 * PI) + 0.5;
58
58
  return vec2(theta, pos.y);
59
59
  }
60
60
 
61
- vec2 gE(int fg, vec3 pos, vec3 normal, vec2 uvScale) {
62
- if (fg == ${uvProjectionConstants.triplanar + ''}) {
63
- return iO(pos, normal, uvScale);
64
- } else if (fg == ${uvProjectionConstants.spherical + ''}) {
61
+ vec2 gW(int fu, vec3 pos, vec3 normal, vec2 uvScale) {
62
+ if (fu == ${uvProjectionConstants.triplanar + ''}) {
63
+ return jq(pos, normal, uvScale);
64
+ } else if (fu == ${uvProjectionConstants.spherical + ''}) {
65
65
  return sphericalProjection(pos) * uvScale;
66
- } else if (fg == ${uvProjectionConstants.cylindrical + ''}) {
67
- return hA(pos, normal) * uvScale;
66
+ } else if (fu == ${uvProjectionConstants.cylindrical + ''}) {
67
+ return hW(pos, normal) * uvScale;
68
68
  }
69
69
  return vec2(0.0);
70
70
  }
@@ -1,3 +1,4 @@
1
+ import cameraProjection from './chunks/cameraProjection.glsl.js';
1
2
  import { FragmentShader, Shader } from '../shader.js';
2
3
  import { DEPTH_SAMPLE_GRID } from '../depthQuery.js';
3
4
  import common from './chunks/common.glsl.js';
@@ -14,6 +15,7 @@ export default new FragmentShader({
14
15
  uniforms: {
15
16
  depthArea: Shader.uniform('vec4'),
16
17
  viewProjectionInv: Shader.uniform('mat4'),
18
+ projectionInv: Shader.uniform('mat4'),
17
19
  viewInv: Shader.uniform('mat4')
18
20
  },
19
21
  main: /* glsl */ `
@@ -24,16 +26,16 @@ ${core.main}
24
26
  ${uvProjection}
25
27
  ${materials.main}
26
28
  ${intersect.main}
29
+ ${cameraProjection}
27
30
 
28
31
  void main() {
32
+ bool picking = depthArea.z < 0.0;
33
+ if (picking && any(greaterThan(gl_FragCoord.xy, vec2(1.0)))) {out_depth = vec4(0.0); return;}
29
34
  vec2 offset = floor(gl_FragCoord.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;
30
- vec2 uv = depthArea.xy + depthArea.zw * offset * vec2(1.0, -1.0);
35
+ vec2 uv = picking ? depthArea.xy : depthArea.xy + depthArea.zw * offset * vec2(1.0, -1.0);
31
36
  out_depth = vec4(0.0);
32
37
  if (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) return;
33
- vec4 origin = viewProjectionInv * vec4(uv * 2.0 - 1.0, -1.0, 1.0);
34
- vec4 target = viewProjectionInv * vec4(uv * 2.0 - 1.0, 1.0, 1.0);
35
- Ray ray;
36
- initRay(ray, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
38
+ Ray ray = cV(uv);
37
39
  vec3 eye = viewInv[3].xyz;
38
40
  vec3 forward = -normalize(viewInv[2].xyz);
39
41
  SurfaceInteraction si;
@@ -44,7 +46,11 @@ if (!si.hit) return;
44
46
  OpenPbrResolvedMaterial material;
45
47
  getMaterial(material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
46
48
  if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {
47
- out_depth.r = max(dot(si.position - eye, forward), 0.0);
49
+ if (picking) {
50
+ uint instance = uint(si.instanceIndex) + 1u, materialIndex = uint(si.materialIndex) + 1u;
51
+ out_depth = vec4(float(instance & 65535u), float(instance >> 16u),
52
+ float(materialIndex & 65535u), float(materialIndex >> 16u));
53
+ } else out_depth.r = max(dot(si.position - eye, forward), 0.0);
48
54
  return;
49
55
  }
50
56
  ray.o = si.position + ray.d * (EPS * 0.02);
@@ -1 +1 @@
1
- {"version":3,"file":"depthQuery.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/depthQuery.frag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,IAAI,MAAM,+BAA+B,CAAC;AACjD,OAAO,SAAS,MAAM,iCAAiC,CAAC;AACxD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAEzC,eAAe,IAAI,cAAc,CAAC;IAChC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;IAC9C,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KAChC;IACD,IAAI,EAAE,UAAU,CAAC;EACjB,MAAM;EACN,IAAI;EACJ,MAAM,CAAC,IAAI;EACX,IAAI,CAAC,IAAI;EACT,YAAY;EACZ,SAAS,CAAC,IAAI;EACd,SAAS,CAAC,IAAI;;;yCAG2B,iBAAiB,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CAwB/D;CACA,CAAC,CAAC","sourcesContent":["import { FragmentShader, Shader } from '../shader.js';\nimport { DEPTH_SAMPLE_GRID } from '../depthQuery.js';\nimport common from './chunks/common.glsl.js';\nimport core from './chunks/rayTraceCore.glsl.js';\nimport materials from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport uvProjection from './chunks/uvProjection.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport rand from './chunks/rand.glsl.js';\n\nexport default new FragmentShader({\n name: 'depthQuery', outputs: ['depth'],\n defines: { DEPTH_QUERY_MODE: true },\n includes: [core, materials, intersect, random],\n uniforms: {\n depthArea: Shader.uniform('vec4'),\n viewProjectionInv: Shader.uniform('mat4'),\n viewInv: Shader.uniform('mat4')\n },\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n\nvoid main() {\n vec2 offset = floor(gl_FragCoord.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;\n vec2 uv = depthArea.xy + depthArea.zw * offset * vec2(1.0, -1.0);\n out_depth = vec4(0.0);\n if (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) return;\n vec4 origin = viewProjectionInv * vec4(uv * 2.0 - 1.0, -1.0, 1.0);\n vec4 target = viewProjectionInv * vec4(uv * 2.0 - 1.0, 1.0, 1.0);\n Ray ray;\n initRay(ray, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n SurfaceInteraction si;\n si.triangleIndex = -1;\n for (int layer = 0; layer < 32; layer++) {\n intersectScene(ray, si, false);\n if (!si.hit) return;\n OpenPbrResolvedMaterial material;\n getMaterial(material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n out_depth.r = max(dot(si.position - eye, forward), 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n`\n});\n"]}
1
+ {"version":3,"file":"depthQuery.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/depthQuery.frag.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,IAAI,MAAM,+BAA+B,CAAC;AACjD,OAAO,SAAS,MAAM,iCAAiC,CAAC;AACxD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,IAAI,MAAM,uBAAuB,CAAC;AAEzC,eAAe,IAAI,cAAc,CAAC;IAChC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC;IAC9C,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACrC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KAChC;IACD,IAAI,EAAE,UAAU,CAAC;EACjB,MAAM;EACN,IAAI;EACJ,MAAM,CAAC,IAAI;EACX,IAAI,CAAC,IAAI;EACT,YAAY;EACZ,SAAS,CAAC,IAAI;EACd,SAAS,CAAC,IAAI;EACd,gBAAgB;;;;;yCAKyB,iBAAiB,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyB/D;CACA,CAAC,CAAC","sourcesContent":["import cameraProjection from './chunks/cameraProjection.glsl.js';\nimport { FragmentShader, Shader } from '../shader.js';\nimport { DEPTH_SAMPLE_GRID } from '../depthQuery.js';\nimport common from './chunks/common.glsl.js';\nimport core from './chunks/rayTraceCore.glsl.js';\nimport materials from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport uvProjection from './chunks/uvProjection.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport rand from './chunks/rand.glsl.js';\n\nexport default new FragmentShader({\n name: 'depthQuery', outputs: ['depth'],\n defines: { DEPTH_QUERY_MODE: true },\n includes: [core, materials, intersect, random],\n uniforms: {\n depthArea: Shader.uniform('vec4'),\n viewProjectionInv: Shader.uniform('mat4'),\n projectionInv: Shader.uniform('mat4'),\n viewInv: Shader.uniform('mat4')\n },\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraProjection}\n\nvoid main() {\n bool picking = depthArea.z < 0.0;\n if (picking && any(greaterThan(gl_FragCoord.xy, vec2(1.0)))) {out_depth = vec4(0.0); return;}\n vec2 offset = floor(gl_FragCoord.xy) / ${DEPTH_SAMPLE_GRID - 1}.0 * 2.0 - 1.0;\n vec2 uv = picking ? depthArea.xy : depthArea.xy + depthArea.zw * offset * vec2(1.0, -1.0);\n out_depth = vec4(0.0);\n if (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) return;\n Ray ray = initCameraRay(uv);\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n SurfaceInteraction si;\n si.triangleIndex = -1;\n for (int layer = 0; layer < 32; layer++) {\n intersectScene(ray, si, false);\n if (!si.hit) return;\n OpenPbrResolvedMaterial material;\n getMaterial(material, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (material.materialType != SHADOW_CATCHER && material.alpha > 0.0) {\n if (picking) {\n uint instance = uint(si.instanceIndex) + 1u, materialIndex = uint(si.materialIndex) + 1u;\n out_depth = vec4(float(instance & 65535u), float(instance >> 16u),\n float(materialIndex & 65535u), float(materialIndex >> 16u));\n } else out_depth.r = max(dot(si.position - eye, forward), 0.0);\n return;\n }\n ray.o = si.position + ray.d * (EPS * 0.02);\n }\n}\n`\n});\n"]}