@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
@@ -11,16 +11,14 @@ import random from './chunks/random.glsl.js';
11
11
  import cameraRay from './chunks/cameraRay.glsl.js';
12
12
  import rand from './chunks/rand.glsl.js';
13
13
  const surface = /* glsl */ `
14
- uint jK(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }
15
- vec3 iu(int offset){return vec3(uintBitsToFloat(jK(offset)),uintBitsToFloat(jK(offset+1)),uintBitsToFloat(jK(offset+2)));}
16
- mat4 oi(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(jK(offset+i*4+j)); return m; }
17
- Ray xj(vec2 uv) {
18
- vec4 origin = viewProjectionInv*vec4(uv*2.0-1.0,-1.0,1.0);
19
- vec4 target = viewProjectionInv*vec4(uv*2.0-1.0,1.0,1.0);
20
- Ray ray; initRay(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;
14
+ uint kp(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }
15
+ vec3 iV(int offset){return vec3(uintBitsToFloat(kp(offset)),uintBitsToFloat(kp(offset+1)),uintBitsToFloat(kp(offset+2)));}
16
+ mat4 lC(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(kp(offset+i*4+j)); return m; }
17
+ Ray zl(vec2 uv) {
18
+ return cV(uv);
21
19
  }
22
- bool mC(Ray xA, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {
23
- Ray ray=xA; si.triangleIndex=-1;
20
+ bool jS(Ray zB, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {
21
+ Ray ray=zB; si.triangleIndex=-1;
24
22
  for(int layer=0;layer<32;layer++) {
25
23
  intersectScene(ray,si,false); if(!si.hit) return false;
26
24
  getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
@@ -35,7 +33,7 @@ export function aovTraceFragment(center) {
35
33
  outputs: center ? ['id', 'motion'] : ['geometry', 'position', 'diffuse', 'specular'],
36
34
  outputTypes: center ? { id: 'uvec4' } : {}, defines: { DEPTH_QUERY_MODE: true },
37
35
  includes: [core, materials, intersect, random],
38
- uniforms: { viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),
36
+ uniforms: { viewProjectionInv: Shader.uniform('mat4'), projectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),
39
37
  cameraApertureRadius: Shader.uniform('float', 0), cameraFocusDistance: Shader.uniform('float', 10),
40
38
  viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),
41
39
  previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),
@@ -57,60 +55,70 @@ ${surface}
57
55
  void main() {
58
56
  ${center ? /* glsl */ `
59
57
  out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);
60
- Ray ray=xj((floor(gl_FragCoord.xy)+0.5)/viewportSize);
58
+ Ray ray=zl((floor(gl_FragCoord.xy)+0.5)/viewportSize);
61
59
  SurfaceInteraction si; OpenPbrResolvedMaterial material;
62
- if(!mC(ray,si,material)) return;
60
+ if(!jS(ray,si,material)) return;
63
61
  int offset=52+si.instanceIndex*24;
64
- out_id=uvec4(jK(offset),jK(offset+1),jK(int(jK(16))+si.materialIndex),jK(int(jK(17))+si.triangleIndex));
65
- out_motion.z=dot(si.position-iu(36),iu(40));
66
- if(jK(offset+2)==0u)return;
67
- vec4 qs=oi(offset+4)*vec4(si.position,1.0);
68
- vec4 pg=oi(0)*qs;
69
- if(pg.w<=0.0)return;
70
- vec3 ua=pg.xyz/pg.w;vec2 hU=(ua.xy*0.5+0.5)*viewportSize;
71
- if(any(lessThan(hU,vec2(0.0)))||any(greaterThanEqual(hU,viewportSize))||abs(ua.z)>1.0)return;
72
- uvec4 identity=texelFetch(previousId,ivec2(hU),0);float qr=texelFetch(previousMotion,ivec2(hU),0).z;
73
- if(any(notEqual(identity.xy,out_id.xy))||abs(qr-dot(qs.xyz-iu(44),iu(48)))>max(1e-4,abs(qr)*1e-3))return;
74
- out_motion=vec4((hU-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);
62
+ out_id=uvec4(kp(offset),kp(offset+1),kp(int(kp(16))+si.materialIndex),kp(int(kp(17))+si.triangleIndex));
63
+ out_motion.z=dot(si.position-iV(36),iV(40));
64
+ if(kp(offset+2)==0u)return;
65
+ vec4 rF=lC(offset+4)*vec4(si.position,1.0);
66
+ vec4 qp=lC(0)*rF;
67
+ if(qp.w<=0.0)return;
68
+ vec3 vJ=qp.xyz/qp.w;vec2 iF=(vJ.xy*0.5+0.5)*viewportSize;
69
+ if(any(lessThan(iF,vec2(0.0)))||any(greaterThanEqual(iF,viewportSize))||abs(vJ.z)>1.0)return;
70
+ uvec4 identity=texelFetch(previousId,ivec2(iF),0);float rE=texelFetch(previousMotion,ivec2(iF),0).z;
71
+ if(any(notEqual(identity.xy,out_id.xy))||abs(rE-dot(rF.xyz-iV(44),iV(48)))>max(1e-4,abs(rE)*1e-3))return;
72
+ out_motion=vec4((iF-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);
75
73
  ` : /* glsl */ `
76
74
  ivec2 coord=ivec2(gl_FragCoord.xy);
77
75
  out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);
78
76
  out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);
