@meimu/mutracer 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +222 -0
- package/LICENSES/FidelityFX-FSR.txt +19 -0
- package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
- package/THIRD_PARTY_NOTICES.md +18 -4
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +6260 -5580
- package/docs/api.md +45 -18
- package/docs/materials.md +4 -2
- package/docs/performance.md +7 -0
- package/docs/post-processing.md +62 -9
- package/docs/progressive-rendering.md +3 -0
- package/docs/sampling.md +4 -0
- package/docs/technical/acceleration.md +52 -0
- package/docs/technical/aovs.md +79 -0
- package/docs/technical/caustics.md +109 -0
- package/docs/technical/continuous-spectrum.md +29 -0
- package/docs/technical/display-upscale.md +82 -0
- package/docs/technical/openpbr.md +99 -0
- package/docs/technical/pbrt-import.md +168 -0
- package/docs/technical/tiling.md +74 -0
- package/docs/technical/webgl.md +53 -0
- package/docs/viewer.md +11 -1
- package/lib/Display.d.ts +19 -5
- package/lib/Display.js +10 -7
- package/lib/Display.js.map +1 -1
- package/lib/Engine.d.ts +2 -1
- package/lib/Engine.js +30 -2
- package/lib/Engine.js.map +1 -1
- package/lib/Render.d.ts +20 -11
- package/lib/Render.js +32 -7
- package/lib/Render.js.map +1 -1
- package/lib/main.d.ts +3 -1
- package/lib/main.js +1 -0
- package/lib/main.js.map +1 -1
- package/lib/oidn.d.ts +1 -1
- package/lib/renderer/AovPrimitiveCache.js +39 -8
- package/lib/renderer/AovPrimitiveCache.js.map +1 -1
- package/lib/renderer/DisplayPostProcess.d.ts +8 -3
- package/lib/renderer/DisplayPostProcess.js +51 -18
- package/lib/renderer/DisplayPostProcess.js.map +1 -1
- package/lib/renderer/MaterialData.js +7 -2
- package/lib/renderer/MaterialData.js.map +1 -1
- package/lib/renderer/RenderingPipeline.d.ts +7 -1
- package/lib/renderer/RenderingPipeline.js.map +1 -1
- package/lib/renderer/TileRender.d.ts +2 -2
- package/lib/renderer/TileRender.js +128 -7
- package/lib/renderer/TileRender.js.map +1 -1
- package/lib/renderer/WGPUAov.d.ts +6 -1
- package/lib/renderer/WGPUAov.js +108 -14
- package/lib/renderer/WGPUAov.js.map +1 -1
- package/lib/renderer/WGPUCanvasSurface.js +12 -1
- package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
- package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPURayTraceOutput.js +12 -12
- package/lib/renderer/WGPURayTracePass.d.ts +17 -4
- package/lib/renderer/WGPURayTracePass.js +194 -71
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +46 -40
- package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLAov.js +3 -3
- package/lib/renderer/WebGLAov.js.map +1 -1
- package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
- package/lib/renderer/WebGLFullQuadPass.js +8 -2
- package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
- package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
- package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
- package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
- package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
- package/lib/renderer/WebGLRayTracePass.js +115 -111
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/WebGLRenderingPipeline.js +10 -3
- package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
- package/lib/renderer/WebGLSkyBaker.js +57 -57
- package/lib/renderer/aov.d.ts +13 -1
- package/lib/renderer/aov.js +21 -2
- package/lib/renderer/aov.js.map +1 -1
- package/lib/renderer/aovDisplay.js +2 -2
- package/lib/renderer/aovDisplay.js.map +1 -1
- package/lib/renderer/binnedSahBvh.d.ts +2 -1
- package/lib/renderer/binnedSahBvh.js +24 -17
- package/lib/renderer/binnedSahBvh.js.map +1 -1
- package/lib/renderer/bvhAccel.d.ts +3 -1
- package/lib/renderer/bvhAccel.js +36 -6
- package/lib/renderer/bvhAccel.js.map +1 -1
- package/lib/renderer/cameraUniform.d.ts +1 -1
- package/lib/renderer/cameraUniform.js +6 -2
- package/lib/renderer/cameraUniform.js.map +1 -1
- package/lib/renderer/compactVertices.d.ts +14 -0
- package/lib/renderer/compactVertices.js +124 -0
- package/lib/renderer/compactVertices.js.map +1 -0
- package/lib/renderer/easu.d.ts +11 -0
- package/lib/renderer/easu.js +156 -0
- package/lib/renderer/easu.js.map +1 -0
- package/lib/renderer/geometryUpdateState.d.ts +1 -0
- package/lib/renderer/geometryUpdateState.js.map +1 -1
- package/lib/renderer/geometryUpdates.js +3 -2
- package/lib/renderer/geometryUpdates.js.map +1 -1
- package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
- package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
- package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
- package/lib/renderer/glsl/aovTrace.frag.js +44 -36
- package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
- package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
- package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
- package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
- package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
- package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
- package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
- package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
- package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
- package/lib/renderer/glsl/depthQuery.frag.js +12 -6
- package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
- package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
- package/lib/renderer/glsl/rayTrace.frag.js +233 -170
- package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
- package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
- package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
- package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
- package/lib/renderer/gpuMemory.js +1 -1
- package/lib/renderer/gpuMemory.js.map +1 -1
- package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
- package/lib/renderer/openPbrEnergyLut.js +18 -1
- package/lib/renderer/openPbrEnergyLut.js.map +1 -1
- package/lib/renderer/pathLimits.d.ts +5 -4
- package/lib/renderer/pathLimits.js +6 -5
- package/lib/renderer/pathLimits.js.map +1 -1
- package/lib/renderer/prepareMeshBVH.d.ts +2 -0
- package/lib/renderer/prepareMeshBVH.js +5 -3
- package/lib/renderer/prepareMeshBVH.js.map +1 -1
- package/lib/renderer/progressiveScheduler.js +1 -1
- package/lib/renderer/progressiveScheduler.js.map +1 -1
- package/lib/renderer/renderPipeline.d.ts +4 -0
- package/lib/renderer/renderPipeline.js +1 -0
- package/lib/renderer/renderPipeline.js.map +1 -1
- package/lib/renderer/researchTransport.d.ts +1 -1
- package/lib/renderer/researchTransport.js.map +1 -1
- package/lib/renderer/sceneAssembly.d.ts +1 -1
- package/lib/renderer/sceneAssembly.js +4 -3
- package/lib/renderer/sceneAssembly.js.map +1 -1
- package/lib/renderer/sceneChangeDetector.d.ts +1 -1
- package/lib/renderer/sceneChangeDetector.js +3 -1
- package/lib/renderer/sceneChangeDetector.js.map +1 -1
- package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
- package/lib/renderer/sceneLayoutSchema.js +2 -2
- package/lib/renderer/sceneLayoutSchema.js.map +1 -1
- package/lib/renderer/scenePreparation.d.ts +3 -2
- package/lib/renderer/scenePreparation.js +18 -2
- package/lib/renderer/scenePreparation.js.map +1 -1
- package/lib/renderer/scratchSampling.js +6 -6
- package/lib/renderer/spectrum.js +2 -2
- package/lib/renderer/staticBvhPreparation.d.ts +9 -0
- package/lib/renderer/staticBvhPreparation.js +8 -2
- package/lib/renderer/staticBvhPreparation.js.map +1 -1
- package/lib/renderer/surfaceHit.d.ts +10 -0
- package/lib/renderer/surfaceHit.js +22 -0
- package/lib/renderer/surfaceHit.js.map +1 -0
- package/lib/renderer/tangentRequirements.d.ts +2 -0
- package/lib/renderer/tangentRequirements.js +7 -0
- package/lib/renderer/tangentRequirements.js.map +1 -0
- package/lib/renderer/textureAtlas.d.ts +4 -0
- package/lib/renderer/textureAtlas.js +48 -2
- package/lib/renderer/textureAtlas.js.map +1 -1
- package/lib/renderer/webgl.js +4 -0
- package/lib/renderer/webgl.js.map +1 -1
- package/lib/renderer/webglVertexAttributes.d.ts +17 -0
- package/lib/renderer/webglVertexAttributes.js +44 -0
- package/lib/renderer/webglVertexAttributes.js.map +1 -0
- package/lib/renderer/wgpuBindlessSource.js +2 -2
- package/lib/renderer/wgpuMaterialConstants.js +4 -3
- package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
- package/lib/renderer/wgpuSceneUniform.js +2 -2
- package/lib/renderer/wgpuSceneUniform.js.map +1 -1
- package/lib/renderer/wgpuShaderSource.d.ts +15 -0
- package/lib/renderer/wgpuShaderSource.js +1 -1
- package/lib/renderer/wgpuShaderSource.js.map +1 -1
- package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
- package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
- package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
- package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
- package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
- package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
- package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
- package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
- package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
- package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
- package/lib/renderer/wgsl/causticLight.compute.js +121 -119
- package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
- package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
- package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
- package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
- package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
- package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
- package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
- package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
- package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
- package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
- package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
- package/lib/renderer/wgsl/easu.wgsl.js +80 -0
- package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
- package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
- package/lib/renderer/wgsl/jnlm.compute.js +74 -74
- package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
- package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
- package/lib/renderer/wgsl/photonMap.compute.js +89 -89
- package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
- package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
- package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
- package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
- package/lib/scene/Scene.js.map +1 -1
- package/lib/settings/render.d.ts +11 -0
- package/lib/settings/render.js +1 -0
- package/lib/settings/render.js.map +1 -1
- package/lib/util/fromTHREE.js +21 -14
- package/lib/util/fromTHREE.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +5 -2
- package/lib/oidnBundledWeights.cdn.d.ts +0 -2
- package/lib/oidnBundledWeights.cdn.js +0 -5
- package/lib/oidnBundledWeights.cdn.js.map +0 -1
- package/lib/renderer/bvh.worker.d.ts +0 -1
- package/lib/renderer/bvh.worker.js +0 -16
- package/lib/renderer/bvh.worker.js.map +0 -1
- package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
- package/lib/renderer/bvhWorkerBuild.js +0 -17
- package/lib/renderer/bvhWorkerBuild.js.map +0 -1
- package/lib/renderer/lightCore.d.ts +0 -12
- package/lib/renderer/lightCore.js +0 -13
- package/lib/renderer/lightCore.js.map +0 -1
- package/lib/renderer/materialCore.d.ts +0 -8
- package/lib/renderer/materialCore.js +0 -9
- package/lib/renderer/materialCore.js.map +0 -1
- package/lib/scene/PixelTexture.d.ts +0 -6
- package/lib/scene/PixelTexture.js +0 -10
- package/lib/scene/PixelTexture.js.map +0 -1
- package/lib/util/studioLighting.d.ts +0 -18
- package/lib/util/studioLighting.js +0 -36
- package/lib/util/studioLighting.js.map +0 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type SurfaceHit } from './surfaceHit.js';
|
|
1
2
|
import { WebGLAov } from './WebGLAov.js';
|
|
2
3
|
import { type AovKind } from './aov.js';
|
|
3
4
|
import { type SamplingPattern } from './sampling.js';
|
|
@@ -37,8 +38,9 @@ declare class WebGLRayTracePass {
|
|
|
37
38
|
private _dirtyColorMeshes;
|
|
38
39
|
private _tlas?;
|
|
39
40
|
private _bvhData?;
|
|
40
|
-
private
|
|
41
|
-
private
|
|
41
|
+
private _instancesOffset;
|
|
42
|
+
private _vertexAttributeData?;
|
|
43
|
+
private _vertexAttributeLayout?;
|
|
42
44
|
private _meshSnapshot;
|
|
43
45
|
private _snapshotByMesh;
|
|
44
46
|
private _needsUpdateAnalyticLightsBuffer;
|
|
@@ -66,14 +68,8 @@ declare class WebGLRayTracePass {
|
|
|
66
68
|
private _sequenceSeed;
|
|
67
69
|
private _zLogSPP;
|
|
68
70
|
private _positionBufferTex;
|
|
69
|
-
private
|
|
70
|
-
private _colorBufferTex;
|
|
71
|
-
private _tangentBufferTex;
|
|
72
|
-
private _uvBufferTex;
|
|
73
|
-
private _uv1BufferTex;
|
|
71
|
+
private _vertexAttributeTex;
|
|
74
72
|
private _bvhBufferTex;
|
|
75
|
-
private _instancesBufferTex;
|
|
76
|
-
private _matIndexBufferTex;
|
|
77
73
|
private _hasTransmission;
|
|
78
74
|
private _hasAlpha;
|
|
79
75
|
private _invalid;
|
|
@@ -81,6 +77,7 @@ declare class WebGLRayTracePass {
|
|
|
81
77
|
private _mainPass;
|
|
82
78
|
private _shadowCatcherPass;
|
|
83
79
|
private _viewProjInv;
|
|
80
|
+
private _projectionInv;
|
|
84
81
|
private _apertureRadius;
|
|
85
82
|
private _focusDistance;
|
|
86
83
|
private _aovPass;
|
|
@@ -91,6 +88,8 @@ declare class WebGLRayTracePass {
|
|
|
91
88
|
private _depthAspect;
|
|
92
89
|
private _hasShadowCatcher;
|
|
93
90
|
private _spectral;
|
|
91
|
+
private _shareSpectralPrefix;
|
|
92
|
+
private _independentSpectralPaths;
|
|
94
93
|
constructor(renderer: WebGLRenderer);
|
|
95
94
|
preparePrograms(): boolean;
|
|
96
95
|
createPass(clear: boolean, tile: {
|
|
@@ -120,6 +119,8 @@ declare class WebGLRayTracePass {
|
|
|
120
119
|
textureAtlas: import("./textureAtlas.js").TextureAtlasStats | undefined;
|
|
121
120
|
};
|
|
122
121
|
private _updateMeshData;
|
|
122
|
+
private _uploadBVH;
|
|
123
|
+
private _uploadInstanceRanges;
|
|
123
124
|
private _updateMaterialConstants;
|
|
124
125
|
private _updateMeshMembership;
|
|
125
126
|
private _updateGeometryData;
|
|
@@ -147,12 +148,15 @@ declare class WebGLRayTracePass {
|
|
|
147
148
|
isInvalid(): boolean;
|
|
148
149
|
hasShadowCatcher(): boolean;
|
|
149
150
|
hasDispersion(): boolean;
|
|
151
|
+
hasSharedSpectralPrefix(): boolean;
|
|
150
152
|
prepare(): void;
|
|
151
153
|
setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed?: number): boolean;
|
|
152
154
|
setSampleSequenceOffset(_offset: number): void;
|
|
153
155
|
prepareAovs(state: WebGLAov, camera: Camera, width: number, height: number, kinds: readonly AovKind[]): boolean;
|
|
154
156
|
renderAovs(state: WebGLAov, camera: Camera, width: number, height: number, samples: number, cap: number, kinds: readonly AovKind[], sequenceOffset?: number): boolean;
|
|
155
|
-
|
|
157
|
+
pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
|
|
158
|
+
readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
|
|
159
|
+
private _readDepthSamples;
|
|
156
160
|
dispose(): void;
|
|
157
161
|
}
|
|
158
162
|
export default WebGLRayTracePass;
|
|
@@ -1,12 +1,14 @@
|
|
|
1
|
+
import { materialNeedsVertexTangents } from './tangentRequirements.js';
|
|
2
|
+
import { resolveSurfaceHit } from './surfaceHit.js';
|
|
1
3
|
import { researchTransport } from './researchTransport.js';
|
|
2
4
|
import { EmissiveTriangleCache } from './lightSampling.js';
|
|
3
5
|
import { prepareWebGLLightSampling } from './webglLightSampling.js';
|
|
4
6
|
import { AovPrimitiveCache } from './AovPrimitiveCache.js';
|
|
5
7
|
import { aovTraceFragment } from './glsl/aovTrace.frag.js';
|
|
6
8
|
import { packAovScene } from './aovScene.js';
|
|
7
|
-
import { aovMask } from './aov.js';
|
|
9
|
+
import { aovMask, AOV_ACCUMULATED_MASK, AOV_REFLECTANCE_MASK } from './aov.js';
|
|
8
10
|
import { WebGLSkySource } from './WebGLSkySource.js';
|
|
9
|
-
import { normalizeBounces } from './pathLimits.js';
|
|
11
|
+
import { normalizeBounces, MAX_PATH_EVENTS_WEBGL } from './pathLimits.js';
|
|
10
12
|
import { updateMeshInstanceColors } from './prepareMeshBVH.js';
|
|
11
13
|
import { updateTLASInstanceColors } from './bvhAccel.js';
|
|
12
14
|
import { getMaterialHashKey } from '../scene/openPbrSchema.js';
|
|
@@ -25,7 +27,7 @@ import { MaterialChangeTracker, materialIsEmissive } from './materialChanges.js'
|
|
|
25
27
|
import { constants, Texture2D as WebGLTexture2D } from './webgl.js';
|
|
26
28
|
import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
|
|
27
29
|
import { mat4 } from '../math.js';
|
|
28
|
-
import { buildBLAS,
|
|
30
|
+
import { buildBLAS, buildWebTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
|
|
29
31
|
import { generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform, backgroundMapRotation } from './envMapCreation.js';
|
|
30
32
|
import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
|
|
31
33
|
import createRayTraceFragmentShader from './glsl/rayTrace.frag.js';
|
|
@@ -40,6 +42,7 @@ import { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged
|
|
|
40
42
|
import { Attribute } from '../scene/Geometry.js';
|
|
41
43
|
import { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';
|
|
42
44
|
import { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';
|
|
45
|
+
import { packVertexAttributes, vertexAttributeDefines, vertexAttributeLayout } from './webglVertexAttributes.js';
|
|
43
46
|
import { DEFAULT_BEVEL_SAMPLES, normalizeBevelSamples } from './RenderingPipeline.js';
|
|
44
47
|
import { getOpenPbrEnergyLutData, OPENPBR_ENERGY_LUT_HEIGHT, OPENPBR_ENERGY_LUT_WIDTH } from './openPbrEnergyLut.js';
|
|
45
48
|
// A defensive mixture keeps weak-but-wide lights from being starved by an
|
|
@@ -92,8 +95,9 @@ class WebGLRayTracePass {
|
|
|
92
95
|
_dirtyColorMeshes = new Set();
|
|
93
96
|
_tlas;
|
|
94
97
|
_bvhData;
|
|
95
|
-
|
|
96
|
-
|
|
98
|
+
_instancesOffset = 0;
|
|
99
|
+
_vertexAttributeData;
|
|
100
|
+
_vertexAttributeLayout;
|
|
97
101
|
_meshSnapshot = [];
|
|
98
102
|
_snapshotByMesh = new WeakMap();
|
|
99
103
|
_needsUpdateAnalyticLightsBuffer = true;
|
|
@@ -129,17 +133,8 @@ class WebGLRayTracePass {
|
|
|
129
133
|
_sequenceSeed = 0;
|
|
130
134
|
_zLogSPP = 0;
|
|
131
135
|
_positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
132
|
-
|
|
133
|
-
_colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
134
|
-
_tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
135
|
-
_uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
136
|
-
_uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
136
|
+
_vertexAttributeTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
137
137
|
_bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
138
|
-
_instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);
|
|
139
|
-
_matIndexBufferTex = new WebGLTexture2D({
|
|
140
|
-
...commonNearestFloatProps
|
|
141
|
-
// type: constants.INT
|
|
142
|
-
});
|
|
143
138
|
_hasTransmission = false;
|
|
144
139
|
_hasAlpha = false;
|
|
145
140
|
_invalid = false;
|
|
@@ -147,6 +142,7 @@ class WebGLRayTracePass {
|
|
|
147
142
|
_mainPass;
|
|
148
143
|
_shadowCatcherPass;
|
|
149
144
|
_viewProjInv = mat4.create();
|
|
145
|
+
_projectionInv = mat4.create();
|
|
150
146
|
_apertureRadius = 0;
|
|
151
147
|
_focusDistance = 10;
|
|
152
148
|
_aovPass;
|
|
@@ -157,6 +153,8 @@ class WebGLRayTracePass {
|
|
|
157
153
|
_depthAspect = 1;
|
|
158
154
|
_hasShadowCatcher = false;
|
|
159
155
|
_spectral = false;
|
|
156
|
+
_shareSpectralPrefix = true;
|
|
157
|
+
_independentSpectralPaths = false;
|
|
160
158
|
constructor(renderer) {
|
|
161
159
|
this._renderer = renderer;
|
|
162
160
|
const accumulationOutput = {
|
|
@@ -229,7 +227,7 @@ class WebGLRayTracePass {
|
|
|
229
227
|
: this._mainPass.getOutput(label);
|
|
230
228
|
}
|
|
231
229
|
setBounce(bounce) {
|
|
232
|
-
const next = normalizeBounces(bounce);
|
|
230
|
+
const next = normalizeBounces(bounce, MAX_PATH_EVENTS_WEBGL);
|
|
233
231
|
const changed = this._bounces !== next;
|
|
234
232
|
this._bounces = next;
|
|
235
233
|
return changed;
|
|
@@ -440,34 +438,14 @@ class WebGLRayTracePass {
|
|
|
440
438
|
this._needsUpdateMeshMembership = false;
|
|
441
439
|
const mergedGeometry = res.geometry;
|
|
442
440
|
const materials = res.materials;
|
|
443
|
-
|
|
444
|
-
this.
|
|
445
|
-
const
|
|
446
|
-
|
|
447
|
-
const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));
|
|
448
|
-
const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);
|
|
449
|
-
const blasOffset = tlasBuffer.length / 4;
|
|
450
|
-
bvhBuffer.set(tlasBuffer);
|
|
451
|
-
bvhBuffer.set(blasBuffer, blasOffset * 4);
|
|
441
|
+
this._tlas = buildWebTLAS(res.instances, res.blases);
|
|
442
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
443
|
+
const layout = this._vertexAttributeLayout = vertexAttributeLayout(mergedGeometry);
|
|
444
|
+
let vertexAttributeColumns = 0;
|
|
452
445
|
if (mergedGeometry.position.array.length > 0) {
|
|
453
446
|
setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);
|
|
457
|
-
mergedGeometry.tangent &&
|
|
458
|
-
setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);
|
|
459
|
-
mergedGeometry.uv &&
|
|
460
|
-
setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);
|
|
461
|
-
mergedGeometry.uv1 &&
|
|
462
|
-
setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);
|
|
463
|
-
mergedGeometry.materialIndex &&
|
|
464
|
-
setDataTexture(this._matIndexBufferTex,
|
|
465
|
-
// TODO currently int texture doesn't work
|
|
466
|
-
this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array), 4);
|
|
467
|
-
}
|
|
468
|
-
if (bvhBuffer.length > 0) {
|
|
469
|
-
setDataTexture(this._bvhBufferTex, bvhBuffer, 4);
|
|
470
|
-
setDataTexture(this._instancesBufferTex, instancesBuffer, 4);
|
|
447
|
+
this._vertexAttributeData = packVertexAttributes(mergedGeometry, layout, new Float32Array(mergedGeometry.vertexCount * layout.stride * 4));
|
|
448
|
+
vertexAttributeColumns = setDataTexture(this._vertexAttributeTex, this._vertexAttributeData, 4).columnsLog;
|
|
471
449
|
}
|
|
472
450
|
this._materialData?.dispose(this._renderer.gl);
|
|
473
451
|
const materialData = new MaterialTable(materials, this._analyticLights, {
|
|
@@ -479,26 +457,41 @@ class WebGLRayTracePass {
|
|
|
479
457
|
this._tracePasses.forEach((pass) => {
|
|
480
458
|
pass.setUniforms({
|
|
481
459
|
bvhBuffer: this._bvhBufferTex,
|
|
482
|
-
instancesBuffer: this._instancesBufferTex,
|
|
483
460
|
positionBuffer: this._positionBufferTex,
|
|
484
|
-
|
|
485
|
-
tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,
|
|
486
|
-
colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,
|
|
487
|
-
uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,
|
|
488
|
-
uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,
|
|
489
|
-
materialIndexBuffer: this._matIndexBufferTex,
|
|
490
|
-
bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,
|
|
461
|
+
vertexAttributes: this._vertexAttributeTex,
|
|
491
462
|
vertexColumns: textureDimensionsFromArray(Attribute.getCount(mergedGeometry.position)).columnsLog,
|
|
492
|
-
|
|
493
|
-
.columnsLog,
|
|
494
|
-
blasOffset,
|
|
463
|
+
vertexAttributeColumns,
|
|
495
464
|
isEmptyScene: +(res.instances.length === 0)
|
|
496
465
|
});
|
|
497
466
|
});
|
|
498
467
|
this._updateMaterialConstants(materials, materialData, mergedGeometry);
|
|
499
468
|
this._materialChanges.capture(materials);
|
|
500
469
|
this._pendingMaterialUpdate = undefined;
|
|
501
|
-
|
|
470
|
+
}
|
|
471
|
+
// One texture holds the TLAS, the BLASes and then the instance records.
|
|
472
|
+
_uploadBVH(blas) {
|
|
473
|
+
const tlas = this._tlas, instances = new Float32Array(tlas.instancesBuffer);
|
|
474
|
+
const tlasLength = tlas.buffer.byteLength / 4, instancesOffset = tlasLength + blas.length;
|
|
475
|
+
const data = this._bvhData = new Float32Array(instancesOffset + instances.length);
|
|
476
|
+
data.set(new Float32Array(tlas.buffer));
|
|
477
|
+
data.set(blas, tlasLength);
|
|
478
|
+
data.set(instances, instancesOffset);
|
|
479
|
+
this._instancesOffset = instancesOffset / 4;
|
|
480
|
+
if (data.length > 0)
|
|
481
|
+
setDataTexture(this._bvhBufferTex, data, 4);
|
|
482
|
+
this._tracePasses.forEach(pass => pass.setUniforms({
|
|
483
|
+
bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
|
|
484
|
+
blasOffset: tlasLength / 4,
|
|
485
|
+
instancesOffset: this._instancesOffset
|
|
486
|
+
}));
|
|
487
|
+
}
|
|
488
|
+
_uploadInstanceRanges(ranges) {
|
|
489
|
+
const instances = new Uint8Array(this._tlas.instancesBuffer), data = this._bvhData;
|
|
490
|
+
const base = this._instancesOffset * 16;
|
|
491
|
+
for (const { offset, size } of ranges) {
|
|
492
|
+
new Uint8Array(data.buffer).set(instances.subarray(offset, offset + size), base + offset);
|
|
493
|
+
this._bvhBufferTex.updateDataRange(this._renderer.gl, data, base + offset, size);
|
|
494
|
+
}
|
|
502
495
|
}
|
|
503
496
|
_updateMaterialConstants(materials, materialData, mergedGeometry) {
|
|
504
497
|
// Avoid too much shader compilation
|
|
@@ -510,13 +503,24 @@ class WebGLRayTracePass {
|
|
|
510
503
|
this._hasTransmission = materials.some((m) => m.transmissionWeight > 0 ||
|
|
511
504
|
m.mapAlphaUsage === "transmission");
|
|
512
505
|
this._hasAlpha = materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque');
|
|
513
|
-
|
|
506
|
+
const spectral = materials.some((m) => m.transmissionDispersionScale > 0);
|
|
507
|
+
if (spectral !== !!this._spectral) {
|
|
508
|
+
this._spectral = spectral;
|
|
509
|
+
const shader = createRayTraceFragmentShader({
|
|
510
|
+
channelIndependentLight: spectral, shareSpectralPrefix: spectral && this._shareSpectralPrefix
|
|
511
|
+
});
|
|
512
|
+
if (!researchTransport()?.configure(this, 'webgl')?.enabled) {
|
|
513
|
+
shader.parallelCompile = true;
|
|
514
|
+
this._mainPass.setShader(shader);
|
|
515
|
+
}
|
|
516
|
+
}
|
|
514
517
|
this._tracePasses.forEach(pass => {
|
|
515
518
|
pass.setDefines({
|
|
516
519
|
OES_texture_float_linear: true,
|
|
517
520
|
STACK_SIZE,
|
|
518
521
|
USE_VERTEX_COLOR: mergedGeometry.color != null,
|
|
519
|
-
USE_TANGENT: mergedGeometry.tangent != null,
|
|
522
|
+
USE_TANGENT: mergedGeometry.tangent != null && materials.some(materialNeedsVertexTangents),
|
|
523
|
+
...vertexAttributeDefines(vertexAttributeLayout(mergedGeometry)),
|
|
520
524
|
USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),
|
|
521
525
|
HAS_TRANSMISSION: this._hasTransmission,
|
|
522
526
|
HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
|
|
@@ -531,7 +535,7 @@ class WebGLRayTracePass {
|
|
|
531
535
|
// Multiple-scattering SSS paths need enough collisions to return to
|
|
532
536
|
// the boundary before roulette; terminating at depth five produces
|
|
533
537
|
// dark materials and a handful of very large surviving samples.
|
|
534
|
-
RR_MAX:
|
|
538
|
+
RR_MAX: 12,
|
|
535
539
|
...materialData.defines
|
|
536
540
|
});
|
|
537
541
|
materialData.setToPass(pass);
|
|
@@ -540,20 +544,9 @@ class WebGLRayTracePass {
|
|
|
540
544
|
_updateMeshMembership() {
|
|
541
545
|
const res = this._pendingMembershipData;
|
|
542
546
|
this._preparedMeshData = res;
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
data.set(new Float32Array(tlas.buffer));
|
|
547
|
-
data.set(blas, tlas.buffer.byteLength / 4);
|
|
548
|
-
this._instancesData = new Float32Array(tlas.instancesBuffer);
|
|
549
|
-
setDataTexture(this._bvhBufferTex, data, 4);
|
|
550
|
-
setDataTexture(this._instancesBufferTex, this._instancesData, 4);
|
|
551
|
-
this._tracePasses.forEach(pass => pass.setUniforms({
|
|
552
|
-
bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
|
|
553
|
-
instancesColumns: textureDimensionsFromArray(this._instancesData.length / 4).columnsLog,
|
|
554
|
-
blasOffset: tlas.buffer.byteLength / 16,
|
|
555
|
-
isEmptyScene: +(res.instances.length === 0)
|
|
556
|
-
}));
|
|
547
|
+
this._tlas = buildWebTLAS(res.instances, res.blases);
|
|
548
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
549
|
+
this._tracePasses.forEach(pass => pass.setUniform('isEmptyScene', +(res.instances.length === 0)));
|
|
557
550
|
this._pendingMembershipData = undefined;
|
|
558
551
|
this._needsUpdateMeshMembership = false;
|
|
559
552
|
this._debugBvhData = undefined;
|
|
@@ -561,20 +554,12 @@ class WebGLRayTracePass {
|
|
|
561
554
|
_updateGeometryData() {
|
|
562
555
|
const res = this._preparedMeshData, tlas = this._tlas;
|
|
563
556
|
const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent))
|
|
571
|
-
texture.updateDataRange(this._renderer.gl, attribute.array, first * attribute.itemSize * 4, count * attribute.itemSize * 4);
|
|
572
|
-
if (!topologyChanged)
|
|
573
|
-
continue;
|
|
574
|
-
const material = this._materialIndexData;
|
|
575
|
-
for (let i = first * 4; i < (first + count) * 4; i++)
|
|
576
|
-
material[i] = res.geometry.materialIndex.array[i];
|
|
577
|
-
this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);
|
|
557
|
+
const layout = this._vertexAttributeLayout, attributes = this._vertexAttributeData;
|
|
558
|
+
for (const { first, count } of update.vertices) {
|
|
559
|
+
const position = res.geometry.position;
|
|
560
|
+
this._positionBufferTex.updateDataRange(this._renderer.gl, position.array, first * position.itemSize * 4, count * position.itemSize * 4);
|
|
561
|
+
packVertexAttributes(res.geometry, layout, attributes, first, count);
|
|
562
|
+
this._vertexAttributeTex.updateDataRange(this._renderer.gl, attributes, first * layout.stride * 16, count * layout.stride * 16);
|
|
578
563
|
}
|
|
579
564
|
for (const mesh of update.meshes)
|
|
580
565
|
this._dirtyTransformMeshes.add(mesh);
|
|
@@ -584,12 +569,7 @@ class WebGLRayTracePass {
|
|
|
584
569
|
if (update.resized) {
|
|
585
570
|
res.instances = updateMeshInstanceTransforms(res.instanceBindings);
|
|
586
571
|
refitTLAS(tlas, res.instances, res.blases);
|
|
587
|
-
|
|
588
|
-
this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
|
|
589
|
-
this._bvhData.set(new Float32Array(tlas.buffer));
|
|
590
|
-
this._bvhData.set(blas, tlas.buffer.byteLength / 4);
|
|
591
|
-
setDataTexture(this._bvhBufferTex, this._bvhData, 4);
|
|
592
|
-
this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData.length / 4).columnsLog));
|
|
572
|
+
this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
|
|
593
573
|
}
|
|
594
574
|
else {
|
|
595
575
|
const ranges = [];
|
|
@@ -610,8 +590,7 @@ class WebGLRayTracePass {
|
|
|
610
590
|
if (res && tlas) {
|
|
611
591
|
const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);
|
|
612
592
|
const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);
|
|
613
|
-
|
|
614
|
-
this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
|
|
593
|
+
this._uploadInstanceRanges(ranges);
|
|
615
594
|
}
|
|
616
595
|
this._dirtyColorMeshes.clear();
|
|
617
596
|
}
|
|
@@ -631,8 +610,7 @@ class WebGLRayTracePass {
|
|
|
631
610
|
this._bvhData.set(new Float32Array(tlas.buffer));
|
|
632
611
|
for (const { offset, size } of ranges.tlasRanges)
|
|
633
612
|
this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
|
|
634
|
-
|
|
635
|
-
this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
|
|
613
|
+
this._uploadInstanceRanges(ranges.instanceRanges);
|
|
636
614
|
this._dirtyTransformMeshes.clear();
|
|
637
615
|
this._needsRefitTLAS = false;
|
|
638
616
|
this._debugBvhData = undefined;
|
|
@@ -722,9 +700,11 @@ class WebGLRayTracePass {
|
|
|
722
700
|
const viewProjectionInv = this._viewProjInv;
|
|
723
701
|
this._apertureRadius = cameraApertureRadius(camera);
|
|
724
702
|
this._focusDistance = camera.focusDistance;
|
|
725
|
-
this.
|
|
703
|
+
mat4.invert(this._projectionInv, camera.getProjectionMatrix(this._depthAspect));
|
|
704
|
+
mat4.mul(viewProjectionInv, camera.transform, this._projectionInv);
|
|
726
705
|
this._tracePasses.forEach((pass) => {
|
|
727
706
|
pass.setUniform('viewProjectionInv', viewProjectionInv);
|
|
707
|
+
pass.setUniform('projectionInv', this._projectionInv);
|
|
728
708
|
pass.setUniform('viewInv', camera.transform);
|
|
729
709
|
// Zero for orthographic cameras, which have no depth of field.
|
|
730
710
|
pass.setUniform('cameraApertureRadius', this._apertureRadius);
|
|
@@ -759,9 +739,20 @@ class WebGLRayTracePass {
|
|
|
759
739
|
this._shadowCatcherPass.useTarget(target);
|
|
760
740
|
}
|
|
761
741
|
setQuality(options) {
|
|
762
|
-
|
|
742
|
+
const wasIndependent = this._independentSpectralPaths;
|
|
743
|
+
const research = researchTransport()?.configure(this, 'webgl');
|
|
744
|
+
this._independentSpectralPaths = !!research?.enabled;
|
|
745
|
+
const share = options.dispersionWavelengths !== 1;
|
|
746
|
+
if (this._spectral && (share !== this._shareSpectralPrefix || wasIndependent) && !research?.enabled) {
|
|
747
|
+
const shader = createRayTraceFragmentShader({
|
|
748
|
+
channelIndependentLight: true, shareSpectralPrefix: share
|
|
749
|
+
});
|
|
750
|
+
shader.parallelCompile = true;
|
|
751
|
+
this._mainPass.setShader(shader);
|
|
752
|
+
}
|
|
753
|
+
this._shareSpectralPrefix = share;
|
|
763
754
|
this._tracePasses.forEach(pass => {
|
|
764
|
-
pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
|
|
755
|
+
pass.setUniform('bounceLimit', normalizeBounces(options.bounces, MAX_PATH_EVENTS_WEBGL));
|
|
765
756
|
pass.setUniform('bevelEnabled', options.bevel);
|
|
766
757
|
pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
|
|
767
758
|
});
|
|
@@ -785,6 +776,10 @@ class WebGLRayTracePass {
|
|
|
785
776
|
hasDispersion() {
|
|
786
777
|
return this._spectral;
|
|
787
778
|
}
|
|
779
|
+
hasSharedSpectralPrefix() {
|
|
780
|
+
// Research connections can disperse before the camera reaches a boundary.
|
|
781
|
+
return this._shareSpectralPrefix && !this._independentSpectralPaths;
|
|
782
|
+
}
|
|
788
783
|
prepare() {
|
|
789
784
|
if (this._needsUpdateMeshData) {
|
|
790
785
|
this._updateMeshData();
|
|
@@ -885,7 +880,7 @@ class WebGLRayTracePass {
|
|
|
885
880
|
if (!gl.getExtension('EXT_color_buffer_float'))
|
|
886
881
|
throw new Error('AOV requires EXT_color_buffer_float');
|
|
887
882
|
state.resize(width, height);
|
|
888
|
-
this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) &
|
|
883
|
+
this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & AOV_REFLECTANCE_MASK) !== 0 });
|
|
889
884
|
if (!state.frame) {
|
|
890
885
|
const packed = packAovScene(this._preparedMeshData, this._tlas, camera, width, height, state.history, this._aovPrimitiveCache.get(this._preparedMeshData, this._tlas));
|
|
891
886
|
state.frame = packed.frame;
|
|
@@ -913,7 +908,7 @@ class WebGLRayTracePass {
|
|
|
913
908
|
state.history.accept(state.frame);
|
|
914
909
|
}
|
|
915
910
|
const target = Math.min(samples, cap);
|
|
916
|
-
if ((aovMask(kinds) &
|
|
911
|
+
if ((aovMask(kinds) & AOV_ACCUMULATED_MASK) === 0)
|
|
917
912
|
state.samples = target;
|
|
918
913
|
while (state.samples < target) {
|
|
919
914
|
const output = state.accumulation[state.samples % 2], previous = state.accumulation[(state.samples + 1) % 2];
|
|
@@ -925,15 +920,30 @@ class WebGLRayTracePass {
|
|
|
925
920
|
}
|
|
926
921
|
return true;
|
|
927
922
|
}
|
|
928
|
-
async
|
|
923
|
+
async pickSurface(x, y, aspect) {
|
|
924
|
+
const source = this._preparedMeshData, tlas = this._tlas;
|
|
925
|
+
if (!source || !tlas)
|
|
926
|
+
return;
|
|
927
|
+
const values = await this._readDepthSamples({ x, y, size: 0 }, aspect, true);
|
|
928
|
+
if (!values || source !== this._preparedMeshData || tlas !== this._tlas)
|
|
929
|
+
return;
|
|
930
|
+
return resolveSurfaceHit(source, tlas, values);
|
|
931
|
+
}
|
|
932
|
+
readDepthSamples(area, aspect) {
|
|
933
|
+
return this._readDepthSamples(area, aspect);
|
|
934
|
+
}
|
|
935
|
+
async _readDepthSamples(area, aspect, picking = false) {
|
|
929
936
|
if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||
|
|
930
937
|
!this._renderer.isAllProgramCompiled())
|
|
931
938
|
return;
|
|
932
939
|
this.prepare();
|
|
933
|
-
|
|
940
|
+
const packed = packDepthSampleArea(area, aspect ?? this._depthAspect);
|
|
941
|
+
if (picking)
|
|
942
|
+
packed.set([-1, -1], 2);
|
|
943
|
+
this._depthPass.setUniform('depthArea', packed);
|
|
934
944
|
this._depthPass.createPass({});
|
|
935
945
|
const rgba = await readFloatPixelsAsync(this._renderer.gl, DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);
|
|
936
|
-
return unpackDepthSamples(rgba);
|
|
946
|
+
return picking ? rgba.slice(0, 4) : unpackDepthSamples(rgba);
|
|
937
947
|
}
|
|
938
948
|
dispose() {
|
|
939
949
|
researchTransport()?.dispose(this, 'webgl');
|
|
@@ -951,14 +961,8 @@ class WebGLRayTracePass {
|
|
|
951
961
|
this._envMapDistribution,
|
|
952
962
|
this._backgroundTex,
|
|
953
963
|
this._positionBufferTex,
|
|
954
|
-
this.
|
|
955
|
-
this.
|
|
956
|
-
this._tangentBufferTex,
|
|
957
|
-
this._uvBufferTex,
|
|
958
|
-
this._uv1BufferTex,
|
|
959
|
-
this._bvhBufferTex,
|
|
960
|
-
this._instancesBufferTex,
|
|
961
|
-
this._matIndexBufferTex
|
|
964
|
+
this._vertexAttributeTex,
|
|
965
|
+
this._bvhBufferTex
|
|
962
966
|
].forEach((texture) => texture.dispose(gl));
|
|
963
967
|
}
|
|
964
968
|
}
|