@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.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +29 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/viewer.md +11 -1
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +12 -6
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.js +2 -2
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +2 -2
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +21 -14
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -2
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rayTraceCore.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/rayTraceCore.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,6BAA6B,EAAE,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,uBAAuB,GAAG,IAAI,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EACpB,QAAQ,GAAG,KAAK,EAChB,iBAAiB,GAAG,6BAA6B,EAOlD;IACC,OAAO,QAAQ,CAAC;;;;;;gBAMF,aAAa;yBACJ,qBAAqB;;qBAEzB,mBAAmB;uBACjB,qBAAqB;4BAChB,0BAA0B;qBACjC,mBAAmB;iCACP,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC;+BACnE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;+BAC/D,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;sCACxD,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,KAAK,CAAC;mCACzE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;EAe/F,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;CAE7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;EAQJ,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCU,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;2BAEpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;EAIrC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CAChB,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;EACf,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;CAI7B,CAAC,CAAC,CAAC,EAAE;;;;;;EAMF,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;yBAuBf,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;2BAMpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DhC,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DAmDwC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE9H,CAAC;AACF,CAAC","sourcesContent":["import { materialBufferWgsl } from '../../materialLayoutSchema.js';\nimport {ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES} from '../../shaderCapabilities.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n CONSTANT_SPOT_LIGHT\n} from '../../lightConstants.js';\n\nexport default function rayTraceCore({\n hasAnisotropyDirections = true,\n hasCoatNormals = false,\n hasSceneAlpha = true,\n caustics = false,\n lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES\n}: {\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: boolean;\n caustics?: boolean;\n lightCapabilities?: number;\n}) {\n return /*wgsl*/ `\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst luminance = vec3f(0.2126, 0.7152, 0.0722);\nconst RAY_MAX_DISTANCE = 9999.0;\n\nconst STANDARD = 0;\nconst UNLIT = ${UnlitMaterial};\nconst SHADOW_CATCHER = ${ShadowCatcherMaterial};\n\nconst RECT_LIGHT = ${CONSTANT_RECT_LIGHT};\nconst SPHERE_LIGHT = ${CONSTANT_SPHERE_LIGHT};\nconst DIRECTIONAL_LIGHT = ${CONSTANT_DIRECTIONAL_LIGHT};\nconst SPOT_LIGHT = ${CONSTANT_SPOT_LIGHT};\nconst HAS_SCENE_SPHERE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SphereLight) !== 0};\nconst HAS_SCENE_RECT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.RectLight) !== 0};\nconst HAS_SCENE_SPOT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SpotLight) !== 0};\nconst HAS_SCENE_DIRECTIONAL_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.DirectionalLight) !== 0};\nconst HAS_SCENE_EMISSIVE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.emissive) !== 0};\n\nstruct Ray {\n o: vec3f,\n d: vec3f,\n};\n\nstruct SurfaceInteraction {\n position: vec3f,\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n albedoSampled: bool,\n\n normal: vec3f, // material shading normal\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f, // independent, built before base normal mapping\n` : ''}\n vertexNormal: vec3f, // interpolated mesh normal before normal mapping\n shadowOffset: vec3f, // smooth-surface offset for direct-light shadow rays\n\n faceNormal: vec3f, // normal of the triangle\n hit: bool,\n\n tangent: vec3f,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n uv: vec2f,\n uv1: vec2f,\n vertexColor: vec3f,\n\n triangleIndex: i32,\n instanceIndex: i32,\n materialIndex: i32,\n barycentrics: vec2f,\n\n wavelength: f32,\n // RGB channel a spectral path carries, 1 to 3. Zero keeps full RGB.\n spectralChannel: i32,\n\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n baseColor: vec3f,\n transmissionWeight: f32,\n\n emission: vec3f,\n specularAnisotropy: f32,\n\n baseMetalness: f32,\n specularIor: f32,\n specularRoughness: f32,${caustics ? /* wgsl */ `\n causticRoughness: f32,\n causticNormalMapped: bool,` : ''}\n\n transmissionDispersionScale: f32,\n dispersionAbbeNumber: f32,\n thinFilmThickness: f32,\n thinFilmIor: f32,\n thinFilmWeight: f32,\n\n // Medium\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n baseWeight: f32,\n diffuseRoughness: f32,\n specularWeight: f32,\n specularColor: vec3f,\n subsurfaceWeight: f32,\n subsurfaceColor: vec3f,\n transmissionColor: vec3f,\n fuzzWeight: f32,\n fuzzColor: vec3f,\n fuzzRoughness: f32,\n coatWeight: f32,\n coatColor: vec3f,\n coatRoughness: f32,\n coatAnisotropy: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n anisotropyDirection: vec2f,\n anisotropyDirectionEnabled: bool,\n coatAnisotropyRotation: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n` : /* wgsl */ ``}\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f,\n coatNormalEnabled: bool,\n geometricNormal: vec3f, // face normal oriented toward the view\n` : ''}\n coatIor: f32,\n coatDarkening: f32,\n\n // Alpha\n alpha: f32,\n ${hasSceneAlpha ? 'alphaMode: i32,' : ''}\n\n materialType: i32,\n\n bevel: f32,\n\n relativeIor: f32,\n inside: bool,\n\n alphaX: f32,\n alphaY: f32,\n thinWalled: bool,\n};\n\nstruct Path {\n ray: Ray,\n li: vec3f,\n alpha: f32,\n beta: vec3f,\n fromEye: bool,\n abort: bool,\n scatteringPdf: f32,\n scatteringIsDelta: bool,\n isNextRefraction: bool,${caustics ? /* wgsl */ `\n causticK: u32,\n causticSingleT: bool,\n causticReceiverPrimary: bool,\n causticHasReceiver: bool,\n causticPhotonReceiver:bool,\n causticMneeReceiver: bool,` : ''}\n};\n\nstruct LightSampleRec {\n normal: vec3f,\n emission: vec3f,\n direction: vec3f,\n dist: f32,\n pdf: f32,\n // Discrete probability of selecting this light before sampling its\n // conditional point/direction. Light RIS excludes this term from the target\n // and carries it in the unbiased contribution weight instead.\n selectionPmf: f32,\n isDelta: bool,\n // Light source type: environment=0, emissive triangle=1, analytic=2.\n sourceType: u32,\n sourceIndex: u32,\n};\n\nstruct Light {\n position: vec3f,\n litType: f32,\n\n emission: vec3f,\n area: f32,\n\n u: vec3f,\n // Radius for sphere light, spread for rect light\n radiusOrSpread: f32,\n\n v: vec3f,\n textureIndex: f32,\n\n selectionPmf: f32,\n _samplingPadding0: f32,\n _samplingPadding1: f32,\n _samplingPadding2: f32,\n iesReference: vec3f,\n _iesPadding: f32,\n};\n\nstruct EmissiveTriangle {\n p0: vec3f,\n selectionPmf: f32,\n p1: vec3f,\n area: f32,\n p2: vec3f,\n materialIndex: f32,\n uv0: vec2f,\n uv1: vec2f,\n uv2: vec2f,\n secondaryUv0: vec2f,\n secondaryUv1: vec2f,\n secondaryUv2: vec2f,\n};\n\nstruct LightChoice {\n probability: f32,\n aliasIndex: i32,\n sourceType: i32,\n sourceIndex: i32,\n};\n\n${materialBufferWgsl()}\n\nstruct CameraUniform {\n viewProjectionInv: mat4x4<f32>,\n viewInv: mat4x4<f32>,\n apertureRadius: f32,\n focusDistance: f32,\n};\n\nstruct RayTraceUniform {\n outputSize: vec2f,\n sampleCount: f32,\n scaleOffset: vec4f,\n lightsCount: i32,\n transmissiveOutputAlphaMin: f32,\n jitter: vec2f,\n backgroundColor: vec4f,\n groundedBackgroundParams: vec4f,\n groundedBackgroundCenter: vec2f,\n blasOffset: i32,\n isEmpty: i32,\n bevel: i32,\n dispersionWavelengths: i32,\n envLightPmf: f32,\n lightChoiceCount: i32,\n lightWeightTotal: f32,\n lightSamplingTextureWidth: i32,\n lightChoiceTexelOffset: i32,\n bounces: i32,\n varianceMoments: i32,\n adaptiveSampling: i32,\n clamping: f32,\n directLightCandidates: i32,\n backgroundFlags: i32,\n // Fixed at 4: runtime trip bounds discourage thin-film loop unrolling.\n loopUnrollGuard: u32,\n sceneFeatureFlags: u32,\n sequenceSeed: u32,\n zSobolLogSPP: u32,\n sampleSequenceOffset: u32,\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: i32,\n shadowCatcherChoiceCount: i32,\n environmentRotation: mat4x4f,\n backgroundMapTransform: vec4f,\n backgroundMapRotation: mat4x4f,\n}\n\n// Buffers\n@group(0) @binding(0) var<storage, read> bvhBuffer: array<vec4f>;\n@group(0) @binding(1) var<storage, read> instancesBuffer: array<vec4f>;\n@group(0) @binding(2) var<storage, read> attrBuffers: array<${hasAnisotropyDirections ? /* wgsl */ `vec4f` : /* wgsl */ `vec3f`}>;\n@group(0) @binding(3) var<storage, read> materialsBuffer: array<MaterialBuffer>;\n\n// Textures\n@group(1) @binding(0) var mapSampler: sampler;\n@group(1) @binding(1) var map: texture_2d_array<f32>;\n// The first NUM_MAPS entries contain atlas placement; the second half stores\n// per-texture UV scale/offset; the third block stores the UV channel in x.\n@group(1) @binding(3) var<uniform> mapInfo: array<vec4f, NUM_MAPS * 3>;\n@group(1) @binding(4) var envMap: texture_2d<f32>;\n@group(1) @binding(5) var envMapDistribution: texture_2d<f32>;\n@group(1) @binding(6) var backgroundMap: texture_2d<f32>;\n@group(1) @binding(8) var lightSamplingData: texture_2d<f32>;\n@group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;\n@group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;\n\nfn iesProfileScalar(baseTexel: i32, scalarIndex: i32) -> f32 {\n let texelIndex = baseTexel + scalarIndex / 4;\n let width = rtUniform.lightSamplingTextureWidth;\n let packed = textureLoad(lightSamplingData, vec2i(texelIndex % width, texelIndex / width), 0);\n return packed[scalarIndex % 4];\n}\n\nfn sampleIESProfile(baseTexel: i32, uv: vec2f) -> f32 {\n if (baseTexel < 0) { return 1.0; }\n let pixel = fract(uv) * 128.0 - vec2f(0.5);\n let x0 = i32(floor(pixel.x));\n let y0 = i32(floor(pixel.y));\n let fx = fract(pixel.x);\n let fy = fract(pixel.y);\n let xa = select(x0, 127, x0 < 0);\n let xb = select(x0 + 1, 0, x0 >= 127);\n let ya = select(y0, 127, y0 < 0);\n let yb = select(y0 + 1, 0, y0 >= 127);\n let a = iesProfileScalar(baseTexel, ya * 128 + xa);\n let b = iesProfileScalar(baseTexel, ya * 128 + xb);\n let c = iesProfileScalar(baseTexel, yb * 128 + xa);\n let d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, fx), mix(c, d, fx), fy);\n}\n\nfn evaluateSpotEmissionMultiplier(light: Light, lightToSurface: vec3f) -> f32 {\n let axis = normalize(light.u);\n let cosTheta = dot(axis, lightToSurface);\n var cone = select(0.0, 1.0, cosTheta >= light.v.x);\n if (light.v.y > light.v.x + 1e-6) {\n cone = smoothstep(light.v.x, light.v.y, cosTheta);\n }\n if (cone <= 0.0 || light.textureIndex < 0.0) { return cone; }\n let xAxis = light.iesReference;\n let yAxis = cross(axis, xAxis);\n let vertical = acos(clamp(cosTheta, -1.0, 1.0));\n let horizontal = atan2(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));\n}\n\n\n \n// Uniforms\n@group(2) @binding(0) var<uniform> cameraUniform: CameraUniform;\n@group(2) @binding(1) var<uniform> rtUniform: RayTraceUniform;\n\n@group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;\n// TODO uniform must be aligned to 16 bytes.\n\nfn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {\n (*ray).o = origin;\n (*ray).d = direction;\n}\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rayTraceCore.wgsl.js","sourceRoot":"","sources":["../../../../src/renderer/wgsl/chunks/rayTraceCore.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,sBAAsB,EAAC,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAC,6BAA6B,EAAE,yBAAyB,EAAC,MAAM,6BAA6B,CAAC;AACrG,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC;AACnC,+EAA+E;AAC/E,mBAAmB,GAAG,KAAK,EAC3B,eAAe,GAAG,KAAK,EACvB,uBAAuB,GAAG,IAAI,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EACpB,uBAAuB,GAAG,KAAK,EAC/B,QAAQ,GAAG,KAAK,EAChB,iBAAiB,GAAG,6BAA6B,EAUlD;IACC,OAAO,QAAQ,CAAC;;;;;;gBAMF,aAAa;yBACJ,qBAAqB;;qBAEzB,mBAAmB;uBACjB,qBAAqB;4BAChB,0BAA0B;qBACjC,mBAAmB;iCACP,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,WAAW,CAAC,KAAK,CAAC;+BACnE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;+BAC/D,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC;sCACxD,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC,KAAK,CAAC;mCACzE,CAAC,iBAAiB,GAAG,yBAAyB,CAAC,QAAQ,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;EAe/F,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;CAE7B,CAAC,CAAC,CAAC,EAAE;;;;;;;;EAQJ,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAiCU,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;2BAEpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BhC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;EAIrC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;CAKtC,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;CAChB,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE;EACf,cAAc,CAAC,CAAC,CAAC,UAAU,CAAC;;;;CAI7B,CAAC,CAAC,CAAC,EAAE;;;;;;EAMF,aAAa,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;yBAyBf,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;2BAMpB,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+DhC,kBAAkB,EAAE;;;;;;qBAMC,uBAAuB,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DA6CzB,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;EACjI,sBAAsB,CAAC,eAAe,EAAE,uBAAuB,CAAC;;;;;iCAKjC,mBAAmB,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,uBAAuB;;;4BAGrF,mBAAmB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6D5E,CAAC;AACF,CAAC","sourcesContent":["import {vertexAttributeReaders} from './vertexAttributes.wgsl.js';\nimport { materialBufferWgsl } from '../../materialLayoutSchema.js';\nimport {ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES} from '../../shaderCapabilities.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n CONSTANT_SPOT_LIGHT\n} from '../../lightConstants.js';\n\nexport default function rayTraceCore({\n // Independent mapInfo starts with image width, height and binding-array index.\n independentTextures = false,\n compactVertices = false,\n hasAnisotropyDirections = true,\n hasCoatNormals = false,\n hasSceneAlpha = true,\n cameraProjectionInverse = false,\n caustics = false,\n lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES\n}: {\n independentTextures?: boolean;\n compactVertices?: boolean;\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: boolean;\n cameraProjectionInverse?: boolean;\n caustics?: boolean;\n lightCapabilities?: number;\n}) {\n return /*wgsl*/ `\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst luminance = vec3f(0.2126, 0.7152, 0.0722);\nconst RAY_MAX_DISTANCE = 9999.0;\n\nconst STANDARD = 0;\nconst UNLIT = ${UnlitMaterial};\nconst SHADOW_CATCHER = ${ShadowCatcherMaterial};\n\nconst RECT_LIGHT = ${CONSTANT_RECT_LIGHT};\nconst SPHERE_LIGHT = ${CONSTANT_SPHERE_LIGHT};\nconst DIRECTIONAL_LIGHT = ${CONSTANT_DIRECTIONAL_LIGHT};\nconst SPOT_LIGHT = ${CONSTANT_SPOT_LIGHT};\nconst HAS_SCENE_SPHERE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SphereLight) !== 0};\nconst HAS_SCENE_RECT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.RectLight) !== 0};\nconst HAS_SCENE_SPOT_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.SpotLight) !== 0};\nconst HAS_SCENE_DIRECTIONAL_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.DirectionalLight) !== 0};\nconst HAS_SCENE_EMISSIVE_LIGHT = ${(lightCapabilities & LIGHT_SHADER_CAPABILITIES.emissive) !== 0};\n\nstruct Ray {\n o: vec3f,\n d: vec3f,\n};\n\nstruct SurfaceInteraction {\n position: vec3f,\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n albedoSampled: bool,\n\n normal: vec3f, // material shading normal\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f, // independent, built before base normal mapping\n` : ''}\n vertexNormal: vec3f, // interpolated mesh normal before normal mapping\n shadowOffset: vec3f, // smooth-surface offset for direct-light shadow rays\n\n faceNormal: vec3f, // normal of the triangle\n hit: bool,\n\n tangent: vec3f,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n uv: vec2f,\n uv1: vec2f,\n vertexColor: vec3f,\n\n triangleIndex: i32,\n instanceIndex: i32,\n materialIndex: i32,\n barycentrics: vec2f,\n\n wavelength: f32,\n // RGB channel a spectral path carries, 1 to 3. Zero keeps full RGB.\n spectralChannel: i32,\n\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n baseColor: vec3f,\n transmissionWeight: f32,\n\n emission: vec3f,\n specularAnisotropy: f32,\n\n baseMetalness: f32,\n specularIor: f32,\n specularRoughness: f32,${caustics ? /* wgsl */ `\n causticRoughness: f32,\n causticNormalMapped: bool,` : ''}\n\n transmissionDispersionScale: f32,\n dispersionAbbeNumber: f32,\n thinFilmThickness: f32,\n thinFilmIor: f32,\n thinFilmWeight: f32,\n\n // Medium\n mediumType: i32,\n mediumExtinction: vec3f,\n mediumScattering: vec3f,\n mediumAnisotropy: f32,\n\n baseWeight: f32,\n diffuseRoughness: f32,\n specularWeight: f32,\n specularColor: vec3f,\n subsurfaceWeight: f32,\n subsurfaceColor: vec3f,\n transmissionColor: vec3f,\n fuzzWeight: f32,\n fuzzColor: vec3f,\n fuzzRoughness: f32,\n coatWeight: f32,\n coatColor: vec3f,\n coatRoughness: f32,\n coatAnisotropy: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n anisotropyDirection: vec2f,\n anisotropyDirectionEnabled: bool,\n coatAnisotropyRotation: f32,\n${hasAnisotropyDirections ? /* wgsl */ `\n directionTangent: vec3f,\n directionBitangent: vec3f,\n geometryTangent: vec3f,\n geometryBitangent: vec3f,\n` : /* wgsl */ ``}\n` : /* wgsl */ ``}\n${hasCoatNormals ? /* wgsl */ `\n coatNormal: vec3f,\n coatNormalEnabled: bool,\n geometricNormal: vec3f, // face normal oriented toward the view\n` : ''}\n coatIor: f32,\n coatDarkening: f32,\n\n // Alpha\n alpha: f32,\n ${hasSceneAlpha ? 'alphaMode: i32,' : ''}\n\n materialType: i32,\n\n bevel: f32,\n\n relativeIor: f32,\n inside: bool,\n\n alphaX: f32,\n alphaY: f32,\n thinWalled: bool,\n};\n\nstruct Path {\n // Sticky for this path: an SSS walk must retain its chance to reach the boundary.\n scatteringMediumEntered: bool,\n ray: Ray,\n li: vec3f,\n alpha: f32,\n beta: vec3f,\n fromEye: bool,\n abort: bool,\n scatteringPdf: f32,\n scatteringIsDelta: bool,\n isNextRefraction: bool,${caustics ? /* wgsl */ `\n causticK: u32,\n causticSingleT: bool,\n causticReceiverPrimary: bool,\n causticHasReceiver: bool,\n causticPhotonReceiver:bool,\n causticMneeReceiver: bool,` : ''}\n};\n\nstruct LightSampleRec {\n normal: vec3f,\n emission: vec3f,\n direction: vec3f,\n dist: f32,\n pdf: f32,\n // Discrete probability of selecting this light before sampling its\n // conditional point/direction. Light RIS excludes this term from the target\n // and carries it in the unbiased contribution weight instead.\n selectionPmf: f32,\n isDelta: bool,\n // Light source type: environment=0, emissive triangle=1, analytic=2.\n sourceType: u32,\n sourceIndex: u32,\n};\n\nstruct Light {\n position: vec3f,\n litType: f32,\n\n emission: vec3f,\n area: f32,\n\n u: vec3f,\n // Radius for sphere light, spread for rect light\n radiusOrSpread: f32,\n\n v: vec3f,\n textureIndex: f32,\n\n selectionPmf: f32,\n _samplingPadding0: f32,\n _samplingPadding1: f32,\n _samplingPadding2: f32,\n iesReference: vec3f,\n _iesPadding: f32,\n};\n\nstruct EmissiveTriangle {\n p0: vec3f,\n selectionPmf: f32,\n p1: vec3f,\n area: f32,\n p2: vec3f,\n materialIndex: f32,\n uv0: vec2f,\n uv1: vec2f,\n uv2: vec2f,\n secondaryUv0: vec2f,\n secondaryUv1: vec2f,\n secondaryUv2: vec2f,\n};\n\nstruct LightChoice {\n probability: f32,\n aliasIndex: i32,\n sourceType: i32,\n sourceIndex: i32,\n};\n\n${materialBufferWgsl()}\n\nstruct CameraUniform {\n viewProjectionInv: mat4x4<f32>,\n viewInv: mat4x4<f32>,\n apertureRadius: f32,\n focusDistance: f32,${cameraProjectionInverse ? '\\n projectionInv: mat4x4<f32>,' : ''}\n};\n\nstruct RayTraceUniform {\n outputSize: vec2f,\n sampleCount: f32,\n scaleOffset: vec4f,\n lightsCount: i32,\n transmissiveOutputAlphaMin: f32,\n jitter: vec2f,\n backgroundColor: vec4f,\n groundedBackgroundParams: vec4f,\n groundedBackgroundCenter: vec2f,\n blasOffset: i32,\n isEmpty: i32,\n bevel: i32,\n dispersionWavelengths: i32,\n envLightPmf: f32,\n lightChoiceCount: i32,\n lightWeightTotal: f32,\n lightSamplingTextureWidth: i32,\n lightChoiceTexelOffset: i32,\n bounces: i32,\n varianceMoments: i32,\n adaptiveSampling: i32,\n clamping: f32,\n directLightCandidates: i32,\n backgroundFlags: i32,\n // Fixed at 4: runtime trip bounds discourage thin-film loop unrolling.\n loopUnrollGuard: u32,\n sceneFeatureFlags: u32,\n sequenceSeed: u32,\n zSobolLogSPP: u32,\n sampleSequenceOffset: u32,\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: i32,\n shadowCatcherChoiceCount: i32,\n environmentRotation: mat4x4f,\n backgroundMapTransform: vec4f,\n backgroundMapRotation: mat4x4f,\n}\n\n// Buffers\n@group(0) @binding(0) var<storage, read> bvhBuffer: array<vec4f>;\n@group(0) @binding(1) var<storage, read> instancesBuffer: array<vec4f>;\n@group(0) @binding(2) var<storage, read> attrBuffers: array<${compactVertices ? 'u32' : hasAnisotropyDirections ? 'vec4f' : 'vec3f'}>;\n${vertexAttributeReaders(compactVertices, hasAnisotropyDirections)}\n@group(0) @binding(3) var<storage, read> materialsBuffer: array<MaterialBuffer>;\n\n// Textures\n@group(1) @binding(0) var mapSampler: sampler;\n@group(1) @binding(1) var map: ${independentTextures ? 'binding_array<texture_2d<f32>>' : 'texture_2d_array<f32>'};\n// The first NUM_MAPS entries contain atlas placement; the second half stores\n// per-texture UV scale/offset; the third block stores the UV channel in x.\n@group(1) @binding(3) var<${independentTextures ? 'storage, read' : 'uniform'}> mapInfo: array<vec4f, NUM_MAPS * 3>;\n@group(1) @binding(4) var envMap: texture_2d<f32>;\n@group(1) @binding(5) var envMapDistribution: texture_2d<f32>;\n@group(1) @binding(6) var backgroundMap: texture_2d<f32>;\n@group(1) @binding(8) var lightSamplingData: texture_2d<f32>;\n@group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;\n@group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;\n\nfn iesProfileScalar(baseTexel: i32, scalarIndex: i32) -> f32 {\n let texelIndex = baseTexel + scalarIndex / 4;\n let width = rtUniform.lightSamplingTextureWidth;\n let packed = textureLoad(lightSamplingData, vec2i(texelIndex % width, texelIndex / width), 0);\n return packed[scalarIndex % 4];\n}\n\nfn sampleIESProfile(baseTexel: i32, uv: vec2f) -> f32 {\n if (baseTexel < 0) { return 1.0; }\n let pixel = fract(uv) * 128.0 - vec2f(0.5);\n let x0 = i32(floor(pixel.x));\n let y0 = i32(floor(pixel.y));\n let fx = fract(pixel.x);\n let fy = fract(pixel.y);\n let xa = select(x0, 127, x0 < 0);\n let xb = select(x0 + 1, 0, x0 >= 127);\n let ya = select(y0, 127, y0 < 0);\n let yb = select(y0 + 1, 0, y0 >= 127);\n let a = iesProfileScalar(baseTexel, ya * 128 + xa);\n let b = iesProfileScalar(baseTexel, ya * 128 + xb);\n let c = iesProfileScalar(baseTexel, yb * 128 + xa);\n let d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, fx), mix(c, d, fx), fy);\n}\n\nfn evaluateSpotEmissionMultiplier(light: Light, lightToSurface: vec3f) -> f32 {\n let axis = normalize(light.u);\n let cosTheta = dot(axis, lightToSurface);\n var cone = select(0.0, 1.0, cosTheta >= light.v.x);\n if (light.v.y > light.v.x + 1e-6) {\n cone = smoothstep(light.v.x, light.v.y, cosTheta);\n }\n if (cone <= 0.0 || light.textureIndex < 0.0) { return cone; }\n let xAxis = light.iesReference;\n let yAxis = cross(axis, xAxis);\n let vertical = acos(clamp(cosTheta, -1.0, 1.0));\n let horizontal = atan2(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));\n}\n\n\n \n// Uniforms\n@group(2) @binding(0) var<uniform> cameraUniform: CameraUniform;\n@group(2) @binding(1) var<uniform> rtUniform: RayTraceUniform;\n\n@group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;\n// TODO uniform must be aligned to 16 bytes.\n\nfn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {\n (*ray).o = origin;\n (*ray).d = direction;\n}\n`;\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_CHOICE_ENVIRONMENT } from '../../lightConstants.js';
|
|
2
2
|
export default /*wgsl */ `
|
|
3
|
-
fn
|
|
4
|
-
let
|
|
5
|
-
let ao = length(
|
|
3
|
+
fn eR(light: Light, fB: vec3f, jE: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
4
|
+
let iY = light.position - fB;
|
|
5
|
+
let ao = length(iY);
|
|
6
6
|
if (light.radiusOrSpread <= 0.0) {
|
|
7
7
|
|
|
8
8
|
|
|
@@ -16,7 +16,7 @@ if (ao <= 1e-6) {
|
|
|
16
16
|
(*lightSample).isDelta = true;
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
(*lightSample).direction =
|
|
19
|
+
(*lightSample).direction = iY / ao;
|
|
20
20
|
(*lightSample).normal = -(*lightSample).direction;
|
|
21
21
|
(*lightSample).dist = ao;
|
|
22
22
|
(*lightSample).pdf = 1.0;
|
|
@@ -27,21 +27,21 @@ return;
|
|
|
27
27
|
}
|
|
28
28
|
let radius = max(light.radiusOrSpread, 1e-6);
|
|
29
29
|
(*lightSample).isDelta = false;
|
|
30
|
-
var
|
|
30
|
+
var gY: vec3f;
|
|
31
31
|
|
|
32
32
|
if (ao <= radius) {
|
|
33
|
-
let z = 1.0 - 2.0 *
|
|
34
|
-
let
|
|
35
|
-
let azimuth = TWOPI *
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
33
|
+
let z = 1.0 - 2.0 * jE.x;
|
|
34
|
+
let dw = sqrt(max(0.0, 1.0 - z * z));
|
|
35
|
+
let azimuth = TWOPI * jE.y;
|
|
36
|
+
gY = vec3f(
|
|
37
|
+
dw * cos(azimuth),
|
|
38
|
+
dw * sin(azimuth),
|
|
39
39
|
z
|
|
40
40
|
);
|
|
41
41
|
(*lightSample).pdf = INV4PI;
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
|
-
let
|
|
44
|
+
let vU = iY / ao;
|
|
45
45
|
let sinThetaMaxSquared = min(
|
|
46
46
|
1.0,
|
|
47
47
|
radius * radius / (ao * ao)
|
|
@@ -50,14 +50,14 @@ let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
|
|
|
50
50
|
|
|
51
51
|
|
|
52
52
|
let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
|
|
53
|
-
let
|
|
54
|
-
let
|
|
55
|
-
let sinTheta = sqrt(max(0.0,
|
|
56
|
-
let azimuth = TWOPI *
|
|
53
|
+
let lT = jE.x * oneMinusCosThetaMax;
|
|
54
|
+
let cv = 1.0 - lT;
|
|
55
|
+
let sinTheta = sqrt(max(0.0, lT * (2.0 - lT)));
|
|
56
|
+
let azimuth = TWOPI * jE.y;
|
|
57
57
|
var tangent: vec3f;
|
|
58
58
|
var bitangent: vec3f;
|
|
59
|
-
sampling_orthonormal_basis(
|
|
60
|
-
|
|
59
|
+
sampling_orthonormal_basis(vU, &tangent, &bitangent);
|
|
60
|
+
gY = vU * cv
|
|
61
61
|
+ tangent * (sinTheta * cos(azimuth))
|
|
62
62
|
+ bitangent * (sinTheta * sin(azimuth));
|
|
63
63
|
(*lightSample).pdf = 1.0 / max(
|
|
@@ -66,20 +66,20 @@ TWOPI * oneMinusCosThetaMax,
|
|
|
66
66
|
);
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
let
|
|
70
|
-
let
|
|
71
|
-
let
|
|
72
|
-
-
|
|
73
|
-
let
|
|
74
|
-
let
|
|
75
|
-
(*lightSample).dist = select(
|
|
76
|
-
(*lightSample).direction =
|
|
77
|
-
let
|
|
78
|
-
(*lightSample).normal = normalize(
|
|
69
|
+
let iZ = dot(gY, iY);
|
|
70
|
+
let sj = dot(iY, iY);
|
|
71
|
+
let bk = iZ * iZ
|
|
72
|
+
- sj + radius * radius;
|
|
73
|
+
let cK = iZ - sqrt(max(0.0, bk));
|
|
74
|
+
let cB = iZ + sqrt(max(0.0, bk));
|
|
75
|
+
(*lightSample).dist = select(cB, cK, cK > 1e-6);
|
|
76
|
+
(*lightSample).direction = gY;
|
|
77
|
+
let uQ = fB + gY * (*lightSample).dist;
|
|
78
|
+
(*lightSample).normal = normalize(uQ - light.position);
|
|
79
79
|
(*lightSample).emission = light.emission;
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
fn
|
|
82
|
+
fn bD(
|
|
83
83
|
light: Light,
|
|
84
84
|
surfacePoint: vec3f,
|
|
85
85
|
lowerLeft: vec3f,
|
|
@@ -90,15 +90,15 @@ return;
|
|
|
90
90
|
}
|
|
91
91
|
let width = length(light.u);
|
|
92
92
|
let height = length(light.v);
|
|
93
|
-
let
|
|
93
|
+
let ea = surfacePoint - lowerLeft;
|
|
94
94
|
let uv = vec2f(
|
|
95
|
-
dot(
|
|
96
|
-
dot(
|
|
95
|
+
dot(ea, light.u / width) / width,
|
|
96
|
+
dot(ea, light.v / height) / height
|
|
97
97
|
);
|
|
98
98
|
(*result).emission *= sampleMap(i32(light.textureIndex), uv).rgb;
|
|
99
99
|
}
|
|
100
100
|
|
|
101
|
-
fn
|
|
101
|
+
fn kF(
|
|
102
102
|
light: Light,
|
|
103
103
|
shadingPoint: vec3f,
|
|
104
104
|
samplePoint: vec2f,
|
|
@@ -109,27 +109,27 @@ let lowerLeft = light.position - 0.5 * (light.u + light.v);
|
|
|
109
109
|
let spread = clamp(light.radiusOrSpread, 0.0, 1.0);
|
|
110
110
|
|
|
111
111
|
if (spread <= 0.001) {
|
|
112
|
-
let
|
|
113
|
-
let surfacePoint = shadingPoint - normal *
|
|
114
|
-
let
|
|
112
|
+
let gy = dot(normal, shadingPoint - light.position);
|
|
113
|
+
let surfacePoint = shadingPoint - normal * gy;
|
|
114
|
+
let ea = surfacePoint - lowerLeft;
|
|
115
115
|
let width = length(light.u);
|
|
116
116
|
let height = length(light.v);
|
|
117
117
|
let uv = vec2f(
|
|
118
|
-
dot(
|
|
119
|
-
dot(
|
|
118
|
+
dot(ea, light.u / width) / width,
|
|
119
|
+
dot(ea, light.v / height) / height
|
|
120
120
|
);
|
|
121
|
-
if (
|
|
121
|
+
if (gy <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
|
|
122
122
|
(*result).emission = vec3f(0.0);
|
|
123
123
|
(*result).pdf = 0.0;
|
|
124
124
|
return;
|
|
125
125
|
}
|
|
126
126
|
(*result).direction = -normal;
|
|
127
|
-
(*result).dist =
|
|
127
|
+
(*result).dist = gy;
|
|
128
128
|
(*result).normal = normal;
|
|
129
129
|
(*result).emission = light.emission;
|
|
130
130
|
(*result).pdf = 1.0;
|
|
131
131
|
(*result).isDelta = true;
|
|
132
|
-
|
|
132
|
+
bD(light, surfacePoint, lowerLeft, result);
|
|
133
133
|
return;
|
|
134
134
|
}
|
|
135
135
|
|
|
@@ -141,19 +141,19 @@ let bG = dot(offset, offset);
|
|
|
141
141
|
(*result).dist = sqrt(bG);
|
|
142
142
|
(*result).direction = offset / (*result).dist;
|
|
143
143
|
(*result).normal = normal;
|
|
144
|
-
let
|
|
145
|
-
let
|
|
146
|
-
if (
|
|
144
|
+
let gq = dot(-(*result).direction, normal);
|
|
145
|
+
let qB = cos(0.5 * PI * spread);
|
|
146
|
+
if (gq <= 0.0 || gq < qB) {
|
|
147
147
|
(*result).emission = vec3f(0.0);
|
|
148
148
|
(*result).pdf = 0.0;
|
|
149
149
|
return;
|
|
150
150
|
}
|
|
151
151
|
(*result).emission = light.emission;
|
|
152
|
-
(*result).pdf = bG / max(light.area *
|
|
153
|
-
|
|
152
|
+
(*result).pdf = bG / max(light.area * gq, 1e-8);
|
|
153
|
+
bD(light, surfacePoint, lowerLeft, result);
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
fn
|
|
156
|
+
fn gs(
|
|
157
157
|
light: Light,
|
|
158
158
|
result: ptr<function, LightSampleRec>
|
|
159
159
|
) {
|
|
@@ -165,16 +165,16 @@ result: ptr<function, LightSampleRec>
|
|
|
165
165
|
(*result).isDelta = true;
|
|
166
166
|
}
|
|
167
167
|
|
|
168
|
-
fn
|
|
168
|
+
fn kG(
|
|
169
169
|
light: Light,
|
|
170
170
|
shadingPoint: vec3f,
|
|
171
171
|
samplePoint: vec2f,
|
|
172
172
|
result: ptr<function, LightSampleRec>
|
|
173
173
|
) {
|
|
174
|
-
|
|
174
|
+
eR(light, shadingPoint, samplePoint, result);
|
|
175
175
|
let surfacePoint = shadingPoint + (*result).direction * (*result).dist;
|
|
176
|
-
let
|
|
177
|
-
(*result).emission *= evaluateSpotEmissionMultiplier(light,
|
|
176
|
+
let dL = normalize(shadingPoint - surfacePoint);
|
|
177
|
+
(*result).emission *= evaluateSpotEmissionMultiplier(light, dL);
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
fn sampleAnalyticLight(
|
|
@@ -183,40 +183,40 @@ shadingPoint: vec3f,
|
|
|
183
183
|
samplePoint: vec2f,
|
|
184
184
|
result: ptr<function, LightSampleRec>
|
|
185
185
|
) {
|
|
186
|
-
let
|
|
187
|
-
if (HAS_SCENE_RECT_LIGHT &&
|
|
188
|
-
|
|
186
|
+
let dU = i32(light.litType);
|
|
187
|
+
if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
|
|
188
|
+
kF(light, shadingPoint, samplePoint, result);
|
|
189
189
|
return;
|
|
190
190
|
}
|
|
191
|
-
if (HAS_SCENE_SPHERE_LIGHT &&
|
|
192
|
-
|
|
191
|
+
if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
|
|
192
|
+
eR(light, shadingPoint, samplePoint, result);
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
|
-
if (HAS_SCENE_SPOT_LIGHT &&
|
|
196
|
-
|
|
195
|
+
if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
|
|
196
|
+
kG(light, shadingPoint, samplePoint, result);
|
|
197
197
|
return;
|
|
198
198
|
}
|
|
199
|
-
if (HAS_SCENE_DIRECTIONAL_LIGHT &&
|
|
200
|
-
|
|
199
|
+
if (HAS_SCENE_DIRECTIONAL_LIGHT && dU == DIRECTIONAL_LIGHT) {
|
|
200
|
+
gs(light, result);
|
|
201
201
|
}
|
|
202
202
|
}
|
|
203
203
|
|
|
204
|
-
fn
|
|
204
|
+
fn iM(jE: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
205
205
|
var uv: vec2f;
|
|
206
206
|
|
|
207
207
|
var pdf: f32;
|
|
208
|
-
let direction =
|
|
208
|
+
let direction = qx(jE, &uv, &pdf);
|
|
209
209
|
(*lightSample).pdf = pdf;
|
|
210
210
|
(*lightSample).direction = direction;
|
|
211
211
|
(*lightSample).emission = textureLinear(envMap, uv).rgb;
|
|
212
212
|
(*lightSample).dist = INF;
|
|
213
213
|
}
|
|
214
214
|
|
|
215
|
-
fn loadLightSamplingTexel(
|
|
215
|
+
fn loadLightSamplingTexel(iR: i32) -> vec4f {
|
|
216
216
|
let width = rtUniform.lightSamplingTextureWidth;
|
|
217
217
|
return textureLoad(
|
|
218
218
|
lightSamplingData,
|
|
219
|
-
vec2i(
|
|
219
|
+
vec2i(iR % width, iR / width),
|
|
220
220
|
0
|
|
221
221
|
);
|
|
222
222
|
}
|
|
@@ -238,9 +238,9 @@ e.zw, f.xy, f.zw
|
|
|
238
238
|
);
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
fn
|
|
241
|
+
fn vn(index: i32) -> ra {
|
|
242
242
|
let data = loadLightSamplingTexel(rtUniform.lightChoiceTexelOffset + index);
|
|
243
|
-
return
|
|
243
|
+
return ra(
|
|
244
244
|
data.x,
|
|
245
245
|
bitcast<i32>(data.y),
|
|
246
246
|
bitcast<i32>(data.z),
|
|
@@ -248,35 +248,35 @@ bitcast<i32>(data.w)
|
|
|
248
248
|
);
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
fn
|
|
252
|
-
return
|
|
251
|
+
fn kk(oO: i32, index: i32) -> ra {
|
|
252
|
+
return vn(oO + index);
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
fn
|
|
255
|
+
fn oD(
|
|
256
256
|
rnd: vec3f,
|
|
257
|
-
|
|
257
|
+
nG: u32,
|
|
258
258
|
candidateCount: u32
|
|
259
259
|
) -> vec3f {
|
|
260
|
-
var
|
|
260
|
+
var vW = rnd;
|
|
261
261
|
let count = max(candidateCount, 1u);
|
|
262
|
-
|
|
262
|
+
vW.z = (rnd.z + f32(min(nG, count - 1u))) /
|
|
263
263
|
f32(count);
|
|
264
|
-
return
|
|
264
|
+
return vW;
|
|
265
265
|
}
|
|
266
266
|
|
|
267
|
-
fn
|
|
267
|
+
fn nq(
|
|
268
268
|
triangle: EmissiveTriangle,
|
|
269
|
-
|
|
270
|
-
|
|
269
|
+
fB: vec3f,
|
|
270
|
+
jE: vec2f,
|
|
271
271
|
lightSample: ptr<function, LightSampleRec>
|
|
272
272
|
) {
|
|
273
|
-
let
|
|
273
|
+
let zI = sqrt(jE.x);
|
|
274
274
|
let barycentric = vec3f(
|
|
275
|
-
1.0 -
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
1.0 - zI,
|
|
276
|
+
zI * (1.0 - jE.y),
|
|
277
|
+
zI * jE.y
|
|
278
278
|
);
|
|
279
|
-
let
|
|
279
|
+
let wd =
|
|
280
280
|
barycentric.x * triangle.p0 +
|
|
281
281
|
barycentric.y * triangle.p1 +
|
|
282
282
|
barycentric.z * triangle.p2;
|
|
@@ -284,12 +284,12 @@ let uv =
|
|
|
284
284
|
barycentric.x * triangle.uv0 +
|
|
285
285
|
barycentric.y * triangle.uv1 +
|
|
286
286
|
barycentric.z * triangle.uv2;
|
|
287
|
-
let
|
|
287
|
+
let cT =
|
|
288
288
|
barycentric.x * triangle.secondaryUv0 +
|
|
289
289
|
barycentric.y * triangle.secondaryUv1 +
|
|
290
290
|
barycentric.z * triangle.secondaryUv2;
|
|
291
291
|
let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));
|
|
292
|
-
(*lightSample).direction =
|
|
292
|
+
(*lightSample).direction = wd - fB;
|
|
293
293
|
(*lightSample).dist = length((*lightSample).direction);
|
|
294
294
|
if ((*lightSample).dist <= EPS) {
|
|
295
295
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -298,27 +298,27 @@ return;
|
|
|
298
298
|
}
|
|
299
299
|
(*lightSample).direction /= (*lightSample).dist;
|
|
300
300
|
(*lightSample).normal = normal;
|
|
301
|
-
let
|
|
302
|
-
if (
|
|
301
|
+
let pi = dot(normal, -(*lightSample).direction);
|
|
302
|
+
if (pi <= 0.0) {
|
|
303
303
|
(*lightSample).emission = vec3f(0.0);
|
|
304
304
|
(*lightSample).pdf = 0.0;
|
|
305
305
|
return;
|
|
306
306
|
}
|
|
307
307
|
(*lightSample).emission = getMaterialEmission(
|
|
308
|
-
i32(triangle.materialIndex), uv,
|
|
308
|
+
i32(triangle.materialIndex), uv, cT
|
|
309
309
|
);
|
|
310
310
|
(*lightSample).selectionPmf = triangle.selectionPmf;
|
|
311
311
|
(*lightSample).pdf = triangle.selectionPmf *
|
|
312
312
|
((*lightSample).dist * (*lightSample).dist) /
|
|
313
|
-
max(triangle.area *
|
|
313
|
+
max(triangle.area * pi, 1e-8);
|
|
314
314
|
}
|
|
315
315
|
|
|
316
|
-
fn
|
|
317
|
-
|
|
316
|
+
fn hz(
|
|
317
|
+
fB: vec3f,
|
|
318
318
|
rnd: vec3f,
|
|
319
|
-
|
|
319
|
+
oO: i32,
|
|
320
320
|
choiceCount: i32,
|
|
321
|
-
|
|
321
|
+
oN: f32,
|
|
322
322
|
lightSample: ptr<function, LightSampleRec>
|
|
323
323
|
) {
|
|
324
324
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -332,19 +332,19 @@ if (choiceCount <= 0) {
|
|
|
332
332
|
return;
|
|
333
333
|
}
|
|
334
334
|
|
|
335
|
-
let
|
|
336
|
-
let column = min(i32(
|
|
337
|
-
let
|
|
338
|
-
let
|
|
339
|
-
|
|
335
|
+
let tM = rnd.z * f32(choiceCount);
|
|
336
|
+
let column = min(i32(tM), choiceCount - 1);
|
|
337
|
+
let tk = kk(oO, column);
|
|
338
|
+
let jG = select(
|
|
339
|
+
tk.aliasIndex,
|
|
340
340
|
column,
|
|
341
|
-
fract(
|
|
341
|
+
fract(tM) < tk.probability
|
|
342
342
|
);
|
|
343
|
-
let choice =
|
|
343
|
+
let choice = kk(oO, jG);
|
|
344
344
|
if (USE_ENVMAP && choice.sourceType == ${LIGHT_CHOICE_ENVIRONMENT}) {
|
|
345
345
|
(*lightSample).sourceType = 0u;
|
|
346
346
|
(*lightSample).sourceIndex = u32(choice.sourceIndex);
|
|
347
|
-
|
|
347
|
+
iM(rnd.xy, lightSample);
|
|
348
348
|
(*lightSample).selectionPmf = rtUniform.envLightPmf;
|
|
349
349
|
(*lightSample).pdf *= rtUniform.envLightPmf;
|
|
350
350
|
}
|
|
@@ -352,32 +352,32 @@ else if (choice.sourceType == ${LIGHT_CHOICE_ANALYTIC}) {
|
|
|
352
352
|
(*lightSample).sourceType = 2u;
|
|
353
353
|
(*lightSample).sourceIndex = u32(choice.sourceIndex);
|
|
354
354
|
let light = analyticLights[choice.sourceIndex];
|
|
355
|
-
sampleAnalyticLight(light,
|
|
355
|
+
sampleAnalyticLight(light, fB, rnd.xy, lightSample);
|
|
356
356
|
(*lightSample).selectionPmf = light.selectionPmf;
|
|
357
357
|
(*lightSample).pdf *= light.selectionPmf;
|
|
358
358
|
}
|
|
359
359
|
else if (HAS_SCENE_EMISSIVE_LIGHT && choice.sourceType == ${LIGHT_CHOICE_EMISSIVE_TRIANGLE}) {
|
|
360
360
|
(*lightSample).sourceType = 1u;
|
|
361
361
|
(*lightSample).sourceIndex = u32(choice.sourceIndex);
|
|
362
|
-
|
|
362
|
+
nq(
|
|
363
363
|
getEmissiveTriangle(choice.sourceIndex),
|
|
364
|
-
|
|
364
|
+
fB,
|
|
365
365
|
rnd.xy,
|
|
366
366
|
lightSample
|
|
367
367
|
);
|
|
368
368
|
}
|
|
369
|
-
(*lightSample).selectionPmf *=
|
|
370
|
-
(*lightSample).pdf *=
|
|
369
|
+
(*lightSample).selectionPmf *= oN;
|
|
370
|
+
(*lightSample).pdf *= oN;
|
|
371
371
|
}
|
|
372
372
|
|
|
373
373
|
fn sampleLight(
|
|
374
|
-
|
|
374
|
+
fB: vec3f,
|
|
375
375
|
rnd: vec3f,
|
|
376
376
|
lightSample: ptr<function, LightSampleRec>,
|
|
377
|
-
|
|
377
|
+
uP: bool
|
|
378
378
|
) {
|
|
379
|
-
|
|
380
|
-
|
|
379
|
+
hz(
|
|
380
|
+
fB,
|
|
381
381
|
rnd,
|
|
382
382
|
0,
|
|
383
383
|
rtUniform.lightChoiceCount,
|
|
@@ -388,16 +388,16 @@ lightSample
|
|
|
388
388
|
|
|
389
389
|
|
|
390
390
|
|
|
391
|
-
fn
|
|
392
|
-
|
|
391
|
+
fn oj(
|
|
392
|
+
fB: vec3f,
|
|
393
393
|
rnd: vec3f,
|
|
394
|
-
|
|
394
|
+
nG: u32,
|
|
395
395
|
candidateCount: u32,
|
|
396
396
|
lightSample: ptr<function, LightSampleRec>
|
|
397
397
|
) {
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
398
|
+
hz(
|
|
399
|
+
fB,
|
|
400
|
+
oD(rnd, nG, candidateCount),
|
|
401
401
|
0,
|
|
402
402
|
rtUniform.lightChoiceCount,
|
|
403
403
|
1.0,
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export declare function createSampleMaterialWgsl(hasAnisotropyDirections?: boolean, hasCoatNormals?: boolean, caustics?: boolean, researchContribution?: string, photonMapping?: boolean): string;
|
|
1
|
+
export declare function createSampleMaterialWgsl(hasAnisotropyDirections?: boolean, hasCoatNormals?: boolean, caustics?: boolean, researchContribution?: string, photonMapping?: boolean, channelIndependentRis?: boolean): string;
|
|
2
2
|
declare const _default: string;
|
|
3
3
|
export default _default;
|