79
77
  out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);
80
78
  out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);
81
- rA(); aI=uvec2(floor(gl_FragCoord.xy));
82
- fi(floor(gl_FragCoord.xy),int(aC ^ cB(uint(sequenceSeed))));
83
- Ray ray=xj((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);
79
+ sP(); aJ=uvec2(floor(gl_FragCoord.xy));
80
+ fA(floor(gl_FragCoord.xy),int(aC ^ cD(uint(sequenceSeed))));
81
+ Ray ray=zl((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);
84
82
  if(cameraApertureRadius>0.0) {
85
83
  vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);
86
- vec3 ju=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));
87
- vec2 uV=cameraApertureRadius*kq(sample2D(CAMERA_LENS));
88
- vec3 origin=(viewInv*vec4(uV,0.0,1.0)).xyz;
89
- initRay(ray,origin,normalize(ju-origin));
84
+ vec3 jY=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));
85
+ vec2 wJ=cameraApertureRadius*kX(sample2D(CAMERA_LENS));
86
+ vec3 origin=(viewInv*vec4(wJ,0.0,1.0)).xyz;
87
+ initRay(ray,origin,normalize(jY-origin));
90
88
  }
91
89
  SurfaceInteraction si; OpenPbrResolvedMaterial material;
92
- if(!mC(ray,si,material)) return;
90
+ if(!jS(ray,si,material)) return;
93
91
  float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);
94
92
  bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;
95
93
  out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);
96
94
  #ifdef AOV_REFLECTANCE
97
95
  if((aovMask&24)!=0 && !unsupported){
98
- vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),fa=-dot(face,ray.d);
96
+ vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),fk=-dot(face,ray.d);
99
97
  if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){
100
- if(cosine<0.0){normal=-normal;cosine=-cosine;}if(fa<0.0){face=-face;fa=-fa;}
98
+ if(cosine<0.0){normal=-normal;cosine=-cosine;}if(fk<0.0){face=-face;fk=-fk;}
101
99
  }
102
- if(fa>=0.0&&cosine<0.0){normal=face;cosine=fa;}
100
+ if(fk>=0.0&&cosine<0.0){normal=face;cosine=fk;}
103
101
  if(cosine<0.0)normal=-normal;
104
102
  material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;
105
103
  vec3 tangent=vec3(0.0);
106
104
  #ifdef USE_TANGENT
107
105
  tangent=si.tangent;
108
106
  #endif
109
- OpenPbrPreparedBsdf prepared=bV(tangent,material,-ray.d,normal);
107
+ OpenPbrPreparedBsdf prepared=bX(tangent,material,-ray.d,normal);
110
108
  vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);
111
- out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);
109
+ if((aovMask&8)!=0)out_diffuse+=vec4(diffuse,1.0);
110
+ if((aovMask&16)!=0)out_specular+=vec4(specular,1.0);
112
111
  }
113
112
  #endif
113
+
114
+ if((aovMask&384)!=0 && material.materialType==STANDARD && material.alpha>=1.0 && material.transmissionWeight<=0.0 && dot(material.mediumScattering,material.mediumScattering)<=0.0){
115
+ float metal=clamp(material.baseMetalness,0.0,1.0);
116
+ vec3 base=material.baseWeight*material.baseColor;
117
+ vec3 layer=mix(vec3(1.0),material.coatColor,clamp(material.coatWeight,0.0,1.0));
118
+ float f=(material.specularIor-1.0)/(material.specularIor+1.0);
119
+ if((aovMask&128)!=0)out_diffuse+=vec4(layer*base*(1.0-metal),1.0);
120
+ if((aovMask&256)!=0)out_specular+=vec4(layer*(metal*base+(1.0-metal)*material.specularWeight*material.specularColor*f*f),1.0);
121
+ }
114
122
  out_position+=vec4(si.position,1.0);
