@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
|
@@ -5,9 +5,8 @@ import { read } from '../math/access.js';
|
|
|
5
5
|
export const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
|
|
6
6
|
const FIXED_LIGHT_COUNT = 64;
|
|
7
7
|
const PIXELS_PER_LIGHT = 6;
|
|
8
|
-
|
|
8
|
+
function makeRayTraceUniformCore(RayTraceUniformValues) {
|
|
9
9
|
// Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html
|
|
10
|
-
const RayTraceUniformValues = new ArrayBuffer(320);
|
|
11
10
|
const RayTraceUniformViews = {
|
|
12
11
|
outputSize: new Float32Array(RayTraceUniformValues, 0, 2),
|
|
13
12
|
sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),
|
|
@@ -58,6 +57,7 @@ export function makeRayTraceUniform() {
|
|
|
58
57
|
views: RayTraceUniformViews
|
|
59
58
|
};
|
|
60
59
|
}
|
|
60
|
+
export function makeRayTraceUniform() { return makeRayTraceUniformCore(new ArrayBuffer(320)); }
|
|
61
61
|
export function packWgpuAnalyticLights(lights, texturesIndices, selectionPmfs, iesProfileTexelOffset) {
|
|
62
62
|
validateSceneLights(lights);
|
|
63
63
|
const numLights = lights.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nexport function makeRayTraceUniform() {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformValues = new ArrayBuffer(320);\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nfunction makeRayTraceUniformCore(RayTraceUniformValues: ArrayBuffer) {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function makeRayTraceUniform() { return makeRayTraceUniformCore(new ArrayBuffer(320)); }\n\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
|
|
@@ -1,6 +1,21 @@
|
|
|
1
1
|
import { type RayTraceInputHooks } from './wgsl/rayTrace.compute.js';
|
|
2
2
|
export interface WGPUShaderFeatures {
|
|
3
|
+
/** Native wgpu binding arrays. Default false. */
|
|
4
|
+
independentTextures?: boolean;
|
|
5
|
+
/** Internal host budget. Default 20 preserves native shader generation. */
|
|
6
|
+
maxPathEvents?: number;
|
|
7
|
+
/** Web TLAS leaf boxes. Default false retains the native layout. */
|
|
8
|
+
perInstanceBounds?: boolean;
|
|
9
|
+
/** Full RGB reservoir targets for browser spectral paths. Default false. */
|
|
10
|
+
channelIndependentRis?: boolean;
|
|
11
|
+
/** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */
|
|
12
|
+
shareSpectralPrefix?: boolean;
|
|
13
|
+
/** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */
|
|
14
|
+
displayAovStorage?: boolean;
|
|
3
15
|
hasDisplacement: boolean;
|
|
16
|
+
/** Browser camera extension; false preserves the native uniform layout. */
|
|
17
|
+
cameraProjectionInverse?: boolean;
|
|
18
|
+
compactVertices?: boolean;
|
|
4
19
|
debugGroup?: number;
|
|
5
20
|
/** Invocation block edge; the native host matches dispatch to this value. Default 8. */
|
|
6
21
|
workgroupSize?: number;
|
|
@@ -22,7 +22,7 @@ export function wgpuShaderPreamble(constants, bake = false) {
|
|
|
22
22
|
}
|
|
23
23
|
export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
|
|
24
24
|
constants = researchTransport()?.constants(constants, features) ?? constants;
|
|
25
|
-
return wgpuShaderPreamble(constants, bake) + rayTraceCompute({
|
|
25
|
+
return (features.independentTextures ? 'enable wgpu_binding_array;\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({
|
|
26
26
|
...features,
|
|
27
27
|
spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
|
|
28
28
|
sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,iBAAiB,EAAC,MAAM,wBAAwB,CAAC;AACzD,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"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","sourcesContent":["import {researchTransport} from './researchTransport.js';\nimport rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n /** Native wgpu binding arrays. Default false. */\n independentTextures?: boolean;\n /** Internal host budget. Default 20 preserves native shader generation. */\n maxPathEvents?: number;\n /** Web TLAS leaf boxes. Default false retains the native layout. */\n perInstanceBounds?: boolean;\n /** Full RGB reservoir targets for browser spectral paths. Default false. */\n channelIndependentRis?: boolean;\n /** Reuse browser RGB paths until the first wavelength-dependent IOR. Default false. */\n shareSpectralPrefix?: boolean;\n /** WebGPU display AOV storage specialization. Default false preserves the native/default shader. */\n displayAovStorage?: boolean;\n hasDisplacement: boolean;\n /** Browser camera extension; false preserves the native uniform layout. */\n cameraProjectionInverse?: boolean;\n compactVertices?: boolean;\n debugGroup?: number;\n /** Invocation block edge; the native host matches dispatch to this value. Default 8. */\n workgroupSize?:number;\n lightTracing?: boolean;\n photonMapping?:boolean;\n photonMaxDepth?:number;\n photonDirectSubset?:boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n constants = researchTransport()?.constants(constants, features) ?? constants;\n return (features.independentTextures ? 'enable wgpu_binding_array;\\n' : '') + wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const aovCompactStorage = "\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n";
|
|
2
|
+
export declare function compactAovReadShader(code: string, declaration: string, type: string): string;
|
|
3
|
+
/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
|
|
4
|
+
export declare function compactAovResolveCode(code: string): string;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Display-resolution reflectance/depth uses 24 B/px: float depth/hit count
|
|
2
|
+
// and two half-packed vec4 reflectances. The default layout stays 64 B/px.
|
|
3
|
+
export const aovCompactStorage = /* wgsl */ `
|
|
4
|
+
override AOV_COMPACT: bool = false;
|
|
5
|
+
fn rY(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}
|
|
6
|
+
fn yD(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}
|
|
7
|
+
`;
|
|
8
|
+
export function compactAovReadShader(code, declaration, type) {
|
|
9
|
+
return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;
|
|
10
|
+
fn yI(source: u32) -> ${type} {
|
|
11
|
+
if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),
|
|
12
|
+
vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),rY(vec2u(accumulation[o+2u],accumulation[o+3u])),rY(vec2u(accumulation[o+4u],accumulation[o+5u])));}
|
|
13
|
+
let o=source*16u;
|
|
14
|
+
return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),
|
|
15
|
+
bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),
|
|
16
|
+
bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),
|
|
17
|
+
bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));
|
|
18
|
+
}`).split(`let pixel=accumulation[source];`).join(`let pixel=yI(source);`).replace(`let pixel = accumulation[index];`, `let pixel = yI(index);`);
|
|
19
|
+
}
|
|
20
|
+
/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */
|
|
21
|
+
export function compactAovResolveCode(code) {
|
|
22
|
+
return code.includes(`struct DisplayAovAccum`)
|
|
23
|
+
? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)
|
|
24
|
+
: compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=aovCompact.wgsl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aovCompact.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovCompact.wgsl.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,UAAU,CAAC;;;;CAI3C,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,IAAY,EAAE,WAAmB,EAAE,IAAY;IAClF,OAAO,iBAAiB,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;wBAC1B,IAAI;yCACU,IAAI;;;SAGpC,IAAI;;;;EAIb,CAAC,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC,IAAI,CAAC,uBAA4B,CAAC,CAAC,OAAO,CAAC,kCAAkC,EAAE,wBAA6B,CAAC,CAAC;AAC3J,CAAC;AAED,uHAAuH;AACvH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAC5C,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,gFAAgF,EAAE,iBAAiB,CAAC;QACjI,CAAC,CAAC,oBAAoB,CAAC,IAAI,EAAE,uFAAuF,EAAE,yBAAyB,CAAC,CAAC;AACrJ,CAAC","sourcesContent":["// Display-resolution reflectance/depth uses 24 B/px: float depth/hit count\n// and two half-packed vec4 reflectances. The default layout stays 64 B/px.\nexport const aovCompactStorage = /* wgsl */ `\noverride AOV_COMPACT: bool = false;\nfn aovUnpack(value: vec2u) -> vec4f {return vec4f(unpack2x16float(value.x),unpack2x16float(value.y));}\nfn aovPack(value: vec4f) -> vec2u {return vec2u(pack2x16float(value.xy),pack2x16float(value.zw));}\n`;\n\nexport function compactAovReadShader(code: string, declaration: string, type: string): string {\n return aovCompactStorage + code.replace(declaration, `@group(0) @binding(0) var<storage,read> accumulation: array<u32>;\nfn loadAov(source: u32) -> ${type} {\n if(AOV_COMPACT){let o=source*6u;return ${type}(vec4f(bitcast<f32>(accumulation[o]),0,0,0),\n vec4f(0,0,0,bitcast<f32>(accumulation[o+1u])),aovUnpack(vec2u(accumulation[o+2u],accumulation[o+3u])),aovUnpack(vec2u(accumulation[o+4u],accumulation[o+5u])));}\n let o=source*16u;\n return ${type}(bitcast<vec4f>(vec4u(accumulation[o],accumulation[o+1u],accumulation[o+2u],accumulation[o+3u])),\n bitcast<vec4f>(vec4u(accumulation[o+4u],accumulation[o+5u],accumulation[o+6u],accumulation[o+7u])),\n bitcast<vec4f>(vec4u(accumulation[o+8u],accumulation[o+9u],accumulation[o+10u],accumulation[o+11u])),\n bitcast<vec4f>(vec4u(accumulation[o+12u],accumulation[o+13u],accumulation[o+14u],accumulation[o+15u])));\n}`).split(`let pixel=accumulation[source];`).join(`let pixel=loadAov(source);`).replace(`let pixel = accumulation[index];`, `let pixel = loadAov(index);`);\n}\n\n/** Reads compact or default accumulation in an AOV resolve or display shader, selected by the AOV_COMPACT override. */\nexport function compactAovResolveCode(code: string): string {\n return code.includes(`struct DisplayAovAccum`)\n ? compactAovReadShader(code, `@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;`, `DisplayAovAccum`)\n : compactAovReadShader(code, `@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;`, `AovResolvedAccumulation`);\n}\n"]}
|
|
@@ -9,17 +9,17 @@ struct DisplayAovParams { sizeKind: vec4u, mapping: vec4f, flags: vec4u, }
|
|
|
9
9
|
@group(0) @binding(2) var image: texture_storage_2d<${format}, write>;
|
|
10
10
|
@group(0) @binding(3) var<uniform> params: DisplayAovParams;
|
|
11
11
|
|
|
12
|
-
fn
|
|
12
|
+
fn vj(input: u32) -> u32 {
|
|
13
13
|
var v = input;
|
|
14
14
|
v = (v ^ (v >> 16u)) * 0x7feb352du;
|
|
15
15
|
v = (v ^ (v >> 15u)) * 0x846ca68bu;
|
|
16
16
|
return v ^ (v >> 16u);
|
|
17
17
|
}
|
|
18
|
-
fn
|
|
18
|
+
fn vk(rgb: vec3f) -> vec3f {
|
|
19
19
|
return select(1.055 * pow(max(rgb, vec3f(0.0)), vec3f(1.0 / 2.4)) - 0.055,
|
|
20
20
|
12.92 * rgb, rgb <= vec3f(0.0031308));
|
|
21
21
|
}
|
|
22
|
-
fn
|
|
22
|
+
fn tZ(rgb: vec3f) -> vec3f {
|
|
23
23
|
return select(pow((rgb + 0.055) / 1.055, vec3f(2.4)), rgb / 12.92,
|
|
24
24
|
rgb <= vec3f(0.04045));
|
|
25
25
|
}
|
|
@@ -45,24 +45,24 @@ color = clamp(pixel.geometry.yzw * inv, vec3f(0.0), vec3f(1.0));
|
|
|
45
45
|
} else if (kind == 3u || kind == 4u) {
|
|
46
46
|
let r = select(pixel.diffuse, pixel.specular, kind == 4u);
|
|
47
47
|
alpha = r.w / f32(max(params.sizeKind.z, 1u));
|
|
48
|
-
color =
|
|
48
|
+
color = vk(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));
|
|
49
49
|
} else if (kind == 5u) {
|
|
50
50
|
let identity = center[index].identity;
|
|
51
51
|
alpha = select(1.0, 0.0, identity.x == 0xffffffffu);
|
|
52
|
-
let hash =
|
|
52
|
+
let hash = vj(identity[params.flags.x]);
|
|
53
53
|
color = 0.2 + 0.8 * vec3f(f32(hash & 255u), f32((hash >> 8u) & 255u),
|
|
54
54
|
f32((hash >> 16u) & 255u)) / 255.0;
|
|
55
55
|
} else {
|
|
56
56
|
let m = center[index].motion;
|
|
57
57
|
alpha = select(0.0, 1.0, m.w == 3.0);
|
|
58
|
-
let
|
|
58
|
+
let gT = length(m.xy);
|
|
59
59
|
var hue = 0.0;
|
|
60
|
-
if (
|
|
60
|
+
if (gT > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }
|
|
61
61
|
let p = abs(fract(vec3f(hue) + vec3f(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);
|
|
62
|
-
color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(
|
|
62
|
+
color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(gT / params.mapping.w, 0.0, 1.0);
|
|
63
63
|
}
|
|
64
64
|
if (alpha <= 0.0) { color = vec3f(0.0); }
|
|
65
|
-
if (params.flags.y != 0u) { color =
|
|
65
|
+
if (params.flags.y != 0u) { color = tZ(color); }
|
|
66
66
|
textureStore(image, vec2i(id.xy), vec4f(color, clamp(alpha, 0.0, 1.0)));
|
|
67
67
|
}
|
|
68
68
|
`;
|
|
@@ -4,63 +4,63 @@ import proposals from './aovReflectanceSamples.wgsl.js';
|
|
|
4
4
|
// evaluate diffuse and reflection together without traversing the full layered
|
|
5
5
|
// BSDF twice. Callers reject coat, fuzz, anisotropy, SSS and thin film first.
|
|
6
6
|
export default proposals + /* wgsl */ `
|
|
7
|
-
struct
|
|
7
|
+
struct oP {
|
|
8
8
|
diffuse: vec3f,
|
|
9
9
|
specular: vec3f,
|
|
10
10
|
}
|
|
11
|
-
fn
|
|
12
|
-
var result =
|
|
11
|
+
fn hO(prepared: OpenPbrPreparedBsdf, rV: bool, lp: bool) -> oP {
|
|
12
|
+
var result = oP();
|
|
13
13
|
let view = prepared.viewLocal;
|
|
14
14
|
if (view.z <= 1e-6) { return result; }
|
|
15
15
|
let material = prepared.material;
|
|
16
16
|
let alpha = vec2f(material.alphaX, material.alphaY);
|
|
17
|
-
let
|
|
18
|
-
let
|
|
19
|
-
let
|
|
17
|
+
let mG = aD(view, alpha);
|
|
18
|
+
let jw = prepared.weights[OPENPBR_LOBE_DIFFUSE];
|
|
19
|
+
let fZ = prepared.weights[OPENPBR_LOBE_METAL];
|
|
20
20
|
let specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];
|
|
21
|
-
var
|
|
22
|
-
if (
|
|
23
|
-
|
|
21
|
+
var dY = 1.0;
|
|
22
|
+
if (lp && prepared.dielectricMsProbability > 0.0) {
|
|
23
|
+
dY = max(aZ(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
|
|
24
24
|
}
|
|
25
|
-
let
|
|
26
|
-
let
|
|
27
|
-
let
|
|
25
|
+
let cf = normalize(vec3f(alpha, 1.0) * view);
|
|
26
|
+
let rU = min(cf.z, 1.0);
|
|
27
|
+
let ku = 1.0 + rU;
|
|
28
28
|
let count = 256u * min(rtUniform.loopUnrollGuard, 4u) / 4u;
|
|
29
29
|
for (var i = 0u; i < count; i++) {
|
|
30
|
-
let
|
|
31
|
-
let u = vec2f((f32(
|
|
32
|
-
fract(f32(reverseBits(
|
|
33
|
-
let proposal =
|
|
30
|
+
let pair = i / 2u;
|
|
31
|
+
let u = vec2f((f32(pair) + 0.5) / f32(count / 2u),
|
|
32
|
+
fract(f32(reverseBits(pair)) * 2.3283064365386963e-10 + 0.37));
|
|
33
|
+
let proposal = ht[pair];
|
|
34
34
|
|
|
35
35
|
|
|
36
|
-
let
|
|
36
|
+
let hP = prepared.specularAlpha < 0.001 || count != 256u;
|
|
37
37
|
var light = vec3f(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));
|
|
38
|
-
if (
|
|
38
|
+
if (hP) { light = aM(u); }
|
|
39
39
|
if ((i & 1u) != 0u) {
|
|
40
|
-
let
|
|
41
|
-
let
|
|
42
|
-
var half = normalize(vec3f(alpha, 1.0) * vec3f(
|
|
43
|
-
if (
|
|
40
|
+
let kM = (1.0 - u.y) * ku;
|
|
41
|
+
let dw = sqrt(max(0.0, (kM + (1.0 - rU)) * (u.y * ku)));
|
|
42
|
+
var half = normalize(vec3f(alpha, 1.0) * vec3f(cf.xy + dw * proposal.zw, kM));
|
|
43
|
+
if (hP) { half = aA(view, alpha, u); }
|
|
44
44
|
light = reflect(-view, half);
|
|
45
45
|
}
|
|
46
46
|
|
|
47
47
|
if (light.z <= 0.0) { continue; }
|
|
48
48
|
let half = normalize(view + light);
|
|
49
|
-
let specularPdf =
|
|
49
|
+
let specularPdf = mG * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);
|
|
50
50
|
let pdf = 0.5 * (light.z * INVPI + specularPdf);
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
let au = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
|
|
54
54
|
if (au.z <= 0.0) { continue; }
|
|
55
55
|
let scale = abs(au.z) / (pdf * f32(count));
|
|
56
|
-
if (
|
|
56
|
+
if (rV && jw > 0.0) {
|
|
57
57
|
let compensation = prepared.diffuseSpecularEnergyCompensation * ar(
|
|
58
58
|
prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(au.z));
|
|
59
59
|
var unusedPdf = 0.0;
|
|
60
|
-
result.diffuse +=
|
|
60
|
+
result.diffuse += jw * bB(material, prepared.diffuseColor,
|
|
61
61
|
view, au, compensation, &unusedPdf) * scale;
|
|
62
62
|
}
|
|
63
|
-
if (
|
|
63
|
+
if (lp) {
|
|
64
64
|
let evaluatedHalf = normalize(view + au);
|
|
65
65
|
let viewHalf = abs(dot(view, evaluatedHalf));
|
|
66
66
|
var fresnel = vec3f(0.0);
|
|
@@ -69,30 +69,30 @@ var dielectric = vec3f(ae(viewHalf, material.relativeIor));
|
|
|
69
69
|
if (material.thinWalled) { dielectric = aq(dielectric, material.transmissionWeight); }
|
|
70
70
|
fresnel += specularWeight * material.specularColor * dielectric;
|
|
71
71
|
}
|
|
72
|
-
if (
|
|
73
|
-
fresnel +=
|
|
72
|
+
if (fZ > 0.0) {
|
|
73
|
+
fresnel += fZ * material.specularWeight * openpbr_metal_fresnel(viewHalf,
|
|
74
74
|
material.baseWeight * material.baseColor, material.specularColor);
|
|
75
75
|
}
|
|
76
|
-
let
|
|
76
|
+
let sT = sampling_ggx_ndf(evaluatedHalf, alpha) * mG
|
|
77
77
|
* aD(au, alpha) / (4.0 * max(au.z * view.z, 1e-8));
|
|
78
|
-
var reflection = fresnel *
|
|
79
|
-
if (
|
|
80
|
-
let
|
|
81
|
-
reflection +=
|
|
78
|
+
var reflection = fresnel * sT;
|
|
79
|
+
if (fZ > 0.0 && prepared.metalMsFactor > 0.0) {
|
|
80
|
+
let cA = min(prepared.metalMsFactor * aR(prepared.specularAlpha, au.z), 1.0 / max(au.z, 1e-8));
|
|
81
|
+
reflection += fZ * prepared.metalMsScale * cA * INVPI;
|
|
82
82
|
}
|
|
83
83
|
if (prepared.dielectricMsProbability > 0.0) {
|
|
84
|
-
let
|
|
85
|
-
prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) /
|
|
86
|
-
let
|
|
87
|
-
reflection += prepared.dielectricMsReflectionScale *
|
|
84
|
+
let pX = prepared.dielectricMsViewLoss * aV(
|
|
85
|
+
prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(au.z)) / dY;
|
|
86
|
+
let cA = min(pX * prepared.dielectricMsReflectionRatio, 1.0 / abs(au.z));
|
|
87
|
+
reflection += prepared.dielectricMsReflectionScale * cA * INVPI;
|
|
88
88
|
}
|
|
89
89
|
result.specular += reflection * scale;
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
return result;
|
|
93
93
|
}
|
|
94
|
-
fn
|
|
95
|
-
return
|
|
94
|
+
fn yk(prepared: OpenPbrPreparedBsdf) -> oP {
|
|
95
|
+
return hO(prepared, true, true);
|
|
96
96
|
}
|
|
97
97
|
`;
|
|
98
98
|
//# sourceMappingURL=aovReflectance.wgsl.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// Generated by scripts/generate-aov-reflectance-samples.mjs; do not edit.
|
|
2
2
|
// xy: concentric cosine disk; zw: spherical-cap azimuth cosine/sine.
|
|
3
3
|
export default /* wgsl */ `
|
|
4
|
-
const
|
|
4
|
+
const ht: array<vec4f, 128> = array<vec4f, 128>(
|
|
5
5
|
vec4f(-0.971247852, -0.202764958, 0.999698818, 0.0245412290),
|
|
6
6
|
vec4f(-0.808660269, 0.547487736, 0.997290432, 0.0735645667),
|
|
7
7
|
vec4f(-0.942509234, 0.187289074, 0.992479563, 0.122410677),
|
|
@@ -3,3 +3,7 @@ export declare const aovResolveCommon = "\nstruct AovResolvedAccumulation { geom
|
|
|
3
3
|
/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */
|
|
4
4
|
declare const _default: string;
|
|
5
5
|
export default _default;
|
|
6
|
+
/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
|
|
7
|
+
export declare const aovBorrowDepthShader: string;
|
|
8
|
+
/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
|
|
9
|
+
export declare const aovBorrowReflectanceShader: string;
|
|
@@ -5,7 +5,7 @@ struct AovResolvedCenter { identity: vec4u, motion: vec4f, }
|
|
|
5
5
|
@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;
|
|
6
6
|
@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;
|
|
7
7
|
@group(0) @binding(3) var<uniform> parameters: vec4u;
|
|
8
|
-
fn
|
|
8
|
+
fn iU(source: u32, kind: u32) -> vec4u {
|
|
9
9
|
if(kind==5u){return center[source].identity;}
|
|
10
10
|
var value=vec4f(0.0);
|
|
11
11
|
if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}
|
|
@@ -32,7 +32,26 @@ let width=parameters.x;let height=parameters.y;
|
|
|
32
32
|
if(id.x>=width||id.y>=height){return;}
|
|
33
33
|
let index=id.x+id.y*width;
|
|
34
34
|
let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;
|
|
35
|
-
output[index]=
|
|
35
|
+
output[index]=iU(source,parameters.w&255u);
|
|
36
36
|
}
|
|
37
37
|
`;
|
|
38
|
+
/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */
|
|
39
|
+
export const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `
|
|
40
|
+
@group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;
|
|
41
|
+
@compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {
|
|
42
|
+
if(any(id.xy>=parameters.xy)){return;}
|
|
43
|
+
let source=id.x+(parameters.y-1u-id.y)*parameters.x;
|
|
44
|
+
let value=bitcast<vec4f>(iU(source,parameters.w));
|
|
45
|
+
textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));
|
|
46
|
+
}`;
|
|
47
|
+
/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */
|
|
48
|
+
export const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `
|
|
49
|
+
@vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {
|
|
50
|
+
let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);
|
|
51
|
+
}
|
|
52
|
+
@fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {
|
|
53
|
+
let id=vec2u(position.xy);
|
|
54
|
+
let source=id.x+(parameters.y-1u-id.y)*parameters.x;
|
|
55
|
+
return clamp(bitcast<vec4f>(iU(source,parameters.w)),vec4f(0),vec4f(1));
|
|
56
|
+
}`;
|
|
38
57
|
//# sourceMappingURL=aovResolve.wgsl.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n"]}
|
|
1
|
+
{"version":3,"file":"aovResolve.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovResolve.wgsl.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,MAAM,CAAC,MAAM,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;CAuB1C,CAAC;AACF,oFAAoF;AACpF,eAAe,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;;;CAU5C,CAAC;AAEF,8EAA8E;AAC9E,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;EAOhE,CAAC;AACH,kFAAkF;AAClF,MAAM,CAAC,MAAM,0BAA0B,GAAG,gBAAgB,GAAG,UAAU,CAAC;;;;;;;;EAQtE,CAAC","sourcesContent":["/** Shared normalization for readback and GPU denoiser snapshots. */\nexport const aovResolveCommon = /* wgsl */ `\nstruct AovResolvedAccumulation { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct AovResolvedCenter { identity: vec4u, motion: vec4f, }\n@group(0) @binding(0) var<storage,read> accumulation: array<AovResolvedAccumulation>;\n@group(0) @binding(1) var<storage,read> center: array<AovResolvedCenter>;\n@group(0) @binding(3) var<uniform> parameters: vec4u;\nfn aovResolvedValue(source: u32, kind: u32) -> vec4u {\n if(kind==5u){return center[source].identity;}\n var value=vec4f(0.0);\n if(kind==6u){let motion=center[source].motion;value=vec4f(motion.xy,0.0,motion.w);}\n else{\n let pixel=accumulation[source];let hits=pixel.position.w;\n let scale=select(0.0,1.0/max(hits,1.0),hits>0.0);let coverage=hits/f32(max(parameters.z,1u));\n if(kind==0u){value=vec4f(pixel.geometry.x*scale,0.0,0.0,coverage);}\n else if(kind==1u){value=vec4f(pixel.position.xyz*scale,coverage);}\n else if(kind==2u){value=vec4f(pixel.geometry.yzw*scale,coverage);}\n else{let reflectance=select(pixel.diffuse,pixel.specular,kind==4u);\n let inv=select(0.0,1.0/max(reflectance.w,1.0),reflectance.w>0.0);\n value=vec4f(reflectance.xyz*inv,reflectance.w/f32(max(parameters.z,1u)));\n }\n }\n return bitcast<vec4u>(value);\n}\n`;\n/** Bit 8 of kind requests top row first. Kept for the native single-output pass. */\nexport default aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var<storage,read_write> output: array<vec4u>;\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+select(id.y,height-1u-id.y,(parameters.w&256u)!=0u)*width;\n output[index]=aovResolvedValue(source,parameters.w&255u);\n}\n`;\n\n/** Borrowed depth texture: rg32float (depth, hit coverage), top row first. */\nexport const aovBorrowDepthShader = aovResolveCommon + /* wgsl */ `\n@group(0) @binding(2) var image: texture_storage_2d<rg32float,write>;\n@compute @workgroup_size(8,8) fn main(@builtin(global_invocation_id) id: vec3u) {\n if(any(id.xy>=parameters.xy)){return;}\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n let value=bitcast<vec4f>(aovResolvedValue(source,parameters.w));\n textureStore(image,vec2i(id.xy),vec4f(value.x,value.w,0,0));\n}`;\n/** Borrowed reflectance texture, rendered into rgba8unorm-srgb, top row first. */\nexport const aovBorrowReflectanceShader = aovResolveCommon + /* wgsl */ `\n@vertex fn vertex(@builtin(vertex_index) index: u32) -> @builtin(position) vec4f {\n let p=vec2f(f32((index<<1u)&2u),f32(index&2u));return vec4f(p*2.0-1.0,0,1);\n}\n@fragment fn fragment(@builtin(position) position: vec4f) -> @location(0) vec4f {\n let id=vec2u(position.xy);\n let source=id.x+(parameters.y-1u-id.y)*parameters.x;\n return clamp(bitcast<vec4f>(aovResolvedValue(source,parameters.w)),vec4f(0),vec4f(1));\n}`;\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { aovLaneKind } from '../aov.js';
|
|
2
2
|
import { aovResolveCommon } from './aovResolve.wgsl.js';
|
|
3
3
|
// Two input storage buffers leave six output slots on the baseline WebGPU
|
|
4
4
|
// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.
|
|
@@ -14,7 +14,7 @@ let width=parameters.x;let height=parameters.y;
|
|
|
14
14
|
if(id.x>=width||id.y>=height){return;}
|
|
15
15
|
let index=id.x+id.y*width;
|
|
16
16
|
let source=id.x+(height-1u-id.y)*width;
|
|
17
|
-
${kinds.map((kind, i) => `output${i}[index]=
|
|
17
|
+
${kinds.map((kind, i) => `output${i}[index]=iU(source,${aovLaneKind(kind)}u);`).join('\n ')}
|
|
18
18
|
}
|
|
19
19
|
`;
|
|
20
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"aovSnapshot.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovSnapshot.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAe,MAAM,WAAW,CAAC;AACpD,OAAO,EAAC,gBAAgB,EAAC,MAAM,sBAAsB,CAAC;AAEtD,0EAA0E;AAC1E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AAEjF,MAAM,UAAU,iBAAiB,CAAC,KAAyB;IACzD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,uBAAuB;QAAE,MAAM,IAAI,UAAU,CAAC,iCAAiC,CAAC,CAAC;IACrH,OAAO,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC3C,sBAAsB,kBAAkB,CAAC,CAAC,CAAC,mCAAmC,CAAC,iBAAiB,CACjG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;;;;;;;EAOxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,qBAAmC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;;CAE3G,CAAC;AACF,CAAC","sourcesContent":["import {aovLaneKind, type AovKind} from '../aov.js';\nimport {aovResolveCommon} from './aovResolve.wgsl.js';\n\n// Two input storage buffers leave six output slots on the baseline WebGPU\n// eight-storage-buffer limit. Binding 3 remains the shared uniform binding.\nexport const AOV_SNAPSHOT_BATCH_SIZE = 6;\nexport const aovSnapshotBinding = (index: number) => index === 0 ? 2 : index + 3;\n\nexport function aovSnapshotShader(kinds: readonly AovKind[]): string {\n if (!kinds.length || kinds.length > AOV_SNAPSHOT_BATCH_SIZE) throw new RangeError('Invalid AOV snapshot batch size');\n return aovResolveCommon + kinds.map((_, i) =>\n `@group(0) @binding(${aovSnapshotBinding(i)}) var<storage,read_write> output${i}: array<vec4u>;`\n ).join('\\n') + /* wgsl */ `\n@compute @workgroup_size(8,8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let width=parameters.x;let height=parameters.y;\n if(id.x>=width||id.y>=height){return;}\n let index=id.x+id.y*width;\n let source=id.x+(height-1u-id.y)*width;\n ${kinds.map((kind, i) => `output${i}[index]=aovResolvedValue(source,${aovLaneKind(kind)}u);`).join('\\n ')}\n}\n`;\n}\n"]}
|
|
@@ -15,15 +15,15 @@ struct AovCenter { identity: vec4u, motion: vec4f, }
|
|
|
15
15
|
@group(3) @binding(9) var<storage, read> aovPrevious: array<AovCenter>;
|
|
16
16
|
@group(3) @binding(8) var<uniform> aovParameters: vec4u;
|
|
17
17
|
|
|
18
|
-
fn
|
|
18
|
+
fn lC(offset: u32) -> mat4x4f {
|
|
19
19
|
return mat4x4f(bitcast<vec4f>(vec4u(aovScene[offset], aovScene[offset+1u], aovScene[offset+2u], aovScene[offset+3u])),
|
|
20
20
|
bitcast<vec4f>(vec4u(aovScene[offset+4u], aovScene[offset+5u], aovScene[offset+6u], aovScene[offset+7u])),
|
|
21
21
|
bitcast<vec4f>(vec4u(aovScene[offset+8u], aovScene[offset+9u], aovScene[offset+10u], aovScene[offset+11u])),
|
|
22
22
|
bitcast<vec4f>(vec4u(aovScene[offset+12u], aovScene[offset+13u], aovScene[offset+14u], aovScene[offset+15u])));
|
|
23
23
|
}
|
|
24
|
-
fn
|
|
25
|
-
fn
|
|
26
|
-
var ray =
|
|
24
|
+
fn iV(offset:u32)->vec3f {return bitcast<vec3f>(vec3u(aovScene[offset],aovScene[offset+1u],aovScene[offset+2u]));}
|
|
25
|
+
fn jS(zG: Ray, si: ptr<function, SurfaceInteraction>, material: ptr<function, OpenPbrResolvedMaterial>) -> bool {
|
|
26
|
+
var ray = zG;
|
|
27
27
|
(*si).triangleIndex = -1;
|
|
28
28
|
for (var layer = 0; layer < 32; layer++) {
|
|
29
29
|
intersectScene(ray, si, 0, false, false);
|
|
@@ -41,21 +41,21 @@ if (any(id.xy >= size)) { return; }
|
|
|
41
41
|
let index = id.x + id.y * size.x;
|
|
42
42
|
let sample = aovParameters.z;
|
|
43
43
|
if (sample == 0u) { aovAccum[index] = AovAccumulation(); }
|
|
44
|
-
|
|
45
|
-
samplingBounce = 0u;
|
|
46
|
-
|
|
44
|
+
aJ = id.xy; aC = sample + rtUniform.sampleSequenceOffset;
|
|
45
|
+
samplingBounce = 0u; hashedCounter = 0u;
|
|
46
|
+
fA(id.xy, i32(aC ^ cD(rtUniform.sequenceSeed)));
|
|
47
47
|
let uv = (vec2f(id.xy) + sample2D(CAMERA_PIXEL)) / vec2f(size);
|
|
48
|
-
var ray =
|
|
48
|
+
var ray = cV(uv);
|
|
49
49
|
if (cameraUniform.apertureRadius > 0.0) {
|
|
50
50
|
let eye = cameraUniform.viewInv[3].xyz;
|
|
51
51
|
let forward = -normalize(cameraUniform.viewInv[2].xyz);
|
|
52
|
-
let
|
|
53
|
-
let
|
|
54
|
-
let origin = (cameraUniform.viewInv * vec4f(
|
|
55
|
-
initRay(&ray, origin, normalize(
|
|
52
|
+
let jY = eye + ray.d * (cameraUniform.focusDistance / dot(ray.d, forward));
|
|
53
|
+
let wJ = cameraUniform.apertureRadius * kX(sample2D(CAMERA_LENS));
|
|
54
|
+
let origin = (cameraUniform.viewInv * vec4f(wJ, 0.0, 1.0)).xyz;
|
|
55
|
+
initRay(&ray, origin, normalize(jY-origin));
|
|
56
56
|
}
|
|
57
57
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
58
|
-
if (!
|
|
58
|
+
if (!jS(ray, &si, &material)) { return; }
|
|
59
59
|
let depth = max(dot(si.position-cameraUniform.viewInv[3].xyz, -normalize(cameraUniform.viewInv[2].xyz)), 0.0);
|
|
60
60
|
let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
61
61
|
(material.coatWeight > 0.0) | (material.fuzzWeight > 0.0) |
|
|
@@ -66,17 +66,17 @@ let unsupported = (material.materialType != STANDARD) | (material.alpha < 1.0) |
|
|
|
66
66
|
aovAccum[index].depthRoughness += vec4f(depth, material.specularRoughness, material.baseMetalness, select(0.0,1.0,unsupported));
|
|
67
67
|
if (AOV_REFLECTANCE && (aovParameters.w & 24u) != 0u && !unsupported) {
|
|
68
68
|
var normal=si.normal; var face=si.faceNormal;
|
|
69
|
-
var cosine=-dot(normal,ray.d); var
|
|
69
|
+
var cosine=-dot(normal,ray.d); var fk=-dot(face,ray.d);
|
|
70
70
|
if (material.thinWalled && (material.transmissionWeight>0.0 || material.subsurfaceWeight>0.0)) {
|
|
71
71
|
if(cosine<0.0){normal=-normal;cosine=-cosine;}
|
|
72
|
-
if(
|
|
72
|
+
if(fk<0.0){face=-face;fk=-fk;}
|
|
73
73
|
}
|
|
74
|
-
if(
|
|
74
|
+
if(fk>=0.0 && cosine<0.0){normal=face;cosine=fk;}
|
|
75
75
|
normal=select(-normal,normal,cosine>=0.0);
|
|
76
76
|
material.inside=(cosine<=0.0) && !material.thinWalled;
|
|
77
77
|
material.relativeIor=select(material.specularIor,1.0/material.specularIor,cosine>0.0);
|
|
78
|
-
let prepared=
|
|
79
|
-
let reflectance=
|
|
78
|
+
let prepared=bX(si.tangent,material,-ray.d,normal);
|
|
79
|
+
let reflectance=hO(prepared, (aovParameters.w & 8u) != 0u, (aovParameters.w & 16u) != 0u);
|
|
80
80
|
aovAccum[index].diffuse+=vec4f(reflectance.diffuse,1.0);
|
|
81
81
|
aovAccum[index].specular+=vec4f(reflectance.specular,1.0);
|
|
82
82
|
}
|
|
@@ -89,26 +89,26 @@ if (any(id.xy >= size)) { return; }
|
|
|
89
89
|
let index = id.x + id.y * size.x;
|
|
90
90
|
aovCenter[index] = AovCenter(vec4u(0xffffffffu), vec4f(0.0));
|
|
91
91
|
let uv = (vec2f(id.xy) + 0.5) / vec2f(size);
|
|
92
|
-
let ray =
|
|
92
|
+
let ray = cV(uv);
|
|
93
93
|
var si: SurfaceInteraction; var material: OpenPbrResolvedMaterial;
|
|
94
|
-
if (!
|
|
94
|
+
if (!jS(ray, &si, &material)) { return; }
|
|
95
95
|
let offset = 52u + u32(si.instanceIndex) * 24u;
|
|
96
96
|
let materialOffset = aovScene[16u];
|
|
97
97
|
let primitiveOffset = aovScene[17u];
|
|
98
98
|
aovCenter[index].identity = vec4u(aovScene[offset], aovScene[offset+1u],
|
|
99
99
|
aovScene[materialOffset + u32(si.materialIndex)], aovScene[primitiveOffset + u32(si.triangleIndex)]);
|
|
100
|
-
aovCenter[index].motion.z = dot(si.position-
|
|
100
|
+
aovCenter[index].motion.z = dot(si.position-iV(36u),iV(40u));
|
|
101
101
|
if (aovScene[offset+2u] == 0u) { return; }
|
|
102
|
-
let
|
|
103
|
-
let
|
|
104
|
-
if (
|
|
105
|
-
let
|
|
106
|
-
let
|
|
107
|
-
if (any(
|
|
108
|
-
let previous=aovPrevious[u32(
|
|
109
|
-
let
|
|
110
|
-
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-
|
|
111
|
-
let motion=(
|
|
102
|
+
let rF = lC(offset+4u) * vec4f(si.position,1.0);
|
|
103
|
+
let qp = lC(0u) * rF;
|
|
104
|
+
if (qp.w <= 0.0) { return; }
|
|
105
|
+
let vJ=qp.xyz/qp.w;
|
|
106
|
+
let iF=(vJ.xy*0.5+0.5)*vec2f(size);
|
|
107
|
+
if (any(iF < vec2f(0.0)) || any(iF >= vec2f(size)) || abs(vJ.z)>1.0) { return; }
|
|
108
|
+
let previous=aovPrevious[u32(iF.x)+u32(iF.y)*size.x];
|
|
109
|
+
let rE=dot(rF.xyz-iV(44u),iV(48u));
|
|
110
|
+
if (any(previous.identity.xy != aovCenter[index].identity.xy) || abs(previous.motion.z-rE)>max(1e-4,abs(rE)*1e-3)) { return; }
|
|
111
|
+
let motion=(iF-(vec2f(id.xy)+0.5))*vec2f(1.0,-1.0);
|
|
112
112
|
aovCenter[index].motion=vec4f(motion,aovCenter[index].motion.z,3.0);
|
|
113
113
|
}
|
|
114
114
|
`;
|