@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
|
@@ -50,28 +50,28 @@ padding2: u32,
|
|
|
50
50
|
@group(0)@binding(1)var<storage,read_write>grid:array<Bucket>;
|
|
51
51
|
@group(0)@binding(2)var<uniform>parameters:Parameters;
|
|
52
52
|
@group(0)@binding(4)var headers:texture_storage_2d<r32uint,write>;
|
|
53
|
-
fn
|
|
54
|
-
let p=bitcast<vec3u>(
|
|
53
|
+
fn zv(sF:vec3i)->u32 {
|
|
54
|
+
let p=bitcast<vec3u>(sF);
|
|
55
55
|
return ((p.x*73856093u)^(p.y*19349663u)^(p.z*83492791u))&(parameters.buckets-1u);
|
|
56
56
|
}
|
|
57
|
-
fn
|
|
57
|
+
fn vq(p:vec3f,layer:u32)->u32 {
|
|
58
58
|
let radius=select(parameters.radius,parameters.fineRadius,layer==1u);
|
|
59
|
-
let
|
|
60
|
-
return
|
|
59
|
+
let mo=select(radius,2.0*radius,layer==1u);
|
|
60
|
+
return zv(vec3i(floor(p/mo)));
|
|
61
61
|
}
|
|
62
|
-
fn
|
|
62
|
+
fn pl(layer:u32)->u32 {
|
|
63
63
|
return layer*(parameters.buckets+parameters.buckets/256u);
|
|
64
64
|
}
|
|
65
|
-
fn
|
|
65
|
+
fn fE(i:u32,value:u32) {
|
|
66
66
|
let width=textureDimensions(headers).x;
|
|
67
67
|
textureStore(headers,vec2i(vec2u(i%width,i/width)),vec4u(value));
|
|
68
68
|
}
|
|
69
|
-
fn
|
|
69
|
+
fn qs(i:u32)->vec4u {
|
|
70
70
|
let width=textureDimensions(photons).x;
|
|
71
71
|
return textureLoad(photons,vec2i(vec2u(i%width,i/width)),0);
|
|
72
72
|
}
|
|
73
|
-
fn
|
|
74
|
-
return bitcast<vec3f>(
|
|
73
|
+
fn rI(i:u32)->vec3f {
|
|
74
|
+
return bitcast<vec3f>(qs(i).xyz);
|
|
75
75
|
}
|
|
76
76
|
@compute @workgroup_size(64)
|
|
77
77
|
fn count(@builtin(global_invocation_id)id:vec3u) {
|
|
@@ -79,16 +79,16 @@ if(id.x+id.y*4194240u>=parameters.count) {
|
|
|
79
79
|
return;
|
|
80
80
|
}
|
|
81
81
|
let index=id.x+id.y*4194240u;
|
|
82
|
-
if(
|
|
82
|
+
if(qs(index).w==0u) {
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
for(var layer=0u;layer<2u;layer++) {
|
|
86
|
-
atomicAdd(&grid[
|
|
86
|
+
atomicAdd(&grid[pl(layer)+vq(rI(index),layer)].count,1u);
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
90
|
var<workgroup> scan:array<u32,256>;
|
|
91
|
-
fn
|
|
91
|
+
fn jA(local:u32,value:u32)->u32 {
|
|
92
92
|
scan[local]=value;
|
|
93
93
|
workgroupBarrier();
|
|
94
94
|
for(var stride=1u;stride<256u;stride*=2u) {
|
|
@@ -104,80 +104,80 @@ return scan[local];
|
|
|
104
104
|
}
|
|
105
105
|
@compute @workgroup_size(256)
|
|
106
106
|
fn scanBlocks(@builtin(local_invocation_index)local:u32,@builtin(workgroup_id)group:vec3u) {
|
|
107
|
-
let index=
|
|
107
|
+
let index=pl(group.y)+group.x*256u+local;
|
|
108
108
|
let count=atomicLoad(&grid[index].count);
|
|
109
|
-
let prefix=
|
|
109
|
+
let prefix=jA(local,count);
|
|
110
110
|
grid[index].offset=prefix-count;
|
|
111
111
|
if(local==255u) {
|
|
112
|
-
atomicStore(&grid[
|
|
112
|
+
atomicStore(&grid[pl(group.y)+parameters.buckets+group.x].count,prefix);
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
@compute @workgroup_size(256)
|
|
116
116
|
fn scanSums(@builtin(local_invocation_index)local:u32,@builtin(workgroup_id)group:vec3u) {
|
|
117
117
|
let blocks=parameters.buckets/256u;
|
|
118
|
-
let
|
|
119
|
-
let first=local*
|
|
120
|
-
let start=
|
|
118
|
+
let chunk=(blocks+255u)/256u;
|
|
119
|
+
let first=local*chunk;
|
|
120
|
+
let start=pl(group.y)+parameters.buckets;
|
|
121
121
|
var count=0u;
|
|
122
|
-
for(var i=first;i<min(first+
|
|
122
|
+
for(var i=first;i<min(first+chunk,blocks);i++) {
|
|
123
123
|
count+=atomicLoad(&grid[start+i].count);
|
|
124
124
|
}
|
|
125
|
-
let prefix=
|
|
125
|
+
let prefix=jA(local,count);
|
|
126
126
|
var offset=prefix-count;
|
|
127
|
-
for(var i=first;i<min(first+
|
|
127
|
+
for(var i=first;i<min(first+chunk,blocks);i++) {
|
|
128
128
|
grid[start+i].offset=offset;
|
|
129
129
|
offset+=atomicLoad(&grid[start+i].count);
|
|
130
130
|
}
|
|
131
131
|
if(local==255u&&group.y==0u) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
132
|
+
fE(0u,bitcast<u32>(parameters.radius));
|
|
133
|
+
fE(1u,prefix);
|
|
134
|
+
fE(2u,bitcast<u32>(parameters.screenPixels));
|
|
135
|
+
fE(3u,bitcast<u32>(parameters.skipQuery));
|
|
136
|
+
fE(4u,parameters.count);
|
|
137
|
+
fE(5u,parameters.buckets);
|
|
138
|
+
fE(6u,bitcast<u32>(parameters.fineRadius));
|
|
139
|
+
fE(7u,parameters.experiments);
|
|
140
140
|
}
|
|
141
141
|
}
|
|
142
142
|
@compute @workgroup_size(64)
|
|
143
143
|
fn scatter(@builtin(global_invocation_id)id:vec3u) {
|
|
144
|
-
let
|
|
144
|
+
let eJ=id.x+id.y*4194240u;
|
|
145
145
|
for(var layer=0u;layer<2u;layer++) {
|
|
146
|
-
let start=
|
|
147
|
-
if(
|
|
148
|
-
let offset=grid[start+
|
|
149
|
-
|
|
150
|
-
|
|
146
|
+
let start=pl(layer);
|
|
147
|
+
if(eJ<parameters.buckets) {
|
|
148
|
+
let offset=grid[start+eJ].offset+grid[start+parameters.buckets+eJ/256u].offset;
|
|
149
|
+
fE(8u+layer*parameters.buckets*2u+eJ*2u,offset);
|
|
150
|
+
fE(9u+layer*parameters.buckets*2u+eJ*2u,atomicLoad(&grid[start+eJ].count));
|
|
151
151
|
}
|
|
152
|
-
if(
|
|
153
|
-
let
|
|
154
|
-
let index=grid[start+
|
|
155
|
-
|
|
152
|
+
if(eJ<parameters.count&&qs(eJ).w!=0u) {
|
|
153
|
+
let tU=vq(rI(eJ),layer);
|
|
154
|
+
let index=grid[start+tU].offset+grid[start+parameters.buckets+tU/256u].offset+atomicAdd(&grid[start+tU].cursor,1u);
|
|
155
|
+
fE(8u+parameters.buckets*4u+layer*parameters.count+index,eJ);
|
|
156
156
|
}
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
`;
|
|
160
160
|
/** Packed photon payload: position f32 x3, RGBE8 flux, two octahedral directions. */
|
|
161
161
|
export const photonPackingWgsl = /* wgsl */ `
|
|
162
|
-
fn
|
|
162
|
+
fn sv(v:vec2f)->vec2f {
|
|
163
163
|
return select(vec2f(-1.0),vec2f(1.0),v>=vec2f(0.0));
|
|
164
164
|
}
|
|
165
|
-
fn
|
|
165
|
+
fn qR(n:vec3f)->vec2f {
|
|
166
166
|
let p=n/(abs(n.x)+abs(n.y)+abs(n.z));
|
|
167
|
-
let uv=select(p.xy,(vec2f(1.0)-abs(p.yx))*
|
|
167
|
+
let uv=select(p.xy,(vec2f(1.0)-abs(p.yx))*sv(p.xy),p.z<0.0);
|
|
168
168
|
return uv*.5+.5;
|
|
169
169
|
}
|
|
170
|
-
fn
|
|
170
|
+
fn qQ(uv:vec2f)->vec3f {
|
|
171
171
|
let p=uv*2.0-1.0;
|
|
172
172
|
var n=vec3f(p,1.0-abs(p.x)-abs(p.y));
|
|
173
173
|
if(n.z<0.0) {
|
|
174
|
-
n=vec3f((vec2f(1.0)-abs(n.yx))*
|
|
174
|
+
n=vec3f((vec2f(1.0)-abs(n.yx))*sv(n.xy),n.z);
|
|
175
175
|
}
|
|
176
176
|
return normalize(n);
|
|
177
177
|
}
|
|
178
178
|
|
|
179
179
|
|
|
180
|
-
fn
|
|
180
|
+
fn us(value:vec3f)->u32 {
|
|
181
181
|
let peak=max(max(value.x,value.y),value.z);
|
|
182
182
|
if(!(peak>0.0)) {
|
|
183
183
|
return 0u;
|
|
@@ -204,8 +204,8 @@ fn photonIndexWord(i:u32)->u32 {
|
|
|
204
204
|
let width=textureDimensions(photonMapGrid).x;
|
|
205
205
|
return textureLoad(photonMapGrid,vec2i(vec2u(i%width,i/width)),0).x;
|
|
206
206
|
}
|
|
207
|
-
fn
|
|
208
|
-
let p=bitcast<vec3u>(
|
|
207
|
+
fn ym(sF:vec3i)->u32 {
|
|
208
|
+
let p=bitcast<vec3u>(sF);
|
|
209
209
|
return ((p.x*73856093u)^(p.y*19349663u)^(p.z*83492791u))&(photonIndexWord(5u)-1u);
|
|
210
210
|
}
|
|
211
211
|
|
|
@@ -220,77 +220,77 @@ let offset=b.xyz/b.w;
|
|
|
220
220
|
let eye=cameraUniform.viewInv[3].xyz;
|
|
221
221
|
let forward=normalize(cameraUniform.viewInv[2].xyz);
|
|
222
222
|
let depth=abs(dot(si.position-eye,forward));
|
|
223
|
-
let
|
|
223
|
+
let zg=max(abs(dot(origin-eye,forward)),1e-8);
|
|
224
224
|
let perspective=abs(inverse[2].w)>1e-8;
|
|
225
|
-
let footprint=length(offset-origin)*select(1.0,depth/
|
|
225
|
+
let footprint=length(offset-origin)*select(1.0,depth/zg,perspective);
|
|
226
226
|
let cosine=abs(dot(si.faceNormal,normalize(si.position-eye)));
|
|
227
227
|
return max(1e-8,footprint/sqrt(max(.0625,cosine)));
|
|
228
228
|
}
|
|
229
|
-
fn
|
|
229
|
+
fn sY(si:SurfaceInteraction,prepared:OpenPbrPreparedBsdf,wP:bool,visible:bool)->vec3f {
|
|
230
230
|
if(samplingBounce>CAUSTIC_PHOTON_MAX_DEPTH||isCausticSpecular(prepared.material)||prepared.material.materialType==SHADOW_CATCHER) {
|
|
231
231
|
return vec3f(0.0);
|
|
232
232
|
}
|
|
233
|
-
if(CAUSTIC_LIGHT_TRACING&&
|
|
233
|
+
if(CAUSTIC_LIGHT_TRACING&&wP) {
|
|
234
234
|
return vec3f(0.0);
|
|
235
235
|
}
|
|
236
|
-
let
|
|
236
|
+
let ni=bitcast<f32>(photonIndexWord(0u));
|
|
237
237
|
let screenPixels=bitcast<f32>(photonIndexWord(2u));
|
|
238
|
-
if(!(
|
|
238
|
+
if(!(ni>0.0)||bitcast<f32>(photonIndexWord(3u))==1.0||(bitcast<f32>(photonIndexWord(3u))==2.0&&visible)) {
|
|
239
239
|
return vec3f(0.0);
|
|
240
240
|
}
|
|
241
|
-
var radius=
|
|
241
|
+
var radius=ni;
|
|
242
242
|
let experiments=photonIndexWord(7u);
|
|
243
|
-
let
|
|
244
|
-
let
|
|
245
|
-
if(
|
|
246
|
-
radius=min(radius,photonPixelFootprint(si)*
|
|
243
|
+
let xW=f32(experiments>>8u);
|
|
244
|
+
let uI=select(xW,screenPixels,visible);
|
|
245
|
+
if(uI>0.0) {
|
|
246
|
+
radius=min(radius,photonPixelFootprint(si)*uI);
|
|
247
247
|
}
|
|
248
248
|
let layer=select(0u,1u,visible&&screenPixels>0.0);
|
|
249
|
-
let
|
|
250
|
-
let
|
|
251
|
-
let
|
|
249
|
+
let mo=select(ni,2.0*bitcast<f32>(photonIndexWord(6u)),layer==1u);
|
|
250
|
+
let uf=vec3i(floor((si.position-vec3f(radius))/mo));
|
|
251
|
+
let vB=vec3i(floor((si.position+vec3f(radius))/mo));
|
|
252
252
|
let buckets=photonIndexWord(5u);
|
|
253
|
-
let
|
|
253
|
+
let uE=8u+layer*buckets*2u;
|
|
254
254
|
let indexStart=8u+buckets*4u+layer*photonIndexWord(4u);
|
|
255
255
|
let emitted=f32(photonIndexWord(4u));
|
|
256
256
|
var sum=vec3f(0.0);
|
|
257
|
-
for(var z=
|
|
258
|
-
for(var y=
|
|
259
|
-
for(var x=
|
|
260
|
-
let
|
|
257
|
+
for(var z=uf.z;z<=vB.z;z++) {
|
|
258
|
+
for(var y=uf.y;y<=vB.y;y++) {
|
|
259
|
+
for(var x=uf.x;x<=vB.x;x++) {
|
|
260
|
+
let uw=vec3i(x,y,z);
|
|
261
261
|
|
|
262
262
|
|
|
263
|
-
let
|
|
264
|
-
let padding=max(vec3f(
|
|
265
|
-
let
|
|
266
|
-
if(distance(
|
|
267
|
-
let
|
|
268
|
-
let offset=photonIndexWord(
|
|
269
|
-
let count=photonIndexWord(
|
|
263
|
+
let wy=vec3f(uw)*mo;
|
|
264
|
+
let padding=max(vec3f(mo*1e-5),abs(wy)*1e-6);
|
|
265
|
+
let pQ=clamp(si.position,wy-padding,wy+vec3f(mo)+padding);
|
|
266
|
+
if(distance(pQ,si.position)>=radius) { continue; }
|
|
267
|
+
let tU=ym(uw);
|
|
268
|
+
let offset=photonIndexWord(uE+tU*2u);
|
|
269
|
+
let count=photonIndexWord(uE+1u+tU*2u);
|
|
270
270
|
for(var i=offset;i<offset+count;i++) {
|
|
271
271
|
let index=photonIndexWord(indexStart+i);
|
|
272
272
|
let record=photonLoad(index);
|
|
273
273
|
let position=bitcast<vec3f>(record.xyz);
|
|
274
274
|
|
|
275
|
-
if(any(vec3i(floor(position/
|
|
275
|
+
if(any(vec3i(floor(position/mo))!=uw)||distance(position,si.position)>=radius) {
|
|
276
276
|
continue;
|
|
277
277
|
}
|
|
278
|
-
var
|
|
278
|
+
var kE=radius;
|
|
279
279
|
if((experiments&1u)!=0u) {
|
|
280
280
|
let scale=bitcast<f32>(photonIndexWord(8u+buckets*4u+u32(emitted)*3u+index));
|
|
281
|
-
|
|
282
|
-
if(!(
|
|
281
|
+
kE=min(radius,ni*scale);
|
|
282
|
+
if(!(kE>0.0)||distance(position,si.position)>=kE) { continue; }
|
|
283
283
|
}
|
|
284
284
|
let directions=photonIndexWord(8u+buckets*4u+u32(emitted)*2u+index);
|
|
285
|
-
let normal=
|
|
285
|
+
let normal=qQ(vec2f(f32(directions&255u)/255.0,f32((directions>>8u)&127u)/127.0));
|
|
286
286
|
if(dot(normal,si.faceNormal)<0.9) {
|
|
287
287
|
continue;
|
|
288
288
|
}
|
|
289
289
|
if(CAUSTIC_MNEE&&samplingBounce<=CAUSTIC_MNEE_MAX_DEPTH&&(directions&32768u)!=0u&&prepared.material.baseWeight*(1.0-prepared.material.baseMetalness)*(1.0-prepared.material.transmissionWeight)>0.0&&prepared.material.subsurfaceWeight==0.0) {
|
|
290
290
|
continue;
|
|
291
291
|
}
|
|
292
|
-
let
|
|
293
|
-
let cosine=abs(dot(si.faceNormal,
|
|
292
|
+
let iA=qQ(vec2f(f32((directions>>16u)&255u),f32(directions>>24u))/255.0);
|
|
293
|
+
let cosine=abs(dot(si.faceNormal,iA));
|
|
294
294
|
if(cosine<=0.0) {
|
|
295
295
|
continue;
|
|
296
296
|
}
|
|
@@ -299,8 +299,8 @@ if(SPECTRAL) {
|
|
|
299
299
|
flux=sampling_spectral_rgb_filter(flux,si.spectralChannel);
|
|
300
300
|
}
|
|
301
301
|
var pdf:f32;
|
|
302
|
-
let response=openpbr_eval_prepared(prepared,
|
|
303
|
-
sum+=response*flux/cosine*(radius*radius)/(
|
|
302
|
+
let response=openpbr_eval_prepared(prepared,iA,&pdf);
|
|
303
|
+
sum+=response*flux/cosine*(radius*radius)/(kE*kE);
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
306
|
}
|
|
@@ -317,15 +317,15 @@ export function photonDirectQuerySource(enabled = false) {
|
|
|
317
317
|
if (!enabled)
|
|
318
318
|
return photonQueryWgsl;
|
|
319
319
|
return photonQueryWgsl
|
|
320
|
-
.replace('var sum=vec3f(0.0);', `let
|
|
321
|
-
let
|
|
322
|
-
let
|
|
323
|
-
let
|
|
320
|
+
.replace('var sum=vec3f(0.0);', `let tb=ak(aC,rtUniform.sequenceSeed^0x91e10da5u);
|
|
321
|
+
let xO=vec2u(cD(tb^0x68bc21ebu),cD(tb^0x967a889bu));
|
|
322
|
+
let uL=aJ+xO;
|
|
323
|
+
let xN=(uL.x&1u)|((uL.y&1u)<<1u);
|
|
324
324
|
var sum=vec3f(0.0);`)
|
|
325
|
-
.replace('let record=photonLoad(index);', `if(
|
|
325
|
+
.replace('let record=photonLoad(index);', `if(wP&&(ak(index,tb^0x02e5be93u)&3u)!=xN) { continue; }
|
|
326
326
|
let record=photonLoad(index);`)
|
|
327
327
|
.replace('var flux=photonDecodeFlux(record.w)/emitted;', `var flux=photonDecodeFlux(record.w)/emitted;
|
|
328
|
-
if(
|
|
328
|
+
if(wP) { flux*=4.0; }`);
|
|
329
329
|
}
|
|
330
330
|
/** Evidence-only per-query counters; no extra bindings or public render options. */
|
|
331
331
|
export function photonQuerySource(debugGroup = -1, directSubset = false) {
|
|
@@ -22,18 +22,18 @@ const T_SIZE = vec2u(256, 64);
|
|
|
22
22
|
const MS_ALTITUDES = 32u;
|
|
23
23
|
const SV_SIZE = vec2u(96, 192);
|
|
24
24
|
|
|
25
|
-
fn
|
|
26
|
-
fn
|
|
27
|
-
fn
|
|
28
|
-
fn
|
|
29
|
-
fn
|
|
25
|
+
fn bk(r: f32, mu: f32, radius: f32) -> f32 { return (radius - r) * (radius + r) + r * r * mu * mu; }
|
|
26
|
+
fn nW(r: f32, mu: f32) -> bool { return mu < 0.0 && bk(r, mu, R_GROUND) >= 0.0; }
|
|
27
|
+
fn lM(r: f32, mu: f32) -> f32 { return max(-r * mu - sqrt(max(bk(r, mu, R_GROUND), 0.0)), 0.0); }
|
|
28
|
+
fn jx(r: f32, mu: f32) -> f32 { return max(-r * mu + sqrt(max(bk(r, mu, R_TOP), 0.0)), 0.0); }
|
|
29
|
+
fn pj(r: f32) -> vec3f {
|
|
30
30
|
let h = max(r - R_GROUND, 0.0);
|
|
31
31
|
return vec3f(exp(-h / 8.0), exp(-h / 1.2) * ${TURBIDITY}, max(0.0, 1.0 - abs(h - 25.0) / 15.0));
|
|
32
32
|
}
|
|
33
33
|
fn extinction(d: vec3f) -> vec3f { return RAYLEIGH * d.x + MIE_EXTINCTION * d.y + OZONE * d.z; }
|
|
34
|
-
fn
|
|
35
|
-
fn
|
|
36
|
-
fn
|
|
34
|
+
fn nE(x: f32) -> f32 { return x * x * (R_TOP - R_GROUND); }
|
|
35
|
+
fn hT(h: f32) -> f32 { return sqrt(clamp(h / (R_TOP - R_GROUND), 0.0, 1.0)); }
|
|
36
|
+
fn fd(table: texture_2d<f32>, p: vec2f) -> vec3f {
|
|
37
37
|
let size = vec2i(textureDimensions(table));
|
|
38
38
|
let q = clamp(p, vec2f(0.0), vec2f(size - 1));
|
|
39
39
|
let i = min(vec2i(floor(q)), max(size - 2, vec2i(0)));
|
|
@@ -45,25 +45,25 @@ let c = textureLoad(table, vec2i(i.x, j.y), 0).rgb;
|
|
|
45
45
|
let d = textureLoad(table, j, 0).rgb;
|
|
46
46
|
return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
|
|
47
47
|
}
|
|
48
|
-
fn
|
|
49
|
-
return
|
|
48
|
+
fn fK(r: f32, mu: f32) -> vec3f {
|
|
49
|
+
return fd(transmittanceTable, vec2f((clamp(mu, -1.0, 1.0) + 1.0) * 0.5 * f32(T_SIZE.x - 1u), hT(r - R_GROUND) * f32(T_SIZE.y - 1u)));
|
|
50
50
|
}
|
|
51
|
-
fn
|
|
51
|
+
fn nK(nu: f32) -> f32 {
|
|
52
52
|
let g2 = MIE_G * MIE_G;
|
|
53
53
|
return 3.0 / (8.0 * PI) * ((1.0 - g2) * (1.0 + nu * nu)) / ((2.0 + g2) * pow(1.0 + g2 - 2.0 * MIE_G * nu, 1.5));
|
|
54
54
|
}
|
|
55
|
-
struct
|
|
56
|
-
fn
|
|
55
|
+
struct Ai { radiance: vec3f, throughput: vec3f }
|
|
56
|
+
fn xu(origin: vec3f, dir: vec3f, steps: u32, full: bool, wl: vec3f) -> Ai {
|
|
57
57
|
let r = length(origin);
|
|
58
58
|
let mu = dot(origin, dir) / r;
|
|
59
|
-
let ground =
|
|
60
|
-
var len =
|
|
61
|
-
if (ground) { len =
|
|
59
|
+
let ground = nW(r, mu);
|
|
60
|
+
var len = jx(r, mu);
|
|
61
|
+
if (ground) { len = lM(r, mu); }
|
|
62
62
|
let nu = dot(dir, params.sun.xyz);
|
|
63
|
-
var
|
|
64
|
-
var
|
|
65
|
-
if (full) {
|
|
66
|
-
var result =
|
|
63
|
+
var jF = 1.0 / (4.0 * PI);
|
|
64
|
+
var tH = jF;
|
|
65
|
+
if (full) { jF = 3.0 / (16.0 * PI) * (1.0 + nu * nu); tH = nK(nu); }
|
|
66
|
+
var result = Ai(vec3f(0.0), vec3f(0.0));
|
|
67
67
|
var view = vec3f(1.0);
|
|
68
68
|
var previous = 0.0;
|
|
69
69
|
for (var i = 0u; i < steps; i++) {
|
|
@@ -73,34 +73,34 @@ let dt = next - previous;
|
|
|
73
73
|
let p = origin + dir * (0.5 * (previous + next));
|
|
74
74
|
previous = next;
|
|
75
75
|
let pr = length(p);
|
|
76
|
-
let d =
|
|
76
|
+
let d = pj(pr);
|
|
77
77
|
let e = extinction(d);
|
|
78
|
-
let
|
|
79
|
-
let
|
|
80
|
-
let
|
|
78
|
+
let wZ = fK(pr, dot(p, params.sun.xyz) / pr);
|
|
79
|
+
let om = RAYLEIGH * d.x;
|
|
80
|
+
let ol = MIE_SCATTERING * d.y;
|
|
81
81
|
var ms = vec3f(0.0);
|
|
82
|
-
if (full) { ms =
|
|
83
|
-
let source =
|
|
82
|
+
if (full) { ms = fd(multipleTable, vec2f(hT(pr - R_GROUND) * f32(MS_ALTITUDES - 1u), 0.0)); }
|
|
83
|
+
let source = wZ * (om * jF + ol * tH) + (om + ol) * ms;
|
|
84
84
|
let segment = exp(-e * dt);
|
|
85
85
|
let weight = (1.0 - segment) / max(e, vec3f(1e-9));
|
|
86
86
|
result.radiance += view * source * weight;
|
|
87
|
-
result.throughput += view * (
|
|
87
|
+
result.throughput += view * (om + ol) * weight;
|
|
88
88
|
view *= segment;
|
|
89
89
|
}
|
|
90
90
|
if (ground) {
|
|
91
91
|
let p = origin + dir * len;
|
|
92
92
|
let pr = length(p);
|
|
93
|
-
let
|
|
94
|
-
let irradiance =
|
|
93
|
+
let vd = dot(p, params.sun.xyz) / pr;
|
|
94
|
+
let irradiance = fK(pr, vd) * max(vd, 0.0) + wl;
|
|
95
95
|
result.radiance += view * ALBEDO / PI * irradiance;
|
|
96
96
|
}
|
|
97
97
|
return result;
|
|
98
98
|
}
|
|
99
|
-
fn
|
|
99
|
+
fn rl(row: f32) -> f32 {
|
|
100
100
|
let x = row / f32(SV_SIZE.y - 1u) * 2.0 - 1.0;
|
|
101
101
|
return sign(x) * x * x * (PI / 2.0);
|
|
102
102
|
}
|
|
103
|
-
fn
|
|
103
|
+
fn ir(e: f32) -> f32 {
|
|
104
104
|
let x = sign(e) * sqrt(abs(e) / (PI / 2.0));
|
|
105
105
|
return clamp((x + 1.0) * 0.5, 0.0, 1.0) * f32(SV_SIZE.y - 1u);
|
|
106
106
|
}
|
|
@@ -108,40 +108,40 @@ return clamp((x + 1.0) * 0.5, 0.0, 1.0) * f32(SV_SIZE.y - 1u);
|
|
|
108
108
|
fn transmittance(@builtin(global_invocation_id) id: vec3u) {
|
|
109
109
|
if (any(id.xy >= T_SIZE)) { return; }
|
|
110
110
|
let mu = f32(id.x) / f32(T_SIZE.x - 1u) * 2.0 - 1.0;
|
|
111
|
-
let r = R_GROUND +
|
|
112
|
-
if (
|
|
113
|
-
let len =
|
|
111
|
+
let r = R_GROUND + nE(f32(id.y) / f32(T_SIZE.y - 1u));
|
|
112
|
+
if (nW(r, mu)) { textureStore(output, vec2i(id.xy), vec4f(0.0, 0.0, 0.0, 1.0)); return; }
|
|
113
|
+
let len = jx(r, mu);
|
|
114
114
|
var depth = vec3f(0.0);
|
|
115
115
|
for (var i = 0u; i < 48u; i++) {
|
|
116
116
|
let t = (f32(i) + 0.5) / 48.0 * len;
|
|
117
|
-
depth += extinction(
|
|
117
|
+
depth += extinction(pj(sqrt(t * t + 2.0 * r * mu * t + r * r))) * (len / 48.0);
|
|
118
118
|
}
|
|
119
119
|
textureStore(output, vec2i(id.xy), vec4f(exp(-depth), 1.0));
|
|
120
120
|
}
|
|
121
121
|
@compute @workgroup_size(8, 8)
|
|
122
122
|
fn multiple(@builtin(global_invocation_id) id: vec3u) {
|
|
123
123
|
if (id.x >= MS_ALTITUDES || id.y > 0u) { return; }
|
|
124
|
-
let r = R_GROUND +
|
|
124
|
+
let r = R_GROUND + nE(f32(id.x) / f32(MS_ALTITUDES - 1u));
|
|
125
125
|
var second = vec3f(0.0);
|
|
126
|
-
var
|
|
126
|
+
var rQ = vec3f(0.0);
|
|
127
127
|
for (var i = 0u; i < 64u; i++) {
|
|
128
128
|
let mu = 1.0 - 2.0 * (f32(i) + 0.5) / 64.0;
|
|
129
129
|
let phi = f32(i) * PI * (3.0 - sqrt(5.0));
|
|
130
130
|
let s = sqrt(1.0 - mu * mu);
|
|
131
|
-
let result =
|
|
131
|
+
let result = xu(vec3f(0.0, r, 0.0), vec3f(s * cos(phi), mu, s * sin(phi)), 20u, false, vec3f(0.0));
|
|
132
132
|
second += result.radiance / 64.0;
|
|
133
|
-
|
|
133
|
+
rQ += result.throughput / 64.0;
|
|
134
134
|
}
|
|
135
|
-
textureStore(output, vec2i(id.xy), vec4f(second / (1.0 -
|
|
135
|
+
textureStore(output, vec2i(id.xy), vec4f(second / (1.0 - rQ), 1.0));
|
|
136
136
|
}
|
|
137
137
|
@compute @workgroup_size(8, 8)
|
|
138
138
|
fn skyView(@builtin(global_invocation_id) id: vec3u) {
|
|
139
139
|
if (any(id.xy >= SV_SIZE)) { return; }
|
|
140
|
-
let e =
|
|
140
|
+
let e = rl(f32(id.y));
|
|
141
141
|
let phi = f32(id.x) / f32(SV_SIZE.x - 1u) * PI;
|
|
142
142
|
var sky = vec3f(0.0);
|
|
143
143
|
if (params.size.w > 0.0) { sky = textureLoad(irradianceTable, vec2i(0), 0).rgb; }
|
|
144
|
-
let result =
|
|
144
|
+
let result = xu(vec3f(0.0, R_GROUND + CAMERA_ALTITUDE, 0.0), vec3f(cos(e) * cos(phi), sin(e), cos(e) * sin(phi)), 40u, true, sky);
|
|
145
145
|
textureStore(output, vec2i(id.xy), vec4f(result.radiance, 1.0));
|
|
146
146
|
}
|
|
147
147
|
@compute @workgroup_size(8, 8)
|
|
@@ -153,44 +153,44 @@ let e = (f32(i) + 0.5) / 128.0 * (PI / 2.0);
|
|
|
153
153
|
let weight = 2.0 * sin(e) * cos(e) * (PI / 2.0 / 128.0) * (PI / 48.0);
|
|
154
154
|
for (var j = 0u; j < 48u; j++) {
|
|
155
155
|
let phi = (f32(j) + 0.5) / 48.0 * PI;
|
|
156
|
-
sky +=
|
|
156
|
+
sky += fd(skyTable, vec2f(phi / PI * f32(SV_SIZE.x - 1u), ir(e))) * weight;
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
if (id.x == 0u) { textureStore(output, vec2i(id.xy), vec4f(sky, 1.0)); return; }
|
|
160
|
-
let
|
|
161
|
-
let
|
|
162
|
-
let horizontal = dot(sky,
|
|
160
|
+
let wZ = fK(R_GROUND + CAMERA_ALTITUDE, params.sun.y);
|
|
161
|
+
let lQ = vec3f(0.2126, 0.7152, 0.0722);
|
|
162
|
+
let horizontal = dot(sky, lQ) + dot(wZ, lQ) * max(params.sun.y, 0.0);
|
|
163
163
|
let scale = ${ILLUMINANCE} / sqrt(max(horizontal, ${REFERENCE_ILLUMINANCE} * 1e-3) * ${REFERENCE_ILLUMINANCE});
|
|
164
|
-
textureStore(output, vec2i(id.xy), vec4f(
|
|
164
|
+
textureStore(output, vec2i(id.xy), vec4f(wZ, scale));
|
|
165
165
|
}
|
|
166
|
-
fn
|
|
167
|
-
let theta =
|
|
168
|
-
let phi =
|
|
166
|
+
fn hs(texel: vec2f) -> vec3f {
|
|
167
|
+
let theta = texel.y / params.size.y * PI;
|
|
168
|
+
let phi = texel.x / params.size.x * 2.0 * PI;
|
|
169
169
|
return vec3f(-sin(theta) * cos(phi), cos(theta), -sin(theta) * sin(phi));
|
|
170
170
|
}
|
|
171
171
|
@compute @workgroup_size(8, 8)
|
|
172
172
|
fn map(@builtin(global_invocation_id) id: vec3u) {
|
|
173
173
|
if (any(id.xy >= vec2u(params.size.xy))) { return; }
|
|
174
|
-
let
|
|
175
|
-
let dir =
|
|
176
|
-
let
|
|
177
|
-
let
|
|
178
|
-
let
|
|
174
|
+
let texel = vec2f(id.xy) + 0.5;
|
|
175
|
+
let dir = hs(texel);
|
|
176
|
+
let uJ = abs(atan2(dir.z, dir.x) - params.sun.w);
|
|
177
|
+
let yP = uJ - floor(uJ / (2.0 * PI)) * (2.0 * PI);
|
|
178
|
+
let ea = min(yP, 2.0 * PI - yP);
|
|
179
179
|
let e = asin(clamp(dir.y, -1.0, 1.0));
|
|
180
|
-
var radiance =
|
|
180
|
+
var radiance = fd(skyTable, vec2f(ea / PI * f32(SV_SIZE.x - 1u), ir(e)));
|
|
181
181
|
let sun = textureLoad(irradianceTable, vec2i(1, 0), 0);
|
|
182
182
|
let radius = params.sunWorld.w;
|
|
183
|
-
let
|
|
184
|
-
if (acos(clamp(dot(dir, params.sunWorld.xyz), -1.0, 1.0)) < radius + 3.0 *
|
|
183
|
+
let tc = PI / params.size.y;
|
|
184
|
+
if (acos(clamp(dot(dir, params.sunWorld.xyz), -1.0, 1.0)) < radius + 3.0 * tc / max(sqrt(1.0 - dir.y * dir.y), 0.05)) {
|
|
185
185
|
var coverage = 0.0;
|
|
186
186
|
for (var y = 0u; y < 6u; y++) { for (var x = 0u; x < 6u; x++) {
|
|
187
|
-
let d =
|
|
187
|
+
let d = hs(texel - 0.5 + (vec2f(f32(x), f32(y)) + 0.5) / 6.0);
|
|
188
188
|
let angle = 2.0 * asin(min(length(d - params.sunWorld.xyz) * 0.5, 1.0));
|
|
189
189
|
let t = angle / radius;
|
|
190
190
|
if (t < 1.0) { coverage += 1.0 - 0.6 * (1.0 - sqrt(1.0 - t * t)); }
|
|
191
191
|
} }
|
|
192
|
-
let
|
|
193
|
-
radiance += coverage / 36.0 / (
|
|
192
|
+
let ta = 2.0 * PI * (1.0 - cos(radius));
|
|
193
|
+
radiance += coverage / 36.0 / (ta * (1.0 - 0.6 / 3.0)) * sun.rgb;
|
|
194
194
|
}
|
|
195
195
|
textureStore(output, vec2i(id.xy), vec4f(radiance * sun.a * params.scale.xyz + params.ambient.xyz, 1.0));
|
|
196
196
|
}
|
|
@@ -9,7 +9,21 @@ export interface RayTraceInputHooks {
|
|
|
9
9
|
uniformJitter: boolean;
|
|
10
10
|
}
|
|
11
11
|
export interface RayTraceShaderOptions {
|
|
12
|
+
/** Internal host budget. Default 20 preserves the native AOT contract. */
|
|
13
|
+
maxPathEvents?: number;
|
|
14
|
+
/** Web TLAS leaf boxes. Default false retains the native layout. */
|
|
15
|
+
perInstanceBounds?: boolean;
|
|
16
|
+
/** Full RGB reservoir targets for browser spectral paths. Default false. */
|
|
17
|
+
channelIndependentRis?: boolean;
|
|
18
|
+
/** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */
|
|
19
|
+
shareSpectralPrefix?: boolean;
|
|
20
|
+
independentTextures?: boolean;
|
|
21
|
+
/** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */
|
|
22
|
+
displayAovStorage?: boolean;
|
|
12
23
|
hasDisplacement: boolean;
|
|
24
|
+
/** Browser camera extension; false preserves the native uniform layout. */
|
|
25
|
+
cameraProjectionInverse?: boolean;
|
|
26
|
+
compactVertices?: boolean;
|
|
13
27
|
debugGroup?: number;
|
|
14
28
|
/** Invocation block edge; the native host matches dispatch to this value. Default 8. */
|
|
15
29
|
workgroupSize?: number;
|