115
123
  `}
116
124
  }
@@ -1 +1 @@
1
- {"version":3,"file":"aovTrace.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/aovTrace.frag.ts"],"names":[],"mappings":"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","sourcesContent":["import bsdf from './chunks/openPbrBsdf.glsl.js';\nimport sampling from './chunks/sampling.glsl.js';\nimport reflectance from './aovReflectance.glsl.js';\nimport {FragmentShader, Shader} from '../shader.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 cameraRay from './chunks/cameraRay.glsl.js';\nimport rand from './chunks/rand.glsl.js';\nconst surface = /* glsl */ `\nuint aovWord(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }\nvec3 aovVector(int offset){return vec3(uintBitsToFloat(aovWord(offset)),uintBitsToFloat(aovWord(offset+1)),uintBitsToFloat(aovWord(offset+2)));}\nmat4 aovMatrix(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(aovWord(offset+i*4+j)); return m; }\nRay aovRay(vec2 uv) {\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; initRay(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;\n}\nbool aovSurface(Ray inputRay, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {\n Ray ray=inputRay; si.triangleIndex=-1;\n for(int layer=0;layer<32;layer++) {\n intersectScene(ray,si,false); if(!si.hit) return false;\n getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);\n if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;\n ray.o=si.position+ray.d*(EPS*0.02);\n }\n return false;\n}\n`;\nexport function aovTraceFragment(center: boolean) {\n const shader = new FragmentShader({name: center ? 'AOV center' : 'AOV accumulation',\n outputs: center ? ['id','motion'] : ['geometry','position','diffuse','specular'],\n outputTypes: center ? {id: 'uvec4'} : {}, defines: {DEPTH_QUERY_MODE: true},\n includes: [core,materials,intersect,random],\n uniforms: {viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float',0), cameraFocusDistance: Shader.uniform('float',10),\n viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),\n previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),\n previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),\n previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),\n openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int',0),\n aovSample: Shader.uniform('int',0)},\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraRay}\n${center ? '' : sampling+bsdf+reflectance}\n${surface}\nvoid main() {\n ${center ? /* glsl */ `\n out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);\n Ray ray=aovRay((floor(gl_FragCoord.xy)+0.5)/viewportSize);\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n int offset=52+si.instanceIndex*24;\n out_id=uvec4(aovWord(offset),aovWord(offset+1),aovWord(int(aovWord(16))+si.materialIndex),aovWord(int(aovWord(17))+si.triangleIndex));\n out_motion.z=dot(si.position-aovVector(36),aovVector(40));\n if(aovWord(offset+2)==0u)return;\n vec4 oldWorld=aovMatrix(offset+4)*vec4(si.position,1.0);\n vec4 oldClip=aovMatrix(0)*oldWorld;\n if(oldClip.w<=0.0)return;\n vec3 oldNdc=oldClip.xyz/oldClip.w;vec2 oldPixel=(oldNdc.xy*0.5+0.5)*viewportSize;\n if(any(lessThan(oldPixel,vec2(0.0)))||any(greaterThanEqual(oldPixel,viewportSize))||abs(oldNdc.z)>1.0)return;\n uvec4 identity=texelFetch(previousId,ivec2(oldPixel),0);float oldDepth=texelFetch(previousMotion,ivec2(oldPixel),0).z;\n if(any(notEqual(identity.xy,out_id.xy))||abs(oldDepth-dot(oldWorld.xyz-aovVector(44),aovVector(48)))>max(1e-4,abs(oldDepth)*1e-3))return;\n out_motion=vec4((oldPixel-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);\n ` : /* glsl */ `\n ivec2 coord=ivec2(gl_FragCoord.xy);\n out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);\n out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);\n out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);\n out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);\n initRandom(); samplingPixel=uvec2(floor(gl_FragCoord.xy));\n rng_initialize(floor(gl_FragCoord.xy),int(pixelSampleIndex ^ sampleHash(uint(sequenceSeed))));\n Ray ray=aovRay((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);\n if(cameraApertureRadius>0.0) {\n vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);\n vec3 focusPoint=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));\n vec2 lens=cameraApertureRadius*sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin=(viewInv*vec4(lens,0.0,1.0)).xyz;\n initRay(ray,origin,normalize(focusPoint-origin));\n }\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);\n bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;\n out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);\n #ifdef AOV_REFLECTANCE\n if((aovMask&24)!=0 && !unsupported){\n vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),faceCosine=-dot(face,ray.d);\n if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){\n if(cosine<0.0){normal=-normal;cosine=-cosine;}if(faceCosine<0.0){face=-face;faceCosine=-faceCosine;}\n }\n if(faceCosine>=0.0&&cosine<0.0){normal=face;cosine=faceCosine;}\n if(cosine<0.0)normal=-normal;\n material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;\n vec3 tangent=vec3(0.0);\n#ifdef USE_TANGENT\n tangent=si.tangent;\n#endif\n OpenPbrPreparedBsdf prepared=openpbr_prepare(tangent,material,-ray.d,normal);\n vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);\n out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);\n }\n #endif\n out_position+=vec4(si.position,1.0);\n `}\n}\n`});\n shader.parallelCompile = true;\n return shader;\n}\n"]}
1
+ {"version":3,"file":"aovTrace.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/aovTrace.frag.ts"],"names":[],"mappings":"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","sourcesContent":["import bsdf from './chunks/openPbrBsdf.glsl.js';\nimport sampling from './chunks/sampling.glsl.js';\nimport reflectance from './aovReflectance.glsl.js';\nimport {FragmentShader, Shader} from '../shader.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 cameraRay from './chunks/cameraRay.glsl.js';\nimport rand from './chunks/rand.glsl.js';\nconst surface = /* glsl */ `\nuint aovWord(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }\nvec3 aovVector(int offset){return vec3(uintBitsToFloat(aovWord(offset)),uintBitsToFloat(aovWord(offset+1)),uintBitsToFloat(aovWord(offset+2)));}\nmat4 aovMatrix(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(aovWord(offset+i*4+j)); return m; }\nRay aovRay(vec2 uv) {\n return initCameraRay(uv);\n}\nbool aovSurface(Ray inputRay, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {\n Ray ray=inputRay; si.triangleIndex=-1;\n for(int layer=0;layer<32;layer++) {\n intersectScene(ray,si,false); if(!si.hit) return false;\n getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);\n if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;\n ray.o=si.position+ray.d*(EPS*0.02);\n }\n return false;\n}\n`;\nexport function aovTraceFragment(center: boolean) {\n const shader = new FragmentShader({name: center ? 'AOV center' : 'AOV accumulation',\n outputs: center ? ['id','motion'] : ['geometry','position','diffuse','specular'],\n outputTypes: center ? {id: 'uvec4'} : {}, defines: {DEPTH_QUERY_MODE: true},\n includes: [core,materials,intersect,random],\n uniforms: {viewProjectionInv: Shader.uniform('mat4'), projectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float',0), cameraFocusDistance: Shader.uniform('float',10),\n viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),\n previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),\n previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),\n previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),\n openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int',0),\n aovSample: Shader.uniform('int',0)},\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraRay}\n${center ? '' : sampling+bsdf+reflectance}\n${surface}\nvoid main() {\n ${center ? /* glsl */ `\n out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);\n Ray ray=aovRay((floor(gl_FragCoord.xy)+0.5)/viewportSize);\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n int offset=52+si.instanceIndex*24;\n out_id=uvec4(aovWord(offset),aovWord(offset+1),aovWord(int(aovWord(16))+si.materialIndex),aovWord(int(aovWord(17))+si.triangleIndex));\n out_motion.z=dot(si.position-aovVector(36),aovVector(40));\n if(aovWord(offset+2)==0u)return;\n vec4 oldWorld=aovMatrix(offset+4)*vec4(si.position,1.0);\n vec4 oldClip=aovMatrix(0)*oldWorld;\n if(oldClip.w<=0.0)return;\n vec3 oldNdc=oldClip.xyz/oldClip.w;vec2 oldPixel=(oldNdc.xy*0.5+0.5)*viewportSize;\n if(any(lessThan(oldPixel,vec2(0.0)))||any(greaterThanEqual(oldPixel,viewportSize))||abs(oldNdc.z)>1.0)return;\n uvec4 identity=texelFetch(previousId,ivec2(oldPixel),0);float oldDepth=texelFetch(previousMotion,ivec2(oldPixel),0).z;\n if(any(notEqual(identity.xy,out_id.xy))||abs(oldDepth-dot(oldWorld.xyz-aovVector(44),aovVector(48)))>max(1e-4,abs(oldDepth)*1e-3))return;\n out_motion=vec4((oldPixel-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);\n ` : /* glsl */ `\n ivec2 coord=ivec2(gl_FragCoord.xy);\n out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);\n out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);\n out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);\n out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);\n initRandom(); samplingPixel=uvec2(floor(gl_FragCoord.xy));\n rng_initialize(floor(gl_FragCoord.xy),int(pixelSampleIndex ^ sampleHash(uint(sequenceSeed))));\n Ray ray=aovRay((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);\n if(cameraApertureRadius>0.0) {\n vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);\n vec3 focusPoint=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));\n vec2 lens=cameraApertureRadius*sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin=(viewInv*vec4(lens,0.0,1.0)).xyz;\n initRay(ray,origin,normalize(focusPoint-origin));\n }\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);\n bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;\n out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);\n #ifdef AOV_REFLECTANCE\n if((aovMask&24)!=0 && !unsupported){\n vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),faceCosine=-dot(face,ray.d);\n if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){\n if(cosine<0.0){normal=-normal;cosine=-cosine;}if(faceCosine<0.0){face=-face;faceCosine=-faceCosine;}\n }\n if(faceCosine>=0.0&&cosine<0.0){normal=face;cosine=faceCosine;}\n if(cosine<0.0)normal=-normal;\n material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;\n vec3 tangent=vec3(0.0);\n#ifdef USE_TANGENT\n tangent=si.tangent;\n#endif\n OpenPbrPreparedBsdf prepared=openpbr_prepare(tangent,material,-ray.d,normal);\n vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);\n if((aovMask&8)!=0)out_diffuse+=vec4(diffuse,1.0);\n if((aovMask&16)!=0)out_specular+=vec4(specular,1.0);\n }\n #endif\n // Resolved texture colors (diffuseColor/specularColor), matching WGSL.\n if((aovMask&384)!=0 && material.materialType==STANDARD && material.alpha>=1.0 && material.transmissionWeight<=0.0 && dot(material.mediumScattering,material.mediumScattering)<=0.0){\n float metal=clamp(material.baseMetalness,0.0,1.0);\n vec3 base=material.baseWeight*material.baseColor;\n vec3 layer=mix(vec3(1.0),material.coatColor,clamp(material.coatWeight,0.0,1.0));\n float f=(material.specularIor-1.0)/(material.specularIor+1.0);\n if((aovMask&128)!=0)out_diffuse+=vec4(layer*base*(1.0-metal),1.0);\n if((aovMask&256)!=0)out_specular+=vec4(layer*(metal*base+(1.0-metal)*material.specularWeight*material.specularColor*f*f),1.0);\n }\n out_position+=vec4(si.position,1.0);\n `}\n}\n`});\n shader.parallelCompile = true;\n return shader;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nRay initCameraRay(vec2 coord) {\n vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n vec3 direction = center.xyz * origin.w - origin.xyz * center.w;\n Ray cam;\n initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,\n normalize((viewInv * vec4(direction, 0.0)).xyz));\n return cam;\n}\n";
2
+ export default _default;
@@ -0,0 +1,16 @@
1
+ // Portions adapted from ray-tracing-renderer@0.10.15
2
+ // (https://github.com/hoverinc/ray-tracing-renderer).
3
+ // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ // Keep unprojection in camera space to avoid cancellation from world translation.
5
+ export default /* glsl */ `
6
+ Ray cV(vec2 coord) {
7
+ vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);
8
+ vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);
9
+ vec3 direction = center.xyz * origin.w - origin.xyz * center.w;
10
+ Ray cam;
11
+ initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,
12
+ normalize((viewInv * vec4(direction, 0.0)).xyz));
13
+ return cam;
14
+ }
15
+ `;
16
+ //# sourceMappingURL=cameraProjection.glsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cameraProjection.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraProjection.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,kFAAkF;AAClF,eAAe,UAAU,CAAC;;;;;;;;;;CAUzB,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Keep unprojection in camera space to avoid cancellation from world translation.\nexport default /* glsl */ `\nRay initCameraRay(vec2 coord) {\n vec4 origin = projectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 center = projectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n vec3 direction = center.xyz * origin.w - origin.xyz * center.w;\n Ray cam;\n initRay(cam, (viewInv * vec4(origin.xyz / origin.w, 1.0)).xyz,\n normalize((viewInv * vec4(direction, 0.0)).xyz));\n return cam;\n}\n`;\n"]}
@@ -1,2 +1,2 @@
1
- declare const _default: "\nRay initCameraRay(vec2 coord) {\n vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n Ray cam;\n initRay(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));\n\n return cam;\n}\n\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n";
1
+ declare const _default: string;
2
2
  export default _default;
@@ -1,18 +1,11 @@
1
1
  // Portions adapted from ray-tracing-renderer@0.10.15
2
2
  // (https://github.com/hoverinc/ray-tracing-renderer).
3
3
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
+ import cameraProjection from './cameraProjection.glsl.js';
4
5
  // Shared primary-ray construction keeps beauty and catcher coverage aligned.
5
6
  export default /* glsl */ `
6
- Ray eT(vec2 coord) {
7
- vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);
8
- vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);
9
- Ray cam;
10
- initRay(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
11
-
12
- return cam;
13
- }
14
-
15
- vec2 kq(vec2 p) {
7
+ ${cameraProjection}
8
+ vec2 kX(vec2 p) {
16
9
  p = 2.0 * p - 1.0;
17
10
  bool greater = abs(p.x) > abs(p.y);
18
11
  float r = greater ? p.x : p.y;
@@ -20,16 +13,16 @@ float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);
20
13
  return r * vec2(cos(theta), sin(theta));
21
14
  }
22
15
 
23
- Ray ow() {
24
- Ray cam = eT(v_Texcoord + te());
16
+ Ray pq() {
17
+ Ray cam = cV(v_Texcoord + uH());
25
18
  if (cameraApertureRadius > 0.0) {
26
19
 
27
20
  vec3 eye = viewInv[3].xyz;
28
21
  vec3 forward = -normalize(viewInv[2].xyz);
29
- vec3 ju = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));
30
- vec2 sH = cameraApertureRadius * kq(sample2D(CAMERA_LENS));
31
- vec3 origin = vec3(viewInv * vec4(sH, 0.0, 1.0));
32
- initRay(cam, origin, normalize(ju - origin));
22
+ vec3 jY = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));
23
+ vec2 uh = cameraApertureRadius * kX(sample2D(CAMERA_LENS));
24
+ vec3 origin = vec3(viewInv * vec4(uh, 0.0, 1.0));
25
+ initRay(cam, origin, normalize(jY - origin));
33
26
  }
34
27
  return cam;
35
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cameraRay.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraRay.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,6EAA6E;AAC7E,eAAe,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+BzB,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\n// Shared primary-ray construction keeps beauty and catcher coverage aligned.\nexport default /* glsl */ `\nRay initCameraRay(vec2 coord) {\n vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);\n vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);\n Ray cam;\n initRay(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));\n\n return cam;\n}\n\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n`;\n"]}
1
+ {"version":3,"file":"cameraRay.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/cameraRay.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,gBAAgB,MAAM,4BAA4B,CAAC;AAE1D,6EAA6E;AAC7E,eAAe,UAAU,CAAC;EACxB,gBAAgB;;;;;;;;;;;;;;;;;;;;;;CAsBjB,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport cameraProjection from './cameraProjection.glsl.js';\n\n// Shared primary-ray construction keeps beauty and catcher coverage aligned.\nexport default /* glsl */ `\n${cameraProjection}\nvec2 sampleCircle(vec2 p) {\n p = 2.0 * p - 1.0;\n bool greater = abs(p.x) > abs(p.y);\n float r = greater ? p.x : p.y;\n float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);\n return r * vec2(cos(theta), sin(theta));\n}\n\nRay primaryCameraRay() {\n Ray cam = initCameraRay(v_Texcoord + pixelJitter());\n if (cameraApertureRadius > 0.0) {\n // Thin lens: the focus plane is perpendicular to the view direction.\n vec3 eye = viewInv[3].xyz;\n vec3 forward = -normalize(viewInv[2].xyz);\n vec3 focusPoint = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));\n vec2 lensPoint = cameraApertureRadius * sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin = vec3(viewInv * vec4(lensPoint, 0.0, 1.0));\n initRay(cam, origin, normalize(focusPoint - origin));\n }\n return cam;\n}\n`;\n"]}
@@ -1,16 +1,16 @@
1
1
  export default /* glsl */ `
2
- vec4 ei(int i) { return fetchData(emissiveLightData,i,emissiveLightColumns); }
3
- void jb(vec3 x, vec3 rnd, inout LightSampleRec ls) {
2
+ vec4 ep(int i) { return fetchData(emissiveLightData,i,emissiveLightColumns); }
3
+ void pc(vec3 x, vec3 rnd, inout LightSampleRec ls) {
4
4
  ls.pdf=0.0;ls.isDelta=false;ls.sourceType=0;ls.sourceIndex=-1;
5
5
  if(emissiveChoiceCount<=0) return;
6
6
  float scaled=rnd.z*float(emissiveChoiceCount);int column=min(int(scaled),emissiveChoiceCount-1);
7
- vec4 first=ei(emissiveChoiceOffset+column);
7
+ vec4 first=ep(emissiveChoiceOffset+column);
8
8
  int chosen=fract(scaled)<first.x?column:floatBitsToInt(first.y);
9
- vec4 choice=ei(emissiveChoiceOffset+chosen);int kind=floatBitsToInt(choice.z),index=floatBitsToInt(choice.w);
10
- float pmf=ei(emissivePmfOffset+chosen).x;
9
+ vec4 choice=ep(emissiveChoiceOffset+chosen);int kind=floatBitsToInt(choice.z),index=floatBitsToInt(choice.w);
10
+ float pmf=ep(emissivePmfOffset+chosen).x;
11
11
  if(kind==1) {
12
12
  #ifdef USE_ENVMAP
13
- ig(rnd.xy,ls);ls.pdf*=pmf;
13
+ iM(rnd.xy,ls);ls.pdf*=pmf;
14
14
  #endif
15
15
  } else if(kind==2) {
16
16
  #ifdef NUM_LIGHTS
@@ -20,8 +20,8 @@ ls.sourceType=2;ls.sourceIndex=index;
20
20
  sampleAnalyticLight(light,x,rnd.xy,ls);ls.pdf*=pmf;
21
21
  #endif
22
22
  } else if(kind==3) {
23
- vec4 a=ei(index*6),b=ei(index*6+1),c=ei(index*6+2);
24
- vec4 d=ei(index*6+3),e=ei(index*6+4),f=ei(index*6+5);
23
+ vec4 a=ep(index*6),b=ep(index*6+1),c=ep(index*6+2);
24
+ vec4 d=ep(index*6+3),e=ep(index*6+4),f=ep(index*6+5);
25
25
  float u=sqrt(rnd.x);vec3 bary=vec3(1.0-u,u*(1.0-rnd.y),u*rnd.y);
26
26
  vec3 p=a.xyz*bary.x+b.xyz*bary.y+c.xyz*bary.z;
27
27
  ls.normal=normalize(cross(b.xyz-a.xyz,c.xyz-a.xyz));ls.direction=normalize(p-x);ls.dist=distance(x,p);
@@ -16,17 +16,17 @@ export default createShaderMixin({
16
16
  groundedBackgroundCenter: Shader.uniform('vec2')
17
17
  },
18
18
  main: glsl `
19
- vec2 eF(vec3 gh) {
20
- float phi = mod(atan(-gh.z, -gh.x), TWOPI);
21
- float theta = acos(clamp(gh.y, -1.0, 1.0));
19
+ vec2 eP(vec3 gz) {
20
+ float phi = mod(atan(-gz.z, -gz.x), TWOPI);
21
+ float theta = acos(clamp(gz.y, -1.0, 1.0));
22
22
  return vec2(phi * 0.5 * INVPI, theta * INVPI);
23
23
  }
24
24
 
25
- vec2 cT(vec3 nD) {
26
- return eF(transpose(environmentRotation) * nD);
25
+ vec2 cU(vec3 oA) {
26
+ return eP(transpose(environmentRotation) * oA);
27
27
  }
28
28
 
29
- float rv(float u, out int vOffset, out float pdf) {
29
+ float sN(float u, out int vOffset, out float pdf) {
30
30
  ivec2 size = textureSize(envMap, 0);
31
31
 
32
32
  int left = 0;
@@ -52,7 +52,7 @@ pdf = s0.y;
52
52
  return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);
53
53
  }
54
54
 
55
- float ru(float u, int vOffset, out float pdf) {
55
+ float sM(float u, int vOffset, out float pdf) {
56
56
  ivec2 size = textureSize(envMap, 0);
57
57
 
58
58
  int left = 0;
@@ -66,16 +66,16 @@ left = mid + 1;
66
66
  right = mid;
67
67
  }
68
68
  }
69
- int pw = left - 1;
69
+ int qG = left - 1;
70
70
 
71
71
 
72
72
 
73
- vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + pw, vOffset), 0).xy;
74
- vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + pw + 1, vOffset), 0).xy;
73
+ vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + qG, vOffset), 0).xy;
74
+ vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + qG + 1, vOffset), 0).xy;
75
75
 
