@meimu/mutracer 0.1.4 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSES/Classroom-CC0.txt +121 -0
- package/README.md +7 -7
- package/THIRD_PARTY_NOTICES.md +13 -8
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +10421 -8363
- package/docs/api.md +202 -11
- package/docs/denoising.md +30 -15
- package/docs/materials.md +18 -27
- package/docs/performance.md +5 -2
- package/docs/progressive-rendering.md +32 -1
- package/docs/threejs.md +19 -10
- package/docs/updates.md +44 -2
- package/docs/viewer.md +41 -3
- package/lib/Display.d.ts +13 -2
- package/lib/Display.js +27 -6
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -0
- package/lib/Engine.js +52 -25
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +44 -9
- package/lib/Render.js +115 -17
- package/lib/Render.js.map +1 -1
- package/lib/RenderLoop.d.ts +7 -1
- package/lib/RenderLoop.js +94 -13
- package/lib/RenderLoop.js.map +1 -1
- package/lib/main.d.ts +6 -3
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/math/access.d.ts +4 -0
- package/lib/math/access.js +10 -0
- package/lib/math/access.js.map +1 -0
- package/lib/math/mat3.d.ts +4 -0
- package/lib/math/mat3.js +54 -0
- package/lib/math/mat3.js.map +1 -0
- package/lib/math/mat4.d.ts +19 -0
- package/lib/math/mat4.js +413 -0
- package/lib/math/mat4.js.map +1 -0
- package/lib/math/storage.d.ts +6 -0
- package/lib/math/storage.js +22 -0
- package/lib/math/storage.js.map +1 -0
- package/lib/math/types.d.ts +3 -0
- package/lib/math/types.js +2 -0
- package/lib/math/types.js.map +1 -0
- package/lib/math/vec2.d.ts +13 -0
- package/lib/math/vec2.js +52 -0
- package/lib/math/vec2.js.map +1 -0
- package/lib/math/vec3.d.ts +23 -0
- package/lib/math/vec3.js +139 -0
- package/lib/math/vec3.js.map +1 -0
- package/lib/math.d.ts +5 -17
- package/lib/math.js +5 -55
- package/lib/math.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/oidn.js +4 -2
- package/lib/oidn.js.map +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
- package/lib/renderer/AovPrimitiveCache.js +48 -0
- package/lib/renderer/AovPrimitiveCache.js.map +1 -0
- package/lib/renderer/Box3.d.ts +5 -0
- package/lib/renderer/Box3.js +9 -0
- package/lib/renderer/Box3.js.map +1 -0
- package/lib/renderer/GPUTraceQueue.d.ts +10 -0
- package/lib/renderer/GPUTraceQueue.js +31 -0
- package/lib/renderer/GPUTraceQueue.js.map +1 -0
- package/lib/renderer/MaterialData.d.ts +15 -0
- package/lib/renderer/MaterialData.js +61 -0
- package/lib/renderer/MaterialData.js.map +1 -0
- package/lib/renderer/MaterialTable.d.ts +11 -98
- package/lib/renderer/MaterialTable.js +34 -412
- package/lib/renderer/MaterialTable.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +32 -13
- package/lib/renderer/RenderingPipeline.js +1 -17
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +0 -1
- package/lib/renderer/TileRender.js +14 -1
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +39 -0
- package/lib/renderer/WGPUAov.js +239 -0
- package/lib/renderer/WGPUAov.js.map +1 -0
- package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
- package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
- package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
- package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
- package/lib/renderer/WGPUBindlessTextures.js +180 -0
- package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
- package/lib/renderer/WGPUBloomPass.js +17 -97
- package/lib/renderer/WGPUBloomPass.js.map +1 -1
- package/lib/renderer/WGPUComputePass.d.ts +1 -1
- package/lib/renderer/WGPUComputePass.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
- package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
- package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
- package/lib/renderer/WGPUFullQuadPass.js +10 -9
- package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
- package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
- package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
- package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WGPURayTraceOutput.js +26 -17
- package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
- package/lib/renderer/WGPURayTracePass.d.ts +36 -40
- package/lib/renderer/WGPURayTracePass.js +399 -548
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
- package/lib/renderer/WGPURenderingPipeline.js +239 -60
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WGPUShaderCache.d.ts +2 -2
- package/lib/renderer/WGPUShaderCache.js +10 -5
- package/lib/renderer/WGPUShaderCache.js.map +1 -1
- package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
- package/lib/renderer/WGPUShaderCapabilities.js +54 -0
- package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
- package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
- package/lib/renderer/WGPUSkyBaker.js +85 -0
- package/lib/renderer/WGPUSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLAov.d.ts +41 -0
- package/lib/renderer/WebGLAov.js +106 -0
- package/lib/renderer/WebGLAov.js.map +1 -0
- package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
- package/lib/renderer/WebGLFullQuadPass.js +18 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
- package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
- package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
- package/lib/renderer/WebGLRayTracePass.js +83 -7
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +116 -8
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
- package/lib/renderer/WebGLSkyBaker.js +422 -0
- package/lib/renderer/WebGLSkyBaker.js.map +1 -0
- package/lib/renderer/WebGLSkySource.d.ts +9 -0
- package/lib/renderer/WebGLSkySource.js +28 -0
- package/lib/renderer/WebGLSkySource.js.map +1 -0
- package/lib/renderer/accumulationTarget.d.ts +5 -0
- package/lib/renderer/accumulationTarget.js.map +1 -1
- package/lib/renderer/aov.d.ts +42 -0
- package/lib/renderer/aov.js +50 -0
- package/lib/renderer/aov.js.map +1 -0
- package/lib/renderer/aovDisplay.d.ts +14 -0
- package/lib/renderer/aovDisplay.js +32 -0
- package/lib/renderer/aovDisplay.js.map +1 -0
- package/lib/renderer/aovScene.d.ts +21 -0
- package/lib/renderer/aovScene.js +139 -0
- package/lib/renderer/aovScene.js.map +1 -0
- package/lib/renderer/binnedSahBvh.js +2 -1
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +20 -10
- package/lib/renderer/bvhAccel.js +168 -58
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
- package/lib/renderer/cameraSnapshot.js +2 -1
- package/lib/renderer/cameraSnapshot.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +2 -0
- package/lib/renderer/cameraUniform.js +12 -0
- package/lib/renderer/cameraUniform.js.map +1 -0
- package/lib/renderer/committedScene.js +4 -0
- package/lib/renderer/committedScene.js.map +1 -1
- package/lib/renderer/denoiser.d.ts +3 -11
- package/lib/renderer/denoiser.js.map +1 -1
- package/lib/renderer/depthQuery.js +4 -1
- package/lib/renderer/depthQuery.js.map +1 -1
- package/lib/renderer/displacementPreparation.d.ts +11 -0
- package/lib/renderer/displacementPreparation.js +351 -0
- package/lib/renderer/displacementPreparation.js.map +1 -0
- package/lib/renderer/displacementRange.d.ts +1 -0
- package/lib/renderer/displacementRange.js +9 -0
- package/lib/renderer/displacementRange.js.map +1 -0
- package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
- package/lib/renderer/displayParityDiagnostics.js +2 -0
- package/lib/renderer/displayParityDiagnostics.js.map +1 -0
- package/lib/renderer/envMapCreation.d.ts +9 -8
- package/lib/renderer/envMapCreation.js +36 -12
- package/lib/renderer/envMapCreation.js.map +1 -1
- package/lib/renderer/envMapDistribution.d.ts +12 -2
- package/lib/renderer/envMapDistribution.js +43 -34
- package/lib/renderer/envMapDistribution.js.map +1 -1
- package/lib/renderer/geometryBvhBounds.d.ts +4 -0
- package/lib/renderer/geometryBvhBounds.js +82 -0
- package/lib/renderer/geometryBvhBounds.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +32 -0
- package/lib/renderer/geometryUpdateState.js +2 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -0
- package/lib/renderer/geometryUpdates.d.ts +17 -9
- package/lib/renderer/geometryUpdates.js +92 -33
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
- package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
- package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
- package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
- package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
- package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
- package/lib/renderer/glsl/aovTrace.frag.js +121 -0
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
- package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
- package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +7 -7
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
- package/lib/renderer/glsl/rayTrace.frag.js +191 -191
- package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
- package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
- package/lib/renderer/lightConstants.d.ts +10 -0
- package/lib/renderer/lightConstants.js +11 -0
- package/lib/renderer/lightConstants.js.map +1 -0
- package/lib/renderer/lightCore.d.ts +12 -0
- package/lib/renderer/lightCore.js +13 -0
- package/lib/renderer/lightCore.js.map +1 -0
- package/lib/renderer/lightSampling.d.ts +20 -17
- package/lib/renderer/lightSampling.js +123 -56
- package/lib/renderer/lightSampling.js.map +1 -1
- package/lib/renderer/lightsData.d.ts +21 -0
- package/lib/renderer/lightsData.js +192 -0
- package/lib/renderer/lightsData.js.map +1 -0
- package/lib/renderer/lightsUtil.d.ts +3 -26
- package/lib/renderer/lightsUtil.js +3 -153
- package/lib/renderer/lightsUtil.js.map +1 -1
- package/lib/renderer/materialBufferData.d.ts +70 -0
- package/lib/renderer/materialBufferData.js +2 -0
- package/lib/renderer/materialBufferData.js.map +1 -0
- package/lib/renderer/materialConstants.d.ts +11 -0
- package/lib/renderer/materialConstants.js +11 -0
- package/lib/renderer/materialConstants.js.map +1 -1
- package/lib/renderer/materialCore.d.ts +8 -0
- package/lib/renderer/materialCore.js +9 -0
- package/lib/renderer/materialCore.js.map +1 -0
- package/lib/renderer/materialEmission.d.ts +2 -2
- package/lib/renderer/materialEmission.js +3 -3
- package/lib/renderer/materialEmission.js.map +1 -1
- package/lib/renderer/materialLayout.d.ts +2 -101
- package/lib/renderer/materialLayout.js +110 -172
- package/lib/renderer/materialLayout.js.map +1 -1
- package/lib/renderer/materialLayoutSchema.d.ts +26 -0
- package/lib/renderer/materialLayoutSchema.js +172 -0
- package/lib/renderer/materialLayoutSchema.js.map +1 -0
- package/lib/renderer/materialParams.d.ts +69 -0
- package/lib/renderer/materialParams.js +272 -0
- package/lib/renderer/materialParams.js.map +1 -0
- package/lib/renderer/materialTextureSlots.d.ts +14 -324
- package/lib/renderer/materialTextureSlots.js +21 -8
- package/lib/renderer/materialTextureSlots.js.map +1 -1
- package/lib/renderer/materialTextures.d.ts +6 -0
- package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
- package/lib/renderer/materialTextures.js.map +1 -0
- package/lib/renderer/mergeMeshesToGeometry.js +6 -147
- package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
- package/lib/renderer/meshInstances.d.ts +4 -21
- package/lib/renderer/meshInstances.js +10 -56
- package/lib/renderer/meshInstances.js.map +1 -1
- package/lib/renderer/oidnNetwork.d.ts +2 -2
- package/lib/renderer/oidnNetwork.js +1 -1
- package/lib/renderer/oidnNetwork.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.js +850 -846
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/ownedDenoiser.d.ts +9 -0
- package/lib/renderer/ownedDenoiser.js +2 -0
- package/lib/renderer/ownedDenoiser.js.map +1 -0
- package/lib/renderer/packedMeshInstances.d.ts +23 -0
- package/lib/renderer/packedMeshInstances.js +80 -0
- package/lib/renderer/packedMeshInstances.js.map +1 -0
- package/lib/renderer/prepareMeshBVH.d.ts +12 -47
- package/lib/renderer/prepareMeshBVH.js +21 -642
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
- package/lib/renderer/proceduralEnvironmentPower.js +8 -0
- package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
- package/lib/renderer/progressiveScheduler.d.ts +1 -0
- package/lib/renderer/progressiveScheduler.js +3 -0
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +3 -1
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/renderingLimits.d.ts +9 -0
- package/lib/renderer/renderingLimits.js +18 -0
- package/lib/renderer/renderingLimits.js.map +1 -0
- package/lib/renderer/sceneAssembly.d.ts +73 -0
- package/lib/renderer/sceneAssembly.js +109 -0
- package/lib/renderer/sceneAssembly.js.map +1 -0
- package/lib/renderer/sceneChangeCore.d.ts +39 -0
- package/lib/renderer/sceneChangeCore.js +307 -0
- package/lib/renderer/sceneChangeCore.js.map +1 -0
- package/lib/renderer/sceneChangeDetector.d.ts +3 -6
- package/lib/renderer/sceneChangeDetector.js +24 -150
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
- package/lib/renderer/sceneLayoutSchema.js +111 -0
- package/lib/renderer/sceneLayoutSchema.js.map +1 -0
- package/lib/renderer/sceneLightChanges.d.ts +3 -3
- package/lib/renderer/sceneLightChanges.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +55 -0
- package/lib/renderer/scenePreparation.js +360 -0
- package/lib/renderer/scenePreparation.js.map +1 -0
- package/lib/renderer/scratchSampling.js +18 -18
- package/lib/renderer/scratchSampling.js.map +1 -1
- package/lib/renderer/shader.d.ts +2 -0
- package/lib/renderer/shader.js +2 -0
- package/lib/renderer/shader.js.map +1 -1
- package/lib/renderer/shaderCapabilities.d.ts +23 -0
- package/lib/renderer/shaderCapabilities.js +55 -0
- package/lib/renderer/shaderCapabilities.js.map +1 -0
- package/lib/renderer/shaderCapacity.d.ts +2 -0
- package/lib/renderer/shaderCapacity.js +5 -0
- package/lib/renderer/shaderCapacity.js.map +1 -0
- package/lib/renderer/skyModel.d.ts +9 -0
- package/lib/renderer/skyModel.js +10 -0
- package/lib/renderer/skyModel.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +60 -0
- package/lib/renderer/textureAtlas.js +145 -0
- package/lib/renderer/textureAtlas.js.map +1 -0
- package/lib/renderer/textureAtlasPixels.d.ts +7 -0
- package/lib/renderer/textureAtlasPixels.js +68 -0
- package/lib/renderer/textureAtlasPixels.js.map +1 -0
- package/lib/renderer/util.d.ts +1 -1
- package/lib/renderer/util.js.map +1 -1
- package/lib/renderer/webgl.d.ts +9 -2
- package/lib/renderer/webgl.js +54 -9
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/wgpuBindless.d.ts +26 -0
- package/lib/renderer/wgpuBindless.js +95 -0
- package/lib/renderer/wgpuBindless.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
- package/lib/renderer/wgpuBindlessSource.js +51 -0
- package/lib/renderer/wgpuBindlessSource.js.map +1 -0
- package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
- package/lib/renderer/wgpuMaterialConstants.js +52 -0
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
- package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
- package/lib/renderer/wgpuSceneUniform.js +125 -0
- package/lib/renderer/wgpuSceneUniform.js.map +1 -0
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +31 -0
- package/lib/renderer/wgpuShaderSource.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
- package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
- package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
- package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
- package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
- package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
- 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.js +7 -7
- package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
- package/lib/renderer/wgsl/jnlm.compute.js +315 -0
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
- package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
- package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Camera.js +7 -3
- package/lib/scene/Camera.js.map +1 -1
- package/lib/scene/EnvironmentLight.d.ts +5 -9
- package/lib/scene/EnvironmentLight.js +4 -14
- package/lib/scene/EnvironmentLight.js.map +1 -1
- package/lib/scene/EnvironmentLightState.d.ts +18 -0
- package/lib/scene/EnvironmentLightState.js +19 -0
- package/lib/scene/EnvironmentLightState.js.map +1 -0
- package/lib/scene/Geometry.d.ts +12 -6
- package/lib/scene/Geometry.js +37 -13
- package/lib/scene/Geometry.js.map +1 -1
- package/lib/scene/InstanceState.d.ts +39 -0
- package/lib/scene/InstanceState.js +77 -0
- package/lib/scene/InstanceState.js.map +1 -0
- package/lib/scene/InstancedMesh.d.ts +1 -1
- package/lib/scene/InstancedMesh.js +3 -0
- package/lib/scene/InstancedMesh.js.map +1 -1
- package/lib/scene/MaterialState.d.ts +209 -0
- package/lib/scene/MaterialState.js +231 -0
- package/lib/scene/MaterialState.js.map +1 -0
- package/lib/scene/Mesh.d.ts +4 -6
- package/lib/scene/Mesh.js +3 -11
- package/lib/scene/Mesh.js.map +1 -1
- package/lib/scene/MeshState.d.ts +20 -0
- package/lib/scene/MeshState.js +35 -0
- package/lib/scene/MeshState.js.map +1 -0
- package/lib/scene/OpenPBRMaterial.d.ts +7 -169
- package/lib/scene/OpenPBRMaterial.js +5 -223
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/scene/PixelTexture.d.ts +6 -0
- package/lib/scene/PixelTexture.js +10 -0
- package/lib/scene/PixelTexture.js.map +1 -0
- package/lib/scene/ProceduralSky.d.ts +24 -0
- package/lib/scene/ProceduralSky.js +40 -0
- package/lib/scene/ProceduralSky.js.map +1 -0
- package/lib/scene/RectLight.d.ts +2 -13
- package/lib/scene/RectLight.js +3 -21
- package/lib/scene/RectLight.js.map +1 -1
- package/lib/scene/RectLightState.d.ts +31 -0
- package/lib/scene/RectLightState.js +26 -0
- package/lib/scene/RectLightState.js.map +1 -0
- package/lib/scene/Scene.d.ts +15 -4
- package/lib/scene/Scene.js.map +1 -1
- package/lib/scene/SceneNode.js +7 -6
- package/lib/scene/SceneNode.js.map +1 -1
- package/lib/scene/Texture.d.ts +10 -41
- package/lib/scene/Texture.js +4 -33
- package/lib/scene/Texture.js.map +1 -1
- package/lib/scene/TextureState.d.ts +35 -0
- package/lib/scene/TextureState.js +35 -0
- package/lib/scene/TextureState.js.map +1 -0
- package/lib/scene/attributeData.d.ts +4 -0
- package/lib/scene/attributeData.js +10 -0
- package/lib/scene/attributeData.js.map +1 -0
- package/lib/scene/lightState.d.ts +8 -0
- package/lib/scene/lightState.js +2 -0
- package/lib/scene/lightState.js.map +1 -0
- package/lib/scene/openPbrSchema.d.ts +7 -12
- package/lib/scene/openPbrSchema.js +273 -28
- package/lib/scene/openPbrSchema.js.map +1 -1
- package/lib/scene/skyParameters.d.ts +20 -0
- package/lib/scene/skyParameters.js +28 -0
- package/lib/scene/skyParameters.js.map +1 -0
- package/lib/scene/textureData.d.ts +9 -0
- package/lib/scene/textureData.js +2 -0
- package/lib/scene/textureData.js.map +1 -0
- package/lib/scene/texturePixels.d.ts +6 -0
- package/lib/scene/texturePixels.js +10 -0
- package/lib/scene/texturePixels.js.map +1 -0
- package/lib/settings/display.d.ts +33 -0
- package/lib/settings/display.js +7 -0
- package/lib/settings/display.js.map +1 -1
- package/lib/settings/render.d.ts +25 -3
- package/lib/settings/render.js +3 -1
- package/lib/settings/render.js.map +1 -1
- package/lib/tinybvh/tinybvh.wasm +0 -0
- package/lib/util/commonGeometry.js +7 -7
- package/lib/util/commonGeometry.js.map +1 -1
- package/lib/util/fromTHREE.d.ts +4 -1
- package/lib/util/fromTHREE.js +18 -5
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/util/geometry.js +42 -29
- package/lib/util/geometry.js.map +1 -1
- package/lib/util/loadRGBE.js +3 -4
- package/lib/util/loadRGBE.js.map +1 -1
- package/lib/util/studioLighting.d.ts +18 -0
- package/lib/util/studioLighting.js +36 -0
- package/lib/util/studioLighting.js.map +1 -0
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/llms.txt +4 -0
- package/package.json +31 -5
- package/lib/renderer/texturesFromMaterials.d.ts +0 -6
- package/lib/renderer/texturesFromMaterials.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,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EACnC,uBAAuB,GAAG,IAAI,EAC9B,cAAc,GAAG,KAAK,EACtB,aAAa,GAAG,IAAI,EAKrB;IACC,OAAO,QAAQ,CAAC;;;;;;gBAMF,aAAa;yBACJ,qBAAqB;;qBAEzB,mBAAmB;uBACjB,qBAAqB;4BAChB,0BAA0B;qBACjC,mBAAmB;;;;;;;;;;;;;;;EAetC,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFxC,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8DA+CwC,uBAAuB,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqE9H,CAAC;AACF,CAAC","sourcesContent":["import { materialBufferWgsl } from '../../materialLayout.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 '../../lightsUtil.js';\n\nexport default function rayTraceCore({\n hasAnisotropyDirections = true,\n hasCoatNormals = false,\n hasSceneAlpha = true\n}: {\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: boolean;\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};\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\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,\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,\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 environmentRotation: mat4x4f,\n backgroundMapTransform: vec4f,\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,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,iBAAiB,GAAG,6BAA6B,EAMlD;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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2Df,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsFxC,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 lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES\n}: {\n hasAnisotropyDirections?: boolean;\n hasCoatNormals?: boolean;\n hasSceneAlpha?: 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\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,\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,\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,2 +1,2 @@
|
|
|
1
|
-
declare const _default: "\nfn light_sample_sphere(light: Light, scatterPos: vec3f, randomV2: vec2f, lightSample: ptr<function, LightSampleRec>) {\n let centerOffset = light.position - scatterPos;\n let centerDistance = length(centerOffset);\n if (light.radiusOrSpread <= 0.0) {\n // A zero-radius sphere is a point emitter. The stored emission is\n // luminous intensity, so convert it to incident radiance here rather\n // than approximating the delta source as a tiny area sphere.\n if (centerDistance <= 1e-6) {\n (*lightSample).direction = vec3f(0.0, 0.0, 1.0);\n (*lightSample).normal = vec3f(0.0, 0.0, -1.0);\n (*lightSample).dist = 0.0;\n (*lightSample).pdf = 1.0;\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).isDelta = true;\n return;\n }\n (*lightSample).direction = centerOffset / centerDistance;\n (*lightSample).normal = -(*lightSample).direction;\n (*lightSample).dist = centerDistance;\n (*lightSample).pdf = 1.0;\n (*lightSample).emission = light.emission /\n max(centerDistance * centerDistance, 1e-8);\n (*lightSample).isDelta = true;\n return;\n }\n let radius = max(light.radiusOrSpread, 1e-6);\n (*lightSample).isDelta = false;\n var sampledDirection: vec3f;\n\n if (centerDistance <= radius) {\n let z = 1.0 - 2.0 * randomV2.x;\n let radial = sqrt(max(0.0, 1.0 - z * z));\n let azimuth = TWOPI * randomV2.y;\n sampledDirection = vec3f(\n radial * cos(azimuth),\n radial * sin(azimuth),\n z\n );\n (*lightSample).pdf = INV4PI;\n }\n else {\n let sphereAxis = centerOffset / centerDistance;\n let sinThetaMaxSquared = min(\n 1.0,\n radius * radius / (centerDistance * centerDistance)\n );\n let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));\n let cosTheta = mix(1.0, cosThetaMax, randomV2.x);\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let azimuth = TWOPI * randomV2.y;\n var tangent: vec3f;\n var bitangent: vec3f;\n sampling_orthonormal_basis(sphereAxis, &tangent, &bitangent);\n sampledDirection = sphereAxis * cosTheta\n + tangent * (sinTheta * cos(azimuth))\n + bitangent * (sinTheta * sin(azimuth));\n (*lightSample).pdf = 1.0 / max(\n TWOPI * (1.0 - cosThetaMax),\n 1e-8\n );\n }\n\n let centerProjection = dot(sampledDirection, centerOffset);\n let centerOffsetSquared = dot(centerOffset, centerOffset);\n let discriminant = centerProjection * centerProjection\n - centerOffsetSquared + radius * radius;\n let nearDistance = centerProjection - sqrt(max(0.0, discriminant));\n let farDistance = centerProjection + sqrt(max(0.0, discriminant));\n (*lightSample).dist = select(farDistance, nearDistance, nearDistance > 1e-6);\n (*lightSample).direction = sampledDirection;\n let lightSurfacePos = scatterPos + sampledDirection * (*lightSample).dist;\n (*lightSample).normal = normalize(lightSurfacePos - light.position);\n (*lightSample).emission = light.emission;\n}\n\nfn light_apply_rect_texture(\n light: Light,\n surfacePoint: vec3f,\n lowerLeft: vec3f,\n result: ptr<function, LightSampleRec>\n) {\n if (light.textureIndex < 0.0) {\n return;\n }\n let width = length(light.u);\n let height = length(light.v);\n let relative = surfacePoint - lowerLeft;\n let uv = vec2f(\n dot(relative, light.u / width) / width,\n dot(relative, light.v / height) / height\n );\n (*result).emission *= sampleMap(i32(light.textureIndex), uv).rgb;\n}\n\nfn light_sample_rect(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n let normal = normalize(cross(light.u, light.v));\n let lowerLeft = light.position - 0.5 * (light.u + light.v);\n let spread = clamp(light.radiusOrSpread, 0.0, 1.0);\n\n if (spread <= 0.001) {\n let planeDistance = dot(normal, shadingPoint - light.position);\n let surfacePoint = shadingPoint - normal * planeDistance;\n let relative = surfacePoint - lowerLeft;\n let width = length(light.u);\n let height = length(light.v);\n let uv = vec2f(\n dot(relative, light.u / width) / width,\n dot(relative, light.v / height) / height\n );\n if (planeDistance <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {\n (*result).emission = vec3f(0.0);\n (*result).pdf = 0.0;\n return;\n }\n (*result).direction = -normal;\n (*result).dist = planeDistance;\n (*result).normal = normal;\n (*result).emission = light.emission;\n (*result).pdf = 1.0;\n (*result).isDelta = true;\n light_apply_rect_texture(light, surfacePoint, lowerLeft, result);\n return;\n }\n\n let surfacePoint = lowerLeft\n + light.u * samplePoint.x\n + light.v * samplePoint.y;\n let offset = surfacePoint - shadingPoint;\n let distanceSquared = dot(offset, offset);\n (*result).dist = sqrt(distanceSquared);\n (*result).direction = offset / (*result).dist;\n (*result).normal = normal;\n let emitterCosine = dot(-(*result).direction, normal);\n let spreadCosine = cos(0.5 * PI * spread);\n if (emitterCosine <= 0.0 || emitterCosine < spreadCosine) {\n (*result).emission = vec3f(0.0);\n (*result).pdf = 0.0;\n return;\n }\n (*result).emission = light.emission;\n (*result).pdf = distanceSquared / max(light.area * emitterCosine, 1e-8);\n light_apply_rect_texture(light, surfacePoint, lowerLeft, result);\n}\n\nfn light_sample_directional(\n light: Light,\n result: ptr<function, LightSampleRec>\n) {\n (*result).direction = normalize(-light.u);\n (*result).normal = -(*result).direction;\n (*result).emission = light.emission;\n (*result).dist = INF;\n (*result).pdf = 1.0;\n (*result).isDelta = true;\n}\n\nfn light_sample_spot(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n light_sample_sphere(light, shadingPoint, samplePoint, result);\n let surfacePoint = shadingPoint + (*result).direction * (*result).dist;\n let lightToSurface = normalize(shadingPoint - surfacePoint);\n (*result).emission *= evaluateSpotEmissionMultiplier(light, lightToSurface);\n}\n\nfn sampleAnalyticLight(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n let lightType = i32(light.litType);\n if (lightType == RECT_LIGHT) {\n light_sample_rect(light, shadingPoint, samplePoint, result);\n return;\n }\n if (lightType == SPHERE_LIGHT) {\n light_sample_sphere(light, shadingPoint, samplePoint, result);\n return;\n }\n if (lightType == SPOT_LIGHT) {\n light_sample_spot(light, shadingPoint, samplePoint, result);\n return;\n }\n if (lightType == DIRECTIONAL_LIGHT) {\n light_sample_directional(light, result);\n }\n}\n\nfn sampleEnvLight(randomV2: vec2f, lightSample: ptr<function, LightSampleRec>) {\n var uv: vec2f;\n (*lightSample).direction = sampleEnvmap(randomV2, &uv, &(*lightSample).pdf);\n (*lightSample).emission = textureLinear(envMap, uv).rgb;\n (*lightSample).dist = INF;\n}\n\nfn loadLightSamplingTexel(texelIndex: i32) -> vec4f {\n let width = rtUniform.lightSamplingTextureWidth;\n return textureLoad(\n lightSamplingData,\n vec2i(texelIndex % width, texelIndex / width),\n 0\n );\n}\n\nfn getEmissiveTriangle(index: i32) -> EmissiveTriangle {\n let offset = index * 6;\n let a = loadLightSamplingTexel(offset);\n let b = loadLightSamplingTexel(offset + 1);\n let c = loadLightSamplingTexel(offset + 2);\n let d = loadLightSamplingTexel(offset + 3);\n let e = loadLightSamplingTexel(offset + 4);\n let f = loadLightSamplingTexel(offset + 5);\n return EmissiveTriangle(\n a.xyz, a.w,\n b.xyz, b.w,\n c.xyz, c.w,\n d.xy, d.zw, e.xy,\n e.zw, f.xy, f.zw\n );\n}\n\nfn getLightChoice(index: i32) -> LightChoice {\n let data = loadLightSamplingTexel(rtUniform.lightChoiceTexelOffset + index);\n return LightChoice(\n data.x,\n bitcast<i32>(data.y),\n bitcast<i32>(data.z),\n bitcast<i32>(data.w)\n );\n}\n\nfn getLightChoiceFromTable(tableOffset: i32, index: i32) -> LightChoice {\n return getLightChoice(tableOffset + index);\n}\n\nfn stratifyLightChoiceRandom(\n rnd: vec3f,\n candidateIndex: u32,\n candidateCount: u32\n) -> vec3f {\n var stratified = rnd;\n let count = max(candidateCount, 1u);\n stratified.z = (rnd.z + f32(min(candidateIndex, count - 1u))) /\n f32(count);\n return stratified;\n}\n\nfn sampleEmissiveTriangleLight(\n triangle: EmissiveTriangle,\n scatterPos: vec3f,\n randomV2: vec2f,\n lightSample: ptr<function, LightSampleRec>\n) {\n let sqrtU = sqrt(randomV2.x);\n let barycentric = vec3f(\n 1.0 - sqrtU,\n sqrtU * (1.0 - randomV2.y),\n sqrtU * randomV2.y\n );\n let lightPosition =\n barycentric.x * triangle.p0 +\n barycentric.y * triangle.p1 +\n barycentric.z * triangle.p2;\n let uv =\n barycentric.x * triangle.uv0 +\n barycentric.y * triangle.uv1 +\n barycentric.z * triangle.uv2;\n let secondaryUv =\n barycentric.x * triangle.secondaryUv0 +\n barycentric.y * triangle.secondaryUv1 +\n barycentric.z * triangle.secondaryUv2;\n let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));\n (*lightSample).direction = lightPosition - scatterPos;\n (*lightSample).dist = length((*lightSample).direction);\n if ((*lightSample).dist <= EPS) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n return;\n }\n (*lightSample).direction /= (*lightSample).dist;\n (*lightSample).normal = normal;\n let cosLight = dot(normal, -(*lightSample).direction);\n if (cosLight <= 0.0) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n return;\n }\n (*lightSample).emission = getMaterialEmission(\n i32(triangle.materialIndex), uv, secondaryUv\n );\n (*lightSample).selectionPmf = triangle.selectionPmf;\n (*lightSample).pdf = triangle.selectionPmf *\n ((*lightSample).dist * (*lightSample).dist) /\n max(triangle.area * cosLight, 1e-8);\n}\n\nfn sampleLightChoiceTable(\n scatterPos: vec3f,\n rnd: vec3f,\n tableOffset: i32,\n choiceCount: i32,\n selectionPmfScale: f32,\n lightSample: ptr<function, LightSampleRec>\n) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n (*lightSample).selectionPmf = 0.0;\n (*lightSample).dist = INF;\n (*lightSample).isDelta = false;\n (*lightSample).sourceType = 0u;\n (*lightSample).sourceIndex = 0xffffffffu;\n if (choiceCount <= 0) {\n return;\n }\n\n let scaledChoice = rnd.z * f32(choiceCount);\n let column = min(i32(scaledChoice), choiceCount - 1);\n let columnChoice = getLightChoiceFromTable(tableOffset, column);\n let selectedIndex = select(\n columnChoice.aliasIndex,\n column,\n fract(scaledChoice) < columnChoice.probability\n );\n let choice = getLightChoiceFromTable(tableOffset, selectedIndex);\n if (choice.sourceType == 1) {\n (*lightSample).sourceType = 0u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n sampleEnvLight(rnd.xy, lightSample);\n (*lightSample).selectionPmf = rtUniform.envLightPmf;\n (*lightSample).pdf *= rtUniform.envLightPmf;\n }\n else if (choice.sourceType == 2) {\n (*lightSample).sourceType = 2u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n let light = analyticLights[choice.sourceIndex];\n sampleAnalyticLight(light, scatterPos, rnd.xy, lightSample);\n (*lightSample).selectionPmf = light.selectionPmf;\n (*lightSample).pdf *= light.selectionPmf;\n }\n else if (choice.sourceType == 3) {\n (*lightSample).sourceType = 1u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n sampleEmissiveTriangleLight(\n getEmissiveTriangle(choice.sourceIndex),\n scatterPos,\n rnd.xy,\n lightSample\n );\n }\n (*lightSample).selectionPmf *= selectionPmfScale;\n (*lightSample).pdf *= selectionPmfScale;\n}\n\nfn sampleLight(\n scatterPos: vec3f,\n rnd: vec3f,\n lightSample: ptr<function, LightSampleRec>,\n distByIntensity: bool\n) {\n sampleLightChoiceTable(\n scatterPos,\n rnd,\n 0,\n rtUniform.lightChoiceCount,\n 1.0,\n lightSample\n );\n}\n\n// Light choice for one of the resampled NEE candidates. The selection random\n// number is stratified across the candidates.\nfn sampleLightForNEECandidate(\n scatterPos: vec3f,\n rnd: vec3f,\n candidateIndex: u32,\n candidateCount: u32,\n lightSample: ptr<function, LightSampleRec>\n) {\n sampleLightChoiceTable(\n scatterPos,\n stratifyLightChoiceRandom(rnd, candidateIndex, candidateCount),\n 0,\n rtUniform.lightChoiceCount,\n 1.0,\n lightSample\n );\n}\n";
|
|
1
|
+
declare const _default: "\nfn light_sample_sphere(light: Light, scatterPos: vec3f, randomV2: vec2f, lightSample: ptr<function, LightSampleRec>) {\n let centerOffset = light.position - scatterPos;\n let centerDistance = length(centerOffset);\n if (light.radiusOrSpread <= 0.0) {\n // A zero-radius sphere is a point emitter. The stored emission is\n // luminous intensity, so convert it to incident radiance here rather\n // than approximating the delta source as a tiny area sphere.\n if (centerDistance <= 1e-6) {\n (*lightSample).direction = vec3f(0.0, 0.0, 1.0);\n (*lightSample).normal = vec3f(0.0, 0.0, -1.0);\n (*lightSample).dist = 0.0;\n (*lightSample).pdf = 1.0;\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).isDelta = true;\n return;\n }\n (*lightSample).direction = centerOffset / centerDistance;\n (*lightSample).normal = -(*lightSample).direction;\n (*lightSample).dist = centerDistance;\n (*lightSample).pdf = 1.0;\n (*lightSample).emission = light.emission /\n max(centerDistance * centerDistance, 1e-8);\n (*lightSample).isDelta = true;\n return;\n }\n let radius = max(light.radiusOrSpread, 1e-6);\n (*lightSample).isDelta = false;\n var sampledDirection: vec3f;\n\n if (centerDistance <= radius) {\n let z = 1.0 - 2.0 * randomV2.x;\n let radial = sqrt(max(0.0, 1.0 - z * z));\n let azimuth = TWOPI * randomV2.y;\n sampledDirection = vec3f(\n radial * cos(azimuth),\n radial * sin(azimuth),\n z\n );\n (*lightSample).pdf = INV4PI;\n }\n else {\n let sphereAxis = centerOffset / centerDistance;\n let sinThetaMaxSquared = min(\n 1.0,\n radius * radius / (centerDistance * centerDistance)\n );\n let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));\n let cosTheta = mix(1.0, cosThetaMax, randomV2.x);\n let sinTheta = sqrt(max(0.0, 1.0 - cosTheta * cosTheta));\n let azimuth = TWOPI * randomV2.y;\n var tangent: vec3f;\n var bitangent: vec3f;\n sampling_orthonormal_basis(sphereAxis, &tangent, &bitangent);\n sampledDirection = sphereAxis * cosTheta\n + tangent * (sinTheta * cos(azimuth))\n + bitangent * (sinTheta * sin(azimuth));\n (*lightSample).pdf = 1.0 / max(\n TWOPI * (1.0 - cosThetaMax),\n 1e-8\n );\n }\n\n let centerProjection = dot(sampledDirection, centerOffset);\n let centerOffsetSquared = dot(centerOffset, centerOffset);\n let discriminant = centerProjection * centerProjection\n - centerOffsetSquared + radius * radius;\n let nearDistance = centerProjection - sqrt(max(0.0, discriminant));\n let farDistance = centerProjection + sqrt(max(0.0, discriminant));\n (*lightSample).dist = select(farDistance, nearDistance, nearDistance > 1e-6);\n (*lightSample).direction = sampledDirection;\n let lightSurfacePos = scatterPos + sampledDirection * (*lightSample).dist;\n (*lightSample).normal = normalize(lightSurfacePos - light.position);\n (*lightSample).emission = light.emission;\n}\n\nfn light_apply_rect_texture(\n light: Light,\n surfacePoint: vec3f,\n lowerLeft: vec3f,\n result: ptr<function, LightSampleRec>\n) {\n if (light.textureIndex < 0.0) {\n return;\n }\n let width = length(light.u);\n let height = length(light.v);\n let relative = surfacePoint - lowerLeft;\n let uv = vec2f(\n dot(relative, light.u / width) / width,\n dot(relative, light.v / height) / height\n );\n (*result).emission *= sampleMap(i32(light.textureIndex), uv).rgb;\n}\n\nfn light_sample_rect(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n let normal = normalize(cross(light.u, light.v));\n let lowerLeft = light.position - 0.5 * (light.u + light.v);\n let spread = clamp(light.radiusOrSpread, 0.0, 1.0);\n\n if (spread <= 0.001) {\n let planeDistance = dot(normal, shadingPoint - light.position);\n let surfacePoint = shadingPoint - normal * planeDistance;\n let relative = surfacePoint - lowerLeft;\n let width = length(light.u);\n let height = length(light.v);\n let uv = vec2f(\n dot(relative, light.u / width) / width,\n dot(relative, light.v / height) / height\n );\n if (planeDistance <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {\n (*result).emission = vec3f(0.0);\n (*result).pdf = 0.0;\n return;\n }\n (*result).direction = -normal;\n (*result).dist = planeDistance;\n (*result).normal = normal;\n (*result).emission = light.emission;\n (*result).pdf = 1.0;\n (*result).isDelta = true;\n light_apply_rect_texture(light, surfacePoint, lowerLeft, result);\n return;\n }\n\n let surfacePoint = lowerLeft\n + light.u * samplePoint.x\n + light.v * samplePoint.y;\n let offset = surfacePoint - shadingPoint;\n let distanceSquared = dot(offset, offset);\n (*result).dist = sqrt(distanceSquared);\n (*result).direction = offset / (*result).dist;\n (*result).normal = normal;\n let emitterCosine = dot(-(*result).direction, normal);\n let spreadCosine = cos(0.5 * PI * spread);\n if (emitterCosine <= 0.0 || emitterCosine < spreadCosine) {\n (*result).emission = vec3f(0.0);\n (*result).pdf = 0.0;\n return;\n }\n (*result).emission = light.emission;\n (*result).pdf = distanceSquared / max(light.area * emitterCosine, 1e-8);\n light_apply_rect_texture(light, surfacePoint, lowerLeft, result);\n}\n\nfn light_sample_directional(\n light: Light,\n result: ptr<function, LightSampleRec>\n) {\n (*result).direction = normalize(-light.u);\n (*result).normal = -(*result).direction;\n (*result).emission = light.emission;\n (*result).dist = INF;\n (*result).pdf = 1.0;\n (*result).isDelta = true;\n}\n\nfn light_sample_spot(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n light_sample_sphere(light, shadingPoint, samplePoint, result);\n let surfacePoint = shadingPoint + (*result).direction * (*result).dist;\n let lightToSurface = normalize(shadingPoint - surfacePoint);\n (*result).emission *= evaluateSpotEmissionMultiplier(light, lightToSurface);\n}\n\nfn sampleAnalyticLight(\n light: Light,\n shadingPoint: vec3f,\n samplePoint: vec2f,\n result: ptr<function, LightSampleRec>\n) {\n let lightType = i32(light.litType);\n if (HAS_SCENE_RECT_LIGHT && lightType == RECT_LIGHT) {\n light_sample_rect(light, shadingPoint, samplePoint, result);\n return;\n }\n if (HAS_SCENE_SPHERE_LIGHT && lightType == SPHERE_LIGHT) {\n light_sample_sphere(light, shadingPoint, samplePoint, result);\n return;\n }\n if (HAS_SCENE_SPOT_LIGHT && lightType == SPOT_LIGHT) {\n light_sample_spot(light, shadingPoint, samplePoint, result);\n return;\n }\n if (HAS_SCENE_DIRECTIONAL_LIGHT && lightType == DIRECTIONAL_LIGHT) {\n light_sample_directional(light, result);\n }\n}\n\nfn sampleEnvLight(randomV2: vec2f, lightSample: ptr<function, LightSampleRec>) {\n var uv: vec2f;\n // Naga's SPIR-V writer cannot pass a struct-member pointer as a call argument.\n var pdf: f32;\n let direction = sampleEnvmap(randomV2, &uv, &pdf);\n (*lightSample).pdf = pdf;\n (*lightSample).direction = direction;\n (*lightSample).emission = textureLinear(envMap, uv).rgb;\n (*lightSample).dist = INF;\n}\n\nfn loadLightSamplingTexel(texelIndex: i32) -> vec4f {\n let width = rtUniform.lightSamplingTextureWidth;\n return textureLoad(\n lightSamplingData,\n vec2i(texelIndex % width, texelIndex / width),\n 0\n );\n}\n\nfn getEmissiveTriangle(index: i32) -> EmissiveTriangle {\n let offset = index * 6;\n let a = loadLightSamplingTexel(offset);\n let b = loadLightSamplingTexel(offset + 1);\n let c = loadLightSamplingTexel(offset + 2);\n let d = loadLightSamplingTexel(offset + 3);\n let e = loadLightSamplingTexel(offset + 4);\n let f = loadLightSamplingTexel(offset + 5);\n return EmissiveTriangle(\n a.xyz, a.w,\n b.xyz, b.w,\n c.xyz, c.w,\n d.xy, d.zw, e.xy,\n e.zw, f.xy, f.zw\n );\n}\n\nfn getLightChoice(index: i32) -> LightChoice {\n let data = loadLightSamplingTexel(rtUniform.lightChoiceTexelOffset + index);\n return LightChoice(\n data.x,\n bitcast<i32>(data.y),\n bitcast<i32>(data.z),\n bitcast<i32>(data.w)\n );\n}\n\nfn getLightChoiceFromTable(tableOffset: i32, index: i32) -> LightChoice {\n return getLightChoice(tableOffset + index);\n}\n\nfn stratifyLightChoiceRandom(\n rnd: vec3f,\n candidateIndex: u32,\n candidateCount: u32\n) -> vec3f {\n var stratified = rnd;\n let count = max(candidateCount, 1u);\n stratified.z = (rnd.z + f32(min(candidateIndex, count - 1u))) /\n f32(count);\n return stratified;\n}\n\nfn sampleEmissiveTriangleLight(\n triangle: EmissiveTriangle,\n scatterPos: vec3f,\n randomV2: vec2f,\n lightSample: ptr<function, LightSampleRec>\n) {\n let sqrtU = sqrt(randomV2.x);\n let barycentric = vec3f(\n 1.0 - sqrtU,\n sqrtU * (1.0 - randomV2.y),\n sqrtU * randomV2.y\n );\n let lightPosition =\n barycentric.x * triangle.p0 +\n barycentric.y * triangle.p1 +\n barycentric.z * triangle.p2;\n let uv =\n barycentric.x * triangle.uv0 +\n barycentric.y * triangle.uv1 +\n barycentric.z * triangle.uv2;\n let secondaryUv =\n barycentric.x * triangle.secondaryUv0 +\n barycentric.y * triangle.secondaryUv1 +\n barycentric.z * triangle.secondaryUv2;\n let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));\n (*lightSample).direction = lightPosition - scatterPos;\n (*lightSample).dist = length((*lightSample).direction);\n if ((*lightSample).dist <= EPS) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n return;\n }\n (*lightSample).direction /= (*lightSample).dist;\n (*lightSample).normal = normal;\n let cosLight = dot(normal, -(*lightSample).direction);\n if (cosLight <= 0.0) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n return;\n }\n (*lightSample).emission = getMaterialEmission(\n i32(triangle.materialIndex), uv, secondaryUv\n );\n (*lightSample).selectionPmf = triangle.selectionPmf;\n (*lightSample).pdf = triangle.selectionPmf *\n ((*lightSample).dist * (*lightSample).dist) /\n max(triangle.area * cosLight, 1e-8);\n}\n\nfn sampleLightChoiceTable(\n scatterPos: vec3f,\n rnd: vec3f,\n tableOffset: i32,\n choiceCount: i32,\n selectionPmfScale: f32,\n lightSample: ptr<function, LightSampleRec>\n) {\n (*lightSample).emission = vec3f(0.0);\n (*lightSample).pdf = 0.0;\n (*lightSample).selectionPmf = 0.0;\n (*lightSample).dist = INF;\n (*lightSample).isDelta = false;\n (*lightSample).sourceType = 0u;\n (*lightSample).sourceIndex = 0xffffffffu;\n if (choiceCount <= 0) {\n return;\n }\n\n let scaledChoice = rnd.z * f32(choiceCount);\n let column = min(i32(scaledChoice), choiceCount - 1);\n let columnChoice = getLightChoiceFromTable(tableOffset, column);\n let selectedIndex = select(\n columnChoice.aliasIndex,\n column,\n fract(scaledChoice) < columnChoice.probability\n );\n let choice = getLightChoiceFromTable(tableOffset, selectedIndex);\n if (USE_ENVMAP && choice.sourceType == 1) {\n (*lightSample).sourceType = 0u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n sampleEnvLight(rnd.xy, lightSample);\n (*lightSample).selectionPmf = rtUniform.envLightPmf;\n (*lightSample).pdf *= rtUniform.envLightPmf;\n }\n else if (choice.sourceType == 2) {\n (*lightSample).sourceType = 2u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n let light = analyticLights[choice.sourceIndex];\n sampleAnalyticLight(light, scatterPos, rnd.xy, lightSample);\n (*lightSample).selectionPmf = light.selectionPmf;\n (*lightSample).pdf *= light.selectionPmf;\n }\n else if (HAS_SCENE_EMISSIVE_LIGHT && choice.sourceType == 3) {\n (*lightSample).sourceType = 1u;\n (*lightSample).sourceIndex = u32(choice.sourceIndex);\n sampleEmissiveTriangleLight(\n getEmissiveTriangle(choice.sourceIndex),\n scatterPos,\n rnd.xy,\n lightSample\n );\n }\n (*lightSample).selectionPmf *= selectionPmfScale;\n (*lightSample).pdf *= selectionPmfScale;\n}\n\nfn sampleLight(\n scatterPos: vec3f,\n rnd: vec3f,\n lightSample: ptr<function, LightSampleRec>,\n distByIntensity: bool\n) {\n sampleLightChoiceTable(\n scatterPos,\n rnd,\n 0,\n rtUniform.lightChoiceCount,\n 1.0,\n lightSample\n );\n}\n\n// Light choice for one of the resampled NEE candidates. The selection random\n// number is stratified across the candidates.\nfn sampleLightForNEECandidate(\n scatterPos: vec3f,\n rnd: vec3f,\n candidateIndex: u32,\n candidateCount: u32,\n lightSample: ptr<function, LightSampleRec>\n) {\n sampleLightChoiceTable(\n scatterPos,\n stratifyLightChoiceRandom(rnd, candidateIndex, candidateCount),\n 0,\n rtUniform.lightChoiceCount,\n 1.0,\n lightSample\n );\n}\n";
|
|
2
2
|
export default _default;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_CHOICE_ENVIRONMENT } from '../../
|
|
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
|
|
3
|
+
fn eY(light: Light, fI: vec3f, jt: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
4
|
+
let iQ = light.position - fI;
|
|
5
|
+
let ak = length(iQ);
|
|
6
6
|
if (light.radiusOrSpread <= 0.0) {
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
if (
|
|
10
|
+
if (ak <= 1e-6) {
|
|
11
11
|
(*lightSample).direction = vec3f(0.0, 0.0, 1.0);
|
|
12
12
|
(*lightSample).normal = vec3f(0.0, 0.0, -1.0);
|
|
13
13
|
(*lightSample).dist = 0.0;
|
|
@@ -16,66 +16,66 @@ if (aj <= 1e-6) {
|
|
|
16
16
|
(*lightSample).isDelta = true;
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
(*lightSample).direction =
|
|
19
|
+
(*lightSample).direction = iQ / ak;
|
|
20
20
|
(*lightSample).normal = -(*lightSample).direction;
|
|
21
|
-
(*lightSample).dist =
|
|
21
|
+
(*lightSample).dist = ak;
|
|
22
22
|
(*lightSample).pdf = 1.0;
|
|
23
23
|
(*lightSample).emission = light.emission /
|
|
24
|
-
max(
|
|
24
|
+
max(ak * ak, 1e-8);
|
|
25
25
|
(*lightSample).isDelta = true;
|
|
26
26
|
return;
|
|
27
27
|
}
|
|
28
28
|
let radius = max(light.radiusOrSpread, 1e-6);
|
|
29
29
|
(*lightSample).isDelta = false;
|
|
30
|
-
var
|
|
30
|
+
var gX: vec3f;
|
|
31
31
|
|
|
32
|
-
if (
|
|
33
|
-
let z = 1.0 - 2.0 *
|
|
34
|
-
let
|
|
35
|
-
let
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
32
|
+
if (ak <= radius) {
|
|
33
|
+
let z = 1.0 - 2.0 * jt.x;
|
|
34
|
+
let ex = sqrt(max(0.0, 1.0 - z * z));
|
|
35
|
+
let azimuth = TWOPI * jt.y;
|
|
36
|
+
gX = vec3f(
|
|
37
|
+
ex * cos(azimuth),
|
|
38
|
+
ex * sin(azimuth),
|
|
39
39
|
z
|
|
40
40
|
);
|
|
41
41
|
(*lightSample).pdf = INV4PI;
|
|
42
42
|
}
|
|
43
43
|
else {
|
|
44
|
-
let
|
|
45
|
-
let
|
|
44
|
+
let ui = iQ / ak;
|
|
45
|
+
let jV = min(
|
|
46
46
|
1.0,
|
|
47
|
-
radius * radius / (
|
|
47
|
+
radius * radius / (ak * ak)
|
|
48
48
|
);
|
|
49
|
-
let cosThetaMax = sqrt(max(0.0, 1.0 -
|
|
50
|
-
let
|
|
51
|
-
let sinTheta = sqrt(max(0.0, 1.0 -
|
|
52
|
-
let
|
|
49
|
+
let cosThetaMax = sqrt(max(0.0, 1.0 - jV));
|
|
50
|
+
let ci = mix(1.0, cosThetaMax, jt.x);
|
|
51
|
+
let sinTheta = sqrt(max(0.0, 1.0 - ci * ci));
|
|
52
|
+
let azimuth = TWOPI * jt.y;
|
|
53
53
|
var tangent: vec3f;
|
|
54
54
|
var bitangent: vec3f;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
+ tangent * (sinTheta * cos(
|
|
58
|
-
+ bitangent * (sinTheta * sin(
|
|
55
|
+
aP(ui, &tangent, &bitangent);
|
|
56
|
+
gX = ui * ci
|
|
57
|
+
+ tangent * (sinTheta * cos(azimuth))
|
|
58
|
+
+ bitangent * (sinTheta * sin(azimuth));
|
|
59
59
|
(*lightSample).pdf = 1.0 / max(
|
|
60
60
|
TWOPI * (1.0 - cosThetaMax),
|
|
61
61
|
1e-8
|
|
62
62
|
);
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
let
|
|
66
|
-
let
|
|
67
|
-
let
|
|
68
|
-
-
|
|
69
|
-
let
|
|
70
|
-
let
|
|
71
|
-
(*lightSample).dist = select(
|
|
72
|
-
(*lightSample).direction =
|
|
73
|
-
let
|
|
74
|
-
(*lightSample).normal = normalize(
|
|
65
|
+
let iR = dot(gX, iQ);
|
|
66
|
+
let ra = dot(iQ, iQ);
|
|
67
|
+
let br = iR * iR
|
|
68
|
+
- ra + radius * radius;
|
|
69
|
+
let cV = iR - sqrt(max(0.0, br));
|
|
70
|
+
let cM = iR + sqrt(max(0.0, br));
|
|
71
|
+
(*lightSample).dist = select(cM, cV, cV > 1e-6);
|
|
72
|
+
(*lightSample).direction = gX;
|
|
73
|
+
let tl = fI + gX * (*lightSample).dist;
|
|
74
|
+
(*lightSample).normal = normalize(tl - light.position);
|
|
75
75
|
(*lightSample).emission = light.emission;
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
fn
|
|
78
|
+
fn dn(
|
|
79
79
|
light: Light,
|
|
80
80
|
surfacePoint: vec3f,
|
|
81
81
|
lowerLeft: vec3f,
|
|
@@ -86,15 +86,15 @@ return;
|
|
|
86
86
|
}
|
|
87
87
|
let width = length(light.u);
|
|
88
88
|
let height = length(light.v);
|
|
89
|
-
let
|
|
89
|
+
let ek = surfacePoint - lowerLeft;
|
|
90
90
|
let uv = vec2f(
|
|
91
|
-
dot(
|
|
92
|
-
dot(
|
|
91
|
+
dot(ek, light.u / width) / width,
|
|
92
|
+
dot(ek, light.v / height) / height
|
|
93
93
|
);
|
|
94
94
|
(*result).emission *= sampleMap(i32(light.textureIndex), uv).rgb;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
fn
|
|
97
|
+
fn kw(
|
|
98
98
|
light: Light,
|
|
99
99
|
shadingPoint: vec3f,
|
|
100
100
|
samplePoint: vec2f,
|
|
@@ -105,27 +105,27 @@ let lowerLeft = light.position - 0.5 * (light.u + light.v);
|
|
|
105
105
|
let spread = clamp(light.radiusOrSpread, 0.0, 1.0);
|
|
106
106
|
|
|
107
107
|
if (spread <= 0.001) {
|
|
108
|
-
let
|
|
109
|
-
let surfacePoint = shadingPoint - normal *
|
|
110
|
-
let
|
|
108
|
+
let gw = dot(normal, shadingPoint - light.position);
|
|
109
|
+
let surfacePoint = shadingPoint - normal * gw;
|
|
110
|
+
let ek = surfacePoint - lowerLeft;
|
|
111
111
|
let width = length(light.u);
|
|
112
112
|
let height = length(light.v);
|
|
113
113
|
let uv = vec2f(
|
|
114
|
-
dot(
|
|
115
|
-
dot(
|
|
114
|
+
dot(ek, light.u / width) / width,
|
|
115
|
+
dot(ek, light.v / height) / height
|
|
116
116
|
);
|
|
117
|
-
if (
|
|
117
|
+
if (gw <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
|
|
118
118
|
(*result).emission = vec3f(0.0);
|
|
119
119
|
(*result).pdf = 0.0;
|
|
120
120
|
return;
|
|
121
121
|
}
|
|
122
122
|
(*result).direction = -normal;
|
|
123
|
-
(*result).dist =
|
|
123
|
+
(*result).dist = gw;
|
|
124
124
|
(*result).normal = normal;
|
|
125
125
|
(*result).emission = light.emission;
|
|
126
126
|
(*result).pdf = 1.0;
|
|
127
127
|
(*result).isDelta = true;
|
|
128
|
-
|
|
128
|
+
dn(light, surfacePoint, lowerLeft, result);
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
|
|
@@ -133,23 +133,23 @@ let surfacePoint = lowerLeft
|
|
|
133
133
|
+ light.u * samplePoint.x
|
|
134
134
|
+ light.v * samplePoint.y;
|
|
135
135
|
let offset = surfacePoint - shadingPoint;
|
|
136
|
-
let
|
|
137
|
-
(*result).dist = sqrt(
|
|
136
|
+
let hE = dot(offset, offset);
|
|
137
|
+
(*result).dist = sqrt(hE);
|
|
138
138
|
(*result).direction = offset / (*result).dist;
|
|
139
139
|
(*result).normal = normal;
|
|
140
|
-
let
|
|
141
|
-
let
|
|
142
|
-
if (
|
|
140
|
+
let gn = dot(-(*result).direction, normal);
|
|
141
|
+
let pK = cos(0.5 * PI * spread);
|
|
142
|
+
if (gn <= 0.0 || gn < pK) {
|
|
143
143
|
(*result).emission = vec3f(0.0);
|
|
144
144
|
(*result).pdf = 0.0;
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
(*result).emission = light.emission;
|
|
148
|
-
(*result).pdf =
|
|
149
|
-
|
|
148
|
+
(*result).pdf = hE / max(light.area * gn, 1e-8);
|
|
149
|
+
dn(light, surfacePoint, lowerLeft, result);
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
fn
|
|
152
|
+
fn gs(
|
|
153
153
|
light: Light,
|
|
154
154
|
result: ptr<function, LightSampleRec>
|
|
155
155
|
) {
|
|
@@ -161,66 +161,70 @@ result: ptr<function, LightSampleRec>
|
|
|
161
161
|
(*result).isDelta = true;
|
|
162
162
|
}
|
|
163
163
|
|
|
164
|
-
fn
|
|
164
|
+
fn kx(
|
|
165
165
|
light: Light,
|
|
166
166
|
shadingPoint: vec3f,
|
|
167
167
|
samplePoint: vec2f,
|
|
168
168
|
result: ptr<function, LightSampleRec>
|
|
169
169
|
) {
|
|
170
|
-
|
|
170
|
+
eY(light, shadingPoint, samplePoint, result);
|
|
171
171
|
let surfacePoint = shadingPoint + (*result).direction * (*result).dist;
|
|
172
|
-
let
|
|
173
|
-
(*result).emission *=
|
|
172
|
+
let dV = normalize(shadingPoint - surfacePoint);
|
|
173
|
+
(*result).emission *= bP(light, dV);
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
-
fn
|
|
176
|
+
fn jg(
|
|
177
177
|
light: Light,
|
|
178
178
|
shadingPoint: vec3f,
|
|
179
179
|
samplePoint: vec2f,
|
|
180
180
|
result: ptr<function, LightSampleRec>
|
|
181
181
|
) {
|
|
182
|
-
let
|
|
183
|
-
if (
|
|
184
|
-
|
|
182
|
+
let ec = i32(light.litType);
|
|
183
|
+
if (HAS_SCENE_RECT_LIGHT && ec == RECT_LIGHT) {
|
|
184
|
+
kw(light, shadingPoint, samplePoint, result);
|
|
185
185
|
return;
|
|
186
186
|
}
|
|
187
|
-
if (
|
|
188
|
-
|
|
187
|
+
if (HAS_SCENE_SPHERE_LIGHT && ec == SPHERE_LIGHT) {
|
|
188
|
+
eY(light, shadingPoint, samplePoint, result);
|
|
189
189
|
return;
|
|
190
190
|
}
|
|
191
|
-
if (
|
|
192
|
-
|
|
191
|
+
if (HAS_SCENE_SPOT_LIGHT && ec == SPOT_LIGHT) {
|
|
192
|
+
kx(light, shadingPoint, samplePoint, result);
|
|
193
193
|
return;
|
|
194
194
|
}
|
|
195
|
-
if (
|
|
196
|
-
|
|
195
|
+
if (HAS_SCENE_DIRECTIONAL_LIGHT && ec == DIRECTIONAL_LIGHT) {
|
|
196
|
+
gs(light, result);
|
|
197
197
|
}
|
|
198
198
|
}
|
|
199
199
|
|
|
200
|
-
fn
|
|
200
|
+
fn nD(jt: vec2f, lightSample: ptr<function, LightSampleRec>) {
|
|
201
201
|
var uv: vec2f;
|
|
202
|
-
|
|
202
|
+
|
|
203
|
+
var pdf: f32;
|
|
204
|
+
let direction = pI(jt, &uv, &pdf);
|
|
205
|
+
(*lightSample).pdf = pdf;
|
|
206
|
+
(*lightSample).direction = direction;
|
|
203
207
|
(*lightSample).emission = textureLinear(envMap, uv).rgb;
|
|
204
208
|
(*lightSample).dist = INF;
|
|
205
209
|
}
|
|
206
210
|
|
|
207
|
-
fn
|
|
211
|
+
fn ca(iK: i32) -> vec4f {
|
|
208
212
|
let width = rtUniform.lightSamplingTextureWidth;
|
|
209
213
|
return textureLoad(
|
|
210
214
|
lightSamplingData,
|
|
211
|
-
vec2i(
|
|
215
|
+
vec2i(iK % width, iK / width),
|
|
212
216
|
0
|
|
213
217
|
);
|
|
214
218
|
}
|
|
215
219
|
|
|
216
|
-
fn
|
|
220
|
+
fn rb(index: i32) -> EmissiveTriangle {
|
|
217
221
|
let offset = index * 6;
|
|
218
|
-
let a =
|
|
219
|
-
let b =
|
|
220
|
-
let c =
|
|
221
|
-
let d =
|
|
222
|
-
let e =
|
|
223
|
-
let f =
|
|
222
|
+
let a = ca(offset);
|
|
223
|
+
let b = ca(offset + 1);
|
|
224
|
+
let c = ca(offset + 2);
|
|
225
|
+
let d = ca(offset + 3);
|
|
226
|
+
let e = ca(offset + 4);
|
|
227
|
+
let f = ca(offset + 5);
|
|
224
228
|
return EmissiveTriangle(
|
|
225
229
|
a.xyz, a.w,
|
|
226
230
|
b.xyz, b.w,
|
|
@@ -230,9 +234,9 @@ e.zw, f.xy, f.zw
|
|
|
230
234
|
);
|
|
231
235
|
}
|
|
232
236
|
|
|
233
|
-
fn
|
|
234
|
-
let data =
|
|
235
|
-
return
|
|
237
|
+
fn tI(index: i32) -> qb {
|
|
238
|
+
let data = ca(rtUniform.lightChoiceTexelOffset + index);
|
|
239
|
+
return qb(
|
|
236
240
|
data.x,
|
|
237
241
|
bitcast<i32>(data.y),
|
|
238
242
|
bitcast<i32>(data.z),
|
|
@@ -240,35 +244,35 @@ bitcast<i32>(data.w)
|
|
|
240
244
|
);
|
|
241
245
|
}
|
|
242
246
|
|
|
243
|
-
fn
|
|
244
|
-
return
|
|
247
|
+
fn ka(nZ: i32, index: i32) -> qb {
|
|
248
|
+
return tI(nZ + index);
|
|
245
249
|
}
|
|
246
250
|
|
|
247
|
-
fn
|
|
251
|
+
fn nR(
|
|
248
252
|
rnd: vec3f,
|
|
249
|
-
|
|
250
|
-
|
|
253
|
+
mS: u32,
|
|
254
|
+
candidateCount: u32
|
|
251
255
|
) -> vec3f {
|
|
252
|
-
var
|
|
253
|
-
let count = max(
|
|
254
|
-
|
|
256
|
+
var uk = rnd;
|
|
257
|
+
let count = max(candidateCount, 1u);
|
|
258
|
+
uk.z = (rnd.z + f32(min(mS, count - 1u))) /
|
|
255
259
|
f32(count);
|
|
256
|
-
return
|
|
260
|
+
return uk;
|
|
257
261
|
}
|
|
258
262
|
|
|
259
|
-
fn
|
|
263
|
+
fn mH(
|
|
260
264
|
triangle: EmissiveTriangle,
|
|
261
|
-
|
|
262
|
-
|
|
265
|
+
fI: vec3f,
|
|
266
|
+
jt: vec2f,
|
|
263
267
|
lightSample: ptr<function, LightSampleRec>
|
|
264
268
|
) {
|
|
265
|
-
let
|
|
269
|
+
let xh = sqrt(jt.x);
|
|
266
270
|
let barycentric = vec3f(
|
|
267
|
-
1.0 -
|
|
268
|
-
|
|
269
|
-
|
|
271
|
+
1.0 - xh,
|
|
272
|
+
xh * (1.0 - jt.y),
|
|
273
|
+
xh * jt.y
|
|
270
274
|
);
|
|
271
|
-
let
|
|
275
|
+
let uq =
|
|
272
276
|
barycentric.x * triangle.p0 +
|
|
273
277
|
barycentric.y * triangle.p1 +
|
|
274
278
|
barycentric.z * triangle.p2;
|
|
@@ -276,12 +280,12 @@ let uv =
|
|
|
276
280
|
barycentric.x * triangle.uv0 +
|
|
277
281
|
barycentric.y * triangle.uv1 +
|
|
278
282
|
barycentric.z * triangle.uv2;
|
|
279
|
-
let
|
|
283
|
+
let dj =
|
|
280
284
|
barycentric.x * triangle.secondaryUv0 +
|
|
281
285
|
barycentric.y * triangle.secondaryUv1 +
|
|
282
286
|
barycentric.z * triangle.secondaryUv2;
|
|
283
287
|
let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));
|
|
284
|
-
(*lightSample).direction =
|
|
288
|
+
(*lightSample).direction = uq - fI;
|
|
285
289
|
(*lightSample).dist = length((*lightSample).direction);
|
|
286
290
|
if ((*lightSample).dist <= EPS) {
|
|
287
291
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -290,27 +294,27 @@ return;
|
|
|
290
294
|
}
|
|
291
295
|
(*lightSample).direction /= (*lightSample).dist;
|
|
292
296
|
(*lightSample).normal = normal;
|
|
293
|
-
let
|
|
294
|
-
if (
|
|
297
|
+
let qi = dot(normal, -(*lightSample).direction);
|
|
298
|
+
if (qi <= 0.0) {
|
|
295
299
|
(*lightSample).emission = vec3f(0.0);
|
|
296
300
|
(*lightSample).pdf = 0.0;
|
|
297
301
|
return;
|
|
298
302
|
}
|
|
299
|
-
(*lightSample).emission =
|
|
300
|
-
i32(triangle.materialIndex), uv,
|
|
303
|
+
(*lightSample).emission = getMaterialEmission(
|
|
304
|
+
i32(triangle.materialIndex), uv, dj
|
|
301
305
|
);
|
|
302
306
|
(*lightSample).selectionPmf = triangle.selectionPmf;
|
|
303
307
|
(*lightSample).pdf = triangle.selectionPmf *
|
|
304
308
|
((*lightSample).dist * (*lightSample).dist) /
|
|
305
|
-
max(triangle.area *
|
|
309
|
+
max(triangle.area * qi, 1e-8);
|
|
306
310
|
}
|
|
307
311
|
|
|
308
|
-
fn
|
|
309
|
-
|
|
312
|
+
fn hv(
|
|
313
|
+
fI: vec3f,
|
|
310
314
|
rnd: vec3f,
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
315
|
+
nZ: i32,
|
|
316
|
+
choiceCount: i32,
|
|
317
|
+
nX: f32,
|
|
314
318
|
lightSample: ptr<function, LightSampleRec>
|
|
315
319
|
) {
|
|
316
320
|
(*lightSample).emission = vec3f(0.0);
|
|
@@ -320,56 +324,56 @@ lightSample: ptr<function, LightSampleRec>
|
|
|
320
324
|
(*lightSample).isDelta = false;
|
|
321
325
|
(*lightSample).sourceType = 0u;
|
|
322
326
|
(*lightSample).sourceIndex = 0xffffffffu;
|
|
323
|
-
if (
|
|
327
|
+
if (choiceCount <= 0) {
|
|
324
328
|
return;
|
|
325
329
|
}
|
|
326
330
|
|
|
327
|
-
let
|
|
328
|
-
let column = min(i32(
|
|
329
|
-
let
|
|
330
|
-
let
|
|
331
|
-
|
|
331
|
+
let sq = rnd.z * f32(choiceCount);
|
|
332
|
+
let column = min(i32(sq), choiceCount - 1);
|
|
333
|
+
let rW = ka(nZ, column);
|
|
334
|
+
let lM = select(
|
|
335
|
+
rW.aliasIndex,
|
|
332
336
|
column,
|
|
333
|
-
fract(
|
|
337
|
+
fract(sq) < rW.probability
|
|
334
338
|
);
|
|
335
|
-
let
|
|
336
|
-
if (
|
|
339
|
+
let qh = ka(nZ, lM);
|
|
340
|
+
if (USE_ENVMAP && qh.sourceType == ${LIGHT_CHOICE_ENVIRONMENT}) {
|
|
337
341
|
(*lightSample).sourceType = 0u;
|
|
338
|
-
(*lightSample).sourceIndex = u32(
|
|
339
|
-
|
|
342
|
+
(*lightSample).sourceIndex = u32(qh.sourceIndex);
|
|
343
|
+
nD(rnd.xy, lightSample);
|
|
340
344
|
(*lightSample).selectionPmf = rtUniform.envLightPmf;
|
|
341
345
|
(*lightSample).pdf *= rtUniform.envLightPmf;
|
|
342
346
|
}
|
|
343
|
-
else if (
|
|
347
|
+
else if (qh.sourceType == ${LIGHT_CHOICE_ANALYTIC}) {
|
|
344
348
|
(*lightSample).sourceType = 2u;
|
|
345
|
-
(*lightSample).sourceIndex = u32(
|
|
346
|
-
let light = analyticLights[
|
|
347
|
-
|
|
349
|
+
(*lightSample).sourceIndex = u32(qh.sourceIndex);
|
|
350
|
+
let light = analyticLights[qh.sourceIndex];
|
|
351
|
+
jg(light, fI, rnd.xy, lightSample);
|
|
348
352
|
(*lightSample).selectionPmf = light.selectionPmf;
|
|
349
353
|
(*lightSample).pdf *= light.selectionPmf;
|
|
350
354
|
}
|
|
351
|
-
else if (
|
|
355
|
+
else if (HAS_SCENE_EMISSIVE_LIGHT && qh.sourceType == ${LIGHT_CHOICE_EMISSIVE_TRIANGLE}) {
|
|
352
356
|
(*lightSample).sourceType = 1u;
|
|
353
|
-
(*lightSample).sourceIndex = u32(
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
+
(*lightSample).sourceIndex = u32(qh.sourceIndex);
|
|
358
|
+
mH(
|
|
359
|
+
rb(qh.sourceIndex),
|
|
360
|
+
fI,
|
|
357
361
|
rnd.xy,
|
|
358
362
|
lightSample
|
|
359
363
|
);
|
|
360
364
|
}
|
|
361
|
-
(*lightSample).selectionPmf *=
|
|
362
|
-
(*lightSample).pdf *=
|
|
365
|
+
(*lightSample).selectionPmf *= nX;
|
|
366
|
+
(*lightSample).pdf *= nX;
|
|
363
367
|
}
|
|
364
368
|
|
|
365
369
|
fn sampleLight(
|
|
366
|
-
|
|
370
|
+
fI: vec3f,
|
|
367
371
|
rnd: vec3f,
|
|
368
372
|
lightSample: ptr<function, LightSampleRec>,
|
|
369
|
-
|
|
373
|
+
tk: bool
|
|
370
374
|
) {
|
|
371
|
-
|
|
372
|
-
|
|
375
|
+
hv(
|
|
376
|
+
fI,
|
|
373
377
|
rnd,
|
|
374
378
|
0,
|
|
375
379
|
rtUniform.lightChoiceCount,
|
|
@@ -380,16 +384,16 @@ lightSample
|
|
|
380
384
|
|
|
381
385
|
|
|
382
386
|
|
|
383
|
-
fn
|
|
384
|
-
|
|
387
|
+
fn nE(
|
|
388
|
+
fI: vec3f,
|
|
385
389
|
rnd: vec3f,
|
|
386
|
-
|
|
387
|
-
|
|
390
|
+
mS: u32,
|
|
391
|
+
candidateCount: u32,
|
|
388
392
|
lightSample: ptr<function, LightSampleRec>
|
|
389
393
|
) {
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
394
|
+
hv(
|
|
395
|
+
fI,
|
|
396
|
+
nR(rnd, mS, candidateCount),
|
|
393
397
|
0,
|
|
394
398
|
rtUniform.lightChoiceCount,
|
|
395
399
|
1.0,
|