76
76
  pdf = s0.y;
77
77
 
78
- return (float(pw) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
78
+ return (float(qG) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
79
79
  }
80
80
 
81
81
 
@@ -86,21 +86,21 @@ return partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);
86
86
  }
87
87
 
88
88
 
89
- vec3 pn(vec2 random, out vec2 uv, out float pdf) {
89
+ vec3 qx(vec2 random, out vec2 uv, out float pdf) {
90
90
  vec2 partialPdf;
91
91
  int vOffset;
92
92
 
93
- uv.y = rv(random.x, vOffset, partialPdf.y);
94
- uv.x = ru(random.y, vOffset, partialPdf.x);
93
+ uv.y = sN(random.x, vOffset, partialPdf.y);
94
+ uv.x = sM(random.y, vOffset, partialPdf.x);
95
95
 
96
96
  float phi = uv.x * TWOPI;
97
97
  float theta = uv.y * PI;
98
- float ct = cos(theta);
98
+ float cv = cos(theta);
99
99
  float sinTheta = sin(theta);
100
- float vZ = cos(phi);
101
- float wr = sin(phi);
100
+ float xV = cos(phi);
101
+ float yo = sin(phi);
102
102
 
103
- vec3 dir = vec3(-sinTheta * vZ, ct, -sinTheta * wr);
103
+ vec3 dir = vec3(-sinTheta * xV, cv, -sinTheta * yo);
104
104
 
105
105
  pdf = envMapSolidAnglePdf(partialPdf, uv.y);
106
106
 
@@ -112,82 +112,82 @@ vec2 size = vec2(textureSize(envMap, 0));
112
112
 
113
113
  ivec2 pixel = clamp(ivec2(uv * size), ivec2(0), ivec2(size) - ivec2(1));
114
114
 
115
- float ue = texelFetch(envMapDistribution, ivec2(1 + pixel.x, pixel.y), 0).y;
116
- float uf = texelFetch(envMapDistribution, ivec2(0, pixel.y), 0).y;
115
+ float vO = texelFetch(envMapDistribution, ivec2(1 + pixel.x, pixel.y), 0).y;
116
+ float vP = texelFetch(envMapDistribution, ivec2(0, pixel.y), 0).y;
117
117
 
118
- return envMapSolidAnglePdf(vec2(ue, uf), uv.y);
118
+ return envMapSolidAnglePdf(vec2(vO, vP), uv.y);
119
119
  }
120
120
 
121
- float di(vec3 point, float height, float radius) {
122
- float fQ = length(point);
123
- if (fQ < 0.00001) {
121
+ float dk(vec3 point, float height, float radius) {
122
+ float gc = length(point);
123
+ if (gc < 0.00001) {
124
124
  return -radius;
125
125
  }
126
126
 
127
- float iG = radius * point.y / fQ;
128
- float iq = -1.5 * height;
129
- float eq;
130
- if (iG >= 0.0) {
131
- eq = radius;
132
- } else if (iG < iq) {
133
- eq = -height * fQ / point.y;
127
+ float jf = radius * point.y / gc;
128
+ float iS = -1.5 * height;
129
+ float ez;
130
+ if (jf >= 0.0) {
131
+ ez = radius;
132
+ } else if (jf < iS) {
133
+ ez = -height * gc / point.y;
134
134
  } else {
135
- float cv = 1.0
136
- - iG * iG / (3.0 * iq * iq);
137
- eq = radius * cv;
135
+ float cA = 1.0
136
+ - jf * jf / (3.0 * iS * iS);
137
+ ez = radius * cA;
138
138
  }
139
- return fQ - eq;
139
+ return gc - ez;
140
140
  }
141
141
 
142
- vec3 eM(vec3 origin, vec3 d) {
142
+ vec3 eW(vec3 origin, vec3 d) {
143
143
  #ifdef USE_GROUNDED_BACKGROUND
144
144
  float height = groundedBackgroundParams.x;
145
145
  float radius = groundedBackgroundParams.y;
146
- float yd = groundedBackgroundParams.z;
147
- vec3 bS = normalize(d);
148
- vec3 bs = origin - vec3(
146
+ float zZ = groundedBackgroundParams.z;
147
+ vec3 bT = normalize(d);
148
+ vec3 bA = origin - vec3(
149
149
  groundedBackgroundCenter.x,
150
- yd + height,
150
+ zZ + height,
151
151
  groundedBackgroundCenter.y
152
152
  );
153
153
 
154
154
 
155
155
 
156
- float eE = dot(bs, bS);
157
- float bj = eE * eE
158
- - dot(bs, bs) + radius * radius;
159
- if (bj > 0.0) {
160
- float cw = -eE + sqrt(bj);
156
+ float eN = dot(bA, bT);
157
+ float bk = eN * eN
158
+ - dot(bA, bA) + radius * radius;
159
+ if (bk > 0.0) {
160
+ float cB = -eN + sqrt(bk);
161
161
  if (
162
- cw > 0.0
163
- && di(bs, height, radius) <= 0.0
162
+ cB > 0.0
163
+ && dk(bA, height, radius) <= 0.0
164
164
  ) {
165
- vec3 oA = bs + bS * cw;
166
- if (oA.y >= 0.0) {
167
- return normalize(oA);
165
+ vec3 pw = bA + bT * cB;
166
+ if (pw.y >= 0.0) {
167
+ return normalize(pw);
168
168
  }
169
169
 
170
- if (bS.y < -0.00001 && radius > 1.5 * height) {
171
- float hP = (-height - bs.y) / bS.y;
172
- vec3 ot = bs + bS * hP;
173
- float oT = (2.0 / 3.0)
170
+ if (bT.y < -0.00001 && radius > 1.5 * height) {
171
+ float iz = (-height - bA.y) / bT.y;
172
+ vec3 pm = bA + bT * iz;
173
+ float qb = (2.0 / 3.0)
174
174
  * sqrt(radius * radius - 2.25 * height * height);
175
- if (hP > 0.0 && length(ot.xz) <= oT) {
176
- return normalize(ot);
175
+ if (iz > 0.0 && length(pm.xz) <= qb) {
176
+ return normalize(pm);
177
177
  }
178
178
  }
179
179
 
180
- float cI = 0.0;
180
+ float cK = 0.0;
181
181
  for (int i = 0; i < 14; i++) {
182
- float fd = (cI + cw) * 0.5;
183
- vec3 qq = bs + bS * fd;
184
- if (di(qq, height, radius) > 0.0) {
185
- cw = fd;
182
+ float fp = (cK + cB) * 0.5;
183
+ vec3 rD = bA + bT * fp;
184
+ if (dk(rD, height, radius) > 0.0) {
185
+ cB = fp;
186
186
  } else {
187
- cI = fd;
187
+ cK = fp;
188
188
  }
189
189
  }
190
- vec3 hit = bs + bS * ((cI + cw) * 0.5);
190
+ vec3 hit = bA + bT * ((cK + cB) * 0.5);
191
191
  return normalize(hit);
192
192
  }
193
193
  }
@@ -195,15 +195,15 @@ return normalize(hit);
195
195
  return d;
196
196
  }
197
197
 
198
- vec4 cn(vec3 origin, vec3 d) {
199
- d = eM(origin, d);
198
+ vec4 cq(vec3 origin, vec3 d) {
199
+ d = eW(origin, d);
200
200
  #ifdef USE_BACKGROUND
201
201
  vec4 t = backgroundMapTransform;
202
202
  d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
203
- vec4 aW = textureLinear(backgroundMap, eF(transpose(backgroundMapRotation) * d));
203
+ vec4 aW = textureLinear(backgroundMap, eP(transpose(backgroundMapRotation) * d));
204
204
  return vec4(aW.rgb * t.z, aW.a);
205
205
  #else
206
- return textureLinear(backgroundMap, cT(d));
206
+ return textureLinear(backgroundMap, cU(d));
207
207
  #endif
208
208
  }`
209
209
  });