@forgeax/engine-render 0.1.29 → 0.1.31
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/README.md +248 -21
- package/dist/assembly/atmosphere-shader-prewarm.d.ts +1 -1
- package/dist/assembly/atmosphere-shader-prewarm.d.ts.map +1 -1
- package/dist/assembly/device-feature-admission.d.ts +4 -3
- package/dist/assembly/device-feature-admission.d.ts.map +1 -1
- package/dist/assembly/dynamic-geometry-host.d.ts +6 -0
- package/dist/assembly/dynamic-geometry-host.d.ts.map +1 -1
- package/dist/assembly/host-contract.d.ts +6 -0
- package/dist/assembly/host-contract.d.ts.map +1 -1
- package/dist/assembly/material/assembly.d.ts +26 -3
- package/dist/assembly/material/assembly.d.ts.map +1 -1
- package/dist/assembly/material/pipeline-helpers.d.ts +24 -0
- package/dist/assembly/material/pipeline-helpers.d.ts.map +1 -0
- package/dist/assembly/material-shader-policy.d.ts.map +1 -1
- package/dist/assembly/recovery/device-loss-fanout.d.ts.map +1 -1
- package/dist/assembly/recovery/recovery-attempt.d.ts +1 -6
- package/dist/assembly/recovery/recovery-attempt.d.ts.map +1 -1
- package/dist/assembly/recovery/renderer-recover.d.ts +1 -0
- package/dist/assembly/recovery/renderer-recover.d.ts.map +1 -1
- package/dist/assembly/renderer-facade.d.ts.map +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts +1 -1
- package/dist/assembly/shader-prewarm-policy.d.ts.map +1 -1
- package/dist/assembly/webgpu-ready.d.ts +1 -1
- package/dist/assembly/webgpu-ready.d.ts.map +1 -1
- package/dist/assembly/webgpu-renderer.d.ts.map +1 -1
- package/dist/capture/scene-projection.d.ts +41 -0
- package/dist/capture/scene-projection.d.ts.map +1 -0
- package/dist/{chunk-BQVQOQJH.mjs → chunk-7MQ3XBSP.mjs} +20 -14
- package/dist/chunk-7MQ3XBSP.mjs.map +1 -0
- package/dist/{chunk-S4DNKQYQ.mjs → chunk-C3DDSXYK.mjs} +86 -33
- package/dist/chunk-C3DDSXYK.mjs.map +1 -0
- package/dist/{chunk-BTWH7BP4.mjs → chunk-FUUO4UND.mjs} +73 -29
- package/dist/chunk-FUUO4UND.mjs.map +1 -0
- package/dist/{chunk-NRNXBLIJ.mjs → chunk-JRBDO2KB.mjs} +46 -6
- package/dist/chunk-JRBDO2KB.mjs.map +1 -0
- package/dist/{chunk-NICXSHAT.mjs → chunk-MDQJPY3T.mjs} +8 -6
- package/dist/chunk-MDQJPY3T.mjs.map +1 -0
- package/dist/{chunk-JQTSEI3Z.mjs → chunk-NO4WZCAH.mjs} +3 -3
- package/dist/chunk-NO4WZCAH.mjs.map +1 -0
- package/dist/{chunk-FUODTTIA.mjs → chunk-PSEQ6QPH.mjs} +621 -108
- package/dist/chunk-PSEQ6QPH.mjs.map +1 -0
- package/dist/{chunk-33XZFTQU.mjs → chunk-S5UE2T5P.mjs} +48 -6
- package/dist/chunk-S5UE2T5P.mjs.map +1 -0
- package/dist/components/directional-light.d.ts +2 -2
- package/dist/components/dynamic-resolution.d.ts +15 -0
- package/dist/components/dynamic-resolution.d.ts.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/light-helpers.d.ts.map +1 -1
- package/dist/components/reflection-probe.d.ts +1 -0
- package/dist/components/reflection-probe.d.ts.map +1 -1
- package/dist/components/skylight.d.ts +4 -1
- package/dist/components/skylight.d.ts.map +1 -1
- package/dist/construct-renderer.mjs +2172 -796
- package/dist/construct-renderer.mjs.map +1 -1
- package/dist/device/device-scope.d.ts +2 -0
- package/dist/device/device-scope.d.ts.map +1 -1
- package/dist/device/gpu-residency.d.ts +2 -2
- package/dist/device/gpu-residency.d.ts.map +1 -1
- package/dist/dynamic-geometry.d.ts.map +1 -1
- package/dist/environment/background.d.ts +3 -2
- package/dist/environment/background.d.ts.map +1 -1
- package/dist/environment/ibl.d.ts +11 -0
- package/dist/environment/ibl.d.ts.map +1 -0
- package/dist/environment/storage.d.ts +14 -0
- package/dist/environment/storage.d.ts.map +1 -0
- package/dist/errors/gpu-driven.d.ts +2 -2
- package/dist/errors/gpu-driven.d.ts.map +1 -1
- package/dist/errors/render.d.ts +35 -1
- package/dist/errors/render.d.ts.map +1 -1
- package/dist/extract/camera.d.ts.map +1 -1
- package/dist/extract/contracts.d.ts +7 -0
- package/dist/extract/contracts.d.ts.map +1 -1
- package/dist/extract/gpu-driven.d.ts +18 -1
- package/dist/extract/gpu-driven.d.ts.map +1 -1
- package/dist/gpu-driven/batch-topology.d.ts.map +1 -1
- package/dist/gpu-driven/material-artifacts.d.ts +24 -0
- package/dist/gpu-driven/material-artifacts.d.ts.map +1 -0
- package/dist/gpu-driven/material-bindings.d.ts +7 -0
- package/dist/gpu-driven/material-bindings.d.ts.map +1 -0
- package/dist/gpu-driven/prepared-draw.d.ts +2 -0
- package/dist/gpu-driven/prepared-draw.d.ts.map +1 -1
- package/dist/gpu-driven/production-raster.d.ts +27 -6
- package/dist/gpu-driven/production-raster.d.ts.map +1 -1
- package/dist/gpu-resource.d.ts +5 -2
- package/dist/gpu-resource.d.ts.map +1 -1
- package/dist/gpu-scene-schema.d.ts.map +1 -1
- package/dist/gpu-scene.d.ts.map +1 -1
- package/dist/hdrp-buffers.d.ts +3 -0
- package/dist/hdrp-buffers.d.ts.map +1 -1
- package/dist/ibl/IblPipelineCache.d.ts +2 -0
- package/dist/ibl/IblPipelineCache.d.ts.map +1 -1
- package/dist/ibl/skylight-bind-group.d.ts +3 -1
- package/dist/ibl/skylight-bind-group.d.ts.map +1 -1
- package/dist/index.d.ts +83 -81
- package/dist/index.d.ts.map +1 -1
- package/dist/index.mjs +7 -5
- package/dist/index.mjs.map +1 -1
- package/dist/inspection-types.d.ts +16 -1
- package/dist/inspection-types.d.ts.map +1 -1
- package/dist/internal.mjs +6 -6
- package/dist/material-row.d.ts +10 -0
- package/dist/material-row.d.ts.map +1 -1
- package/dist/pbr-pipeline.d.ts +3 -1
- package/dist/pbr-pipeline.d.ts.map +1 -1
- package/dist/pipeline/render-extent.d.ts +51 -0
- package/dist/pipeline/render-extent.d.ts.map +1 -0
- package/dist/pipeline/standard-build-context.d.ts +7 -0
- package/dist/pipeline/standard-build-context.d.ts.map +1 -0
- package/dist/pipeline/standard-forward-lane.d.ts +3 -2
- package/dist/pipeline/standard-forward-lane.d.ts.map +1 -1
- package/dist/pipeline/standard-pipeline.d.ts.map +1 -1
- package/dist/pipeline/standard-post.d.ts +1 -1
- package/dist/pipeline/standard-post.d.ts.map +1 -1
- package/dist/pipeline/standard-profile.d.ts +2 -1
- package/dist/pipeline/standard-profile.d.ts.map +1 -1
- package/dist/pipeline-builder.d.ts +3 -1
- package/dist/pipeline-builder.d.ts.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/post-process-errors.d.ts +9 -2
- package/dist/post-process-errors.d.ts.map +1 -1
- package/dist/prepare/extended-lighting/resources.d.ts +3 -3
- package/dist/record/frame-lighting.d.ts.map +1 -1
- package/dist/record/frame-snapshot.d.ts +3 -8
- package/dist/record/frame-snapshot.d.ts.map +1 -1
- package/dist/record/frame.d.ts +3 -2
- package/dist/record/frame.d.ts.map +1 -1
- package/dist/record/main-pass-geometry.d.ts +7 -2
- package/dist/record/main-pass-geometry.d.ts.map +1 -1
- package/dist/record/main-pass-material.d.ts +6 -3
- package/dist/record/main-pass-material.d.ts.map +1 -1
- package/dist/record/main-pass.d.ts +2 -0
- package/dist/record/main-pass.d.ts.map +1 -1
- package/dist/record/prepared-material-bindings.d.ts.map +1 -1
- package/dist/record/recovery-pipeline.d.ts +9 -1
- package/dist/record/recovery-pipeline.d.ts.map +1 -1
- package/dist/record/render-context.d.ts +34 -3
- package/dist/record/render-context.d.ts.map +1 -1
- package/dist/record/shadow-pass.d.ts +2 -2
- package/dist/record/shadow-pass.d.ts.map +1 -1
- package/dist/record/typed-frame-graph.d.ts +5 -2
- package/dist/record/typed-frame-graph.d.ts.map +1 -1
- package/dist/recovery/render-system-candidate.d.ts.map +1 -1
- package/dist/reflection/background.d.ts +14 -0
- package/dist/reflection/background.d.ts.map +1 -0
- package/dist/reflection/filter.d.ts.map +1 -1
- package/dist/reflection/projection.d.ts +1 -0
- package/dist/reflection/projection.d.ts.map +1 -1
- package/dist/reflection/record-owner.d.ts +4 -2
- package/dist/reflection/record-owner.d.ts.map +1 -1
- package/dist/render-contract.d.ts +47 -32
- package/dist/render-contract.d.ts.map +1 -1
- package/dist/render-graph-primitives.d.ts.map +1 -1
- package/dist/render-pipeline.d.ts +17 -1
- package/dist/render-pipeline.d.ts.map +1 -1
- package/dist/render-system-extract-tail.d.ts +9 -2
- package/dist/render-system-extract-tail.d.ts.map +1 -1
- package/dist/render-system-extract.d.ts +29 -2
- package/dist/render-system-extract.d.ts.map +1 -1
- package/dist/render-system.d.ts.map +1 -1
- package/dist/scene/render-scene.d.ts +2 -0
- package/dist/scene/render-scene.d.ts.map +1 -1
- package/dist/ssao-config.d.ts +8 -6
- package/dist/ssao-config.d.ts.map +1 -1
- package/dist/ssr/graph.d.ts.map +1 -1
- package/dist/temporal/gpu.d.ts.map +1 -1
- package/dist/temporal/index.mjs +5 -5
- package/dist/temporal/standard-scene-data.d.ts +2 -1
- package/dist/temporal/standard-scene-data.d.ts.map +1 -1
- package/dist/temporal/target-coverage-attachment.d.ts +15 -0
- package/dist/temporal/target-coverage-attachment.d.ts.map +1 -0
- package/dist/temporal/temporal-view.d.ts +6 -2
- package/dist/temporal/temporal-view.d.ts.map +1 -1
- package/dist/temporal/view.d.ts +6 -0
- package/dist/temporal/view.d.ts.map +1 -1
- package/dist/typed-render-graph-primitives.d.ts +6 -0
- package/dist/typed-render-graph-primitives.d.ts.map +1 -1
- package/dist/volume/component.d.ts +1 -0
- package/dist/volume/component.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/__tests__/capture-scene-projection.unit.test.ts +24 -0
- package/src/__tests__/device-feature-admission.unit.test.ts +15 -24
- package/src/__tests__/device-loss-fanout.unit.test.ts +43 -0
- package/src/__tests__/dynamic-geometry-batch.unit.test.ts +157 -0
- package/src/__tests__/dynamic-geometry.unit.test.ts +36 -0
- package/src/__tests__/dynamic-resolution-plugin.integration.test.ts +81 -0
- package/src/__tests__/factory-contract.integration.test.ts +164 -1
- package/src/__tests__/frame-observation.contract.test.ts +21 -0
- package/src/__tests__/gpu-driven-baseline.characterization.test.ts +1 -1
- package/src/__tests__/gpu-driven-batch-topology-pbr.unit.test.ts +20 -1
- package/src/__tests__/gpu-driven-lod-cache.unit.test.ts +0 -3
- package/src/__tests__/gpu-driven-mesh-world-identity.unit.test.ts +0 -3
- package/src/__tests__/gpu-driven-pbr.dawn.test.ts +11 -6
- package/src/__tests__/gpu-driven-production.integration.test.ts +13 -25
- package/src/__tests__/gpu-driven-view.unit.test.ts +1 -0
- package/src/__tests__/gpu-pass-timing-browser-runner.ts +15 -0
- package/src/__tests__/gpu-pass-timing.browser.test.ts +14 -1
- package/src/__tests__/gpu-resource-scope.unit.test.ts +71 -0
- package/src/__tests__/gpu-scene.unit.test.ts +55 -1
- package/src/__tests__/materials-standard-contract.unit.test.ts +5 -1
- package/src/__tests__/mesh-submission-lifetime.unit.test.ts +8 -0
- package/src/__tests__/morph-neutral-admission.unit.test.ts +19 -0
- package/src/__tests__/physical-clearcoat.integration.test.ts +6 -1
- package/src/__tests__/post-process-error-policy-owner.unit.test.ts +6 -5
- package/src/__tests__/prepared-gpu-driven-pbr.integration.test.ts +216 -5
- package/src/__tests__/reflection-fallback-async-publication.unit.test.ts +68 -1
- package/src/__tests__/reflection-probe-authoring.unit.test.ts +12 -10
- package/src/__tests__/reflection-probe-box.dawn.test.ts +71 -0
- package/src/__tests__/reflection-probe-filter.unit.test.ts +9 -0
- package/src/__tests__/reflection-probe-orientation.dawn.test.ts +294 -0
- package/src/__tests__/reflection-probe-record-owner.characterization.unit.test.ts +5 -15
- package/src/__tests__/reflection-probe-updates.unit.test.ts +129 -0
- package/src/__tests__/render-error-code-owner.test-d.ts +3 -0
- package/src/__tests__/render-error-detail-ssot.test-d.ts +5 -1
- package/src/__tests__/render-extent.unit.test.ts +63 -0
- package/src/__tests__/render-scene-projection.unit.test.ts +3 -2
- package/src/__tests__/renderer-factory-material-contract.unit.test.ts +173 -9
- package/src/__tests__/shader-manifest-fixture.ts +6 -0
- package/src/__tests__/skinned-shadow-caster.test.ts +8 -1
- package/src/__tests__/specular-environment-scale.dawn.test.ts +4 -2
- package/src/__tests__/ssao-config.unit.test.ts +7 -0
- package/src/__tests__/ssao-surface.dawn.test.ts +252 -0
- package/src/__tests__/ssr-cube-silhouette.dawn.test.ts +270 -0
- package/src/__tests__/ssr-gpu-dispatch.browser.test.ts +51 -43
- package/src/__tests__/ssr-gpu-dispatch.dawn.test.ts +4 -0
- package/src/__tests__/ssr-gpu-dispatch.ts +10 -5
- package/src/__tests__/ssr-graph-topology.unit.test.ts +2 -2
- package/src/__tests__/ssr-hiz.browser.test.ts +1 -1
- package/src/__tests__/ssr-hiz.dawn.test.ts +1 -1
- package/src/__tests__/ssr-spatial.integration.test.ts +1 -1
- package/src/__tests__/standard-cluster-variant-resolution.unit.test.ts +40 -0
- package/src/__tests__/standard-pbr-artifact-assembly.unit.test.ts +238 -1
- package/src/__tests__/standard-profile-oracle.unit.test.ts +27 -0
- package/src/__tests__/taa-coverage-edge.dawn.test.ts +6 -0
- package/src/__tests__/taa-neighborhood-equivalence.dawn.test.ts +5 -1
- package/src/__tests__/taa-stability-feedback.ts +1 -0
- package/src/__tests__/temporal-reset-matrix.unit.test.ts +2 -2
- package/src/__tests__/temporal-view.unit.test.ts +17 -0
- package/src/__tests__/transmission-prewarm.unit.test.ts +57 -0
- package/src/__tests__/volumetric-fog-stage-readback.dawn.test.ts +62 -13
- package/src/__tests__/volumetric-fog-topology.unit.test.ts +7 -7
- package/src/assembly/atmosphere-shader-prewarm.ts +3 -2
- package/src/assembly/device-feature-admission.ts +9 -4
- package/src/assembly/dynamic-geometry-host.ts +236 -163
- package/src/assembly/host-contract.ts +9 -0
- package/src/assembly/material/assembly.ts +350 -6
- package/src/assembly/material/pipeline-helpers.ts +100 -0
- package/src/assembly/material-shader-policy.ts +39 -18
- package/src/assembly/recovery/device-loss-fanout.ts +5 -0
- package/src/assembly/recovery/recovery-attempt.ts +2 -29
- package/src/assembly/recovery/renderer-recover.ts +6 -9
- package/src/assembly/renderer-facade.ts +22 -1
- package/src/assembly/shader-prewarm-policy.ts +14 -1
- package/src/assembly/webgpu-ready.ts +28 -19
- package/src/assembly/webgpu-renderer.ts +95 -95
- package/src/capture/scene-projection.ts +37 -0
- package/src/components/__tests__/dynamic-resolution-schema.unit.test.ts +65 -0
- package/src/components/__tests__/light-radius.integration.test.ts +59 -0
- package/src/components/directional-light.ts +3 -3
- package/src/components/dynamic-resolution.ts +67 -0
- package/src/components/index.ts +1 -0
- package/src/components/light-helpers.ts +6 -1
- package/src/components/reflection-probe.ts +1 -0
- package/src/components/skylight.ts +4 -1
- package/src/device/device-scope.ts +13 -7
- package/src/device/gpu-residency.ts +11 -11
- package/src/dynamic-geometry.ts +13 -8
- package/src/environment/background.ts +30 -12
- package/src/environment/ibl.ts +211 -0
- package/src/environment/storage.ts +63 -0
- package/src/errors/gpu-driven.ts +10 -3
- package/src/errors/render.ts +64 -0
- package/src/extract/camera.ts +12 -1
- package/src/extract/contracts.ts +10 -0
- package/src/extract/gpu-driven.ts +72 -17
- package/src/gpu-driven/batch-topology.ts +33 -11
- package/src/gpu-driven/material-artifacts.ts +179 -0
- package/src/gpu-driven/material-bindings.ts +41 -0
- package/src/gpu-driven/prepared-draw.ts +13 -2
- package/src/gpu-driven/production-raster.ts +681 -164
- package/src/gpu-resource.ts +21 -2
- package/src/gpu-scene-schema.ts +11 -2
- package/src/gpu-scene.ts +14 -3
- package/src/hdrp-buffers.ts +69 -0
- package/src/ibl/IblPipelineCache.ts +5 -0
- package/src/ibl/skylight-bind-group.ts +27 -17
- package/src/index.ts +92 -81
- package/src/inspection-types.ts +16 -1
- package/src/material-row.ts +60 -11
- package/src/pbr-pipeline.ts +13 -2
- package/src/pipeline/render-extent.ts +111 -0
- package/src/pipeline/standard-build-context.ts +7 -0
- package/src/pipeline/standard-forward-lane.ts +41 -24
- package/src/pipeline/standard-pipeline.ts +47 -18
- package/src/pipeline/standard-post.ts +4 -0
- package/src/pipeline/standard-profile.ts +2 -1
- package/src/pipeline-builder.ts +12 -3
- package/src/plugin.ts +4 -0
- package/src/post-process-errors.ts +26 -18
- package/src/prepare/__tests__/extended-lighting-capability.unit.test.ts +2 -2
- package/src/prepare/extended-lighting/resources.ts +3 -3
- package/src/record/__tests__/main-pass-geometry.unit.test.ts +68 -0
- package/src/record/__tests__/material-bg-cache.unit.test.ts +45 -0
- package/src/record/__tests__/material-slot-plan.unit.test.ts +9 -0
- package/src/record/__tests__/recovery-pipeline.unit.test.ts +47 -1
- package/src/record/__tests__/sprite-material-abi.unit.test.ts +7 -3
- package/src/record/__tests__/temporal-payload.unit.test.ts +2 -0
- package/src/record/frame-lighting.ts +3 -1
- package/src/record/frame-snapshot.ts +13 -11
- package/src/record/frame.ts +150 -74
- package/src/record/main-pass-geometry.ts +60 -9
- package/src/record/main-pass-material.ts +47 -19
- package/src/record/main-pass.ts +63 -4
- package/src/record/prepared-material-bindings.ts +4 -0
- package/src/record/recovery-pipeline.ts +56 -0
- package/src/record/render-context.ts +34 -3
- package/src/record/shadow-pass.ts +187 -50
- package/src/record/typed-frame-graph.ts +60 -3
- package/src/record/view-ubo.ts +1 -1
- package/src/recovery/render-system-candidate.ts +54 -11
- package/src/reflection/background.ts +151 -0
- package/src/reflection/filter.ts +3 -0
- package/src/reflection/projection.ts +16 -6
- package/src/reflection/record-owner.ts +282 -86
- package/src/render-contract.ts +50 -32
- package/src/render-graph-primitives.ts +28 -3
- package/src/render-pipeline.ts +20 -1
- package/src/render-system-extract-tail.ts +23 -3
- package/src/render-system-extract.ts +127 -42
- package/src/render-system.ts +35 -7
- package/src/scene/render-scene.ts +8 -0
- package/src/ssao-config.ts +25 -8
- package/src/ssr/graph.ts +78 -58
- package/src/temporal/gpu.ts +5 -0
- package/src/temporal/standard-scene-data.ts +7 -1
- package/src/temporal/target-coverage-attachment.ts +72 -0
- package/src/temporal/temporal-view.ts +10 -4
- package/src/temporal/view.ts +12 -2
- package/src/transmission/__tests__/standard-transmission.dawn.test.ts +24 -9
- package/src/typed-render-graph-primitives.ts +38 -0
- package/src/volume/component.ts +1 -0
- package/src/volume/passes.ts +3 -3
- package/dist/chunk-33XZFTQU.mjs.map +0 -1
- package/dist/chunk-BQVQOQJH.mjs.map +0 -1
- package/dist/chunk-BTWH7BP4.mjs.map +0 -1
- package/dist/chunk-FUODTTIA.mjs.map +0 -1
- package/dist/chunk-JQTSEI3Z.mjs.map +0 -1
- package/dist/chunk-NICXSHAT.mjs.map +0 -1
- package/dist/chunk-NRNXBLIJ.mjs.map +0 -1
- package/dist/chunk-S4DNKQYQ.mjs.map +0 -1
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type BindGroup,
|
|
3
|
+
type BindGroupLayout,
|
|
4
|
+
type Buffer,
|
|
5
|
+
type RenderPipeline,
|
|
6
|
+
RhiError,
|
|
7
|
+
type RhiRenderPassEncoder,
|
|
8
|
+
type TextureFormat,
|
|
9
|
+
type TextureView,
|
|
10
|
+
} from '@forgeax/engine-rhi';
|
|
11
|
+
import { toShared } from '@forgeax/engine-types';
|
|
12
|
+
import { getIblProbeBackgroundSource } from '../ibl/IblPipelineCache';
|
|
13
|
+
import { prepareMaterialSkylight } from '../record/main-pass-material';
|
|
14
|
+
import type {
|
|
15
|
+
_InternalRenderPipelineContext,
|
|
16
|
+
RenderSystemInternals,
|
|
17
|
+
} from '../record/render-context';
|
|
18
|
+
import type { CameraSnapshot } from '../render-contract';
|
|
19
|
+
|
|
20
|
+
export interface ProbeBackgroundResources {
|
|
21
|
+
readonly pipeline: RenderPipeline;
|
|
22
|
+
readonly layout: BindGroupLayout;
|
|
23
|
+
readonly uniform: Buffer;
|
|
24
|
+
readonly groups: WeakMap<TextureView, BindGroup>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** One shared buffer is sufficient: the probe owner schedules one face per frame. */
|
|
28
|
+
export async function createProbeBackgroundResources(
|
|
29
|
+
runtime: RenderSystemInternals,
|
|
30
|
+
format: TextureFormat,
|
|
31
|
+
): Promise<ProbeBackgroundResources | undefined> {
|
|
32
|
+
const code = getIblProbeBackgroundSource();
|
|
33
|
+
if (code === undefined) return undefined;
|
|
34
|
+
const device = runtime.device;
|
|
35
|
+
const descriptor = { code, label: 'reflection-probe-background' };
|
|
36
|
+
const module =
|
|
37
|
+
runtime.createShaderModule === undefined
|
|
38
|
+
? runtime.shaderModuleFactory?.createShaderModule(descriptor)
|
|
39
|
+
: await runtime.createShaderModule(device, descriptor);
|
|
40
|
+
if (module === undefined) return undefined;
|
|
41
|
+
const layout = device
|
|
42
|
+
.createBindGroupLayout({
|
|
43
|
+
entries: [
|
|
44
|
+
{ binding: 0, visibility: 2, texture: { sampleType: 'float', viewDimension: 'cube' } },
|
|
45
|
+
{ binding: 1, visibility: 2, sampler: { type: 'filtering' } },
|
|
46
|
+
{ binding: 2, visibility: 3, buffer: { type: 'uniform', minBindingSize: 80 } },
|
|
47
|
+
],
|
|
48
|
+
})
|
|
49
|
+
.unwrap();
|
|
50
|
+
const pipeline = device
|
|
51
|
+
.createRenderPipeline({
|
|
52
|
+
label: descriptor.label,
|
|
53
|
+
layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }).unwrap(),
|
|
54
|
+
vertex: { module: module.unwrap(), entryPoint: 'probe_background_vs', buffers: [] },
|
|
55
|
+
fragment: {
|
|
56
|
+
module: module.unwrap(),
|
|
57
|
+
entryPoint: 'probe_background_fs',
|
|
58
|
+
targets: [{ format }],
|
|
59
|
+
},
|
|
60
|
+
primitive: { topology: 'triangle-list' },
|
|
61
|
+
depthStencil: {
|
|
62
|
+
format: 'depth24plus-stencil8',
|
|
63
|
+
depthWriteEnabled: false,
|
|
64
|
+
depthCompare: 'less-equal',
|
|
65
|
+
},
|
|
66
|
+
})
|
|
67
|
+
.unwrap();
|
|
68
|
+
const uniform = device
|
|
69
|
+
.createBuffer({ label: descriptor.label, size: 80, usage: 0x40 | 0x08 })
|
|
70
|
+
.unwrap();
|
|
71
|
+
return { pipeline, layout, uniform, groups: new WeakMap() };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Capture the scene's environment in the same raw HDR pass as its geometry. */
|
|
75
|
+
export function recordProbeBackground(
|
|
76
|
+
resources: ProbeBackgroundResources | undefined,
|
|
77
|
+
context: _InternalRenderPipelineContext,
|
|
78
|
+
camera: CameraSnapshot,
|
|
79
|
+
pass: RhiRenderPassEncoder,
|
|
80
|
+
environmentCube?: TextureView,
|
|
81
|
+
): void {
|
|
82
|
+
if (
|
|
83
|
+
environmentCube === undefined &&
|
|
84
|
+
context.skylight === undefined &&
|
|
85
|
+
context.skybox === undefined
|
|
86
|
+
)
|
|
87
|
+
return;
|
|
88
|
+
if (resources === undefined)
|
|
89
|
+
throw new RhiError({
|
|
90
|
+
code: 'shader-compile-failed',
|
|
91
|
+
expected: 'the compiled probe environment background program',
|
|
92
|
+
hint: 'rebuild the Engine shader manifest before enabling ReflectionProbe',
|
|
93
|
+
});
|
|
94
|
+
const { skylightResources } = prepareMaterialSkylight(context);
|
|
95
|
+
const skybox = context.skybox;
|
|
96
|
+
const source = skybox ?? context.skylight;
|
|
97
|
+
const image =
|
|
98
|
+
source === undefined
|
|
99
|
+
? undefined
|
|
100
|
+
: context.store.getCubemapGpuView(toShared<'EquirectAsset'>(source.equirectHandle));
|
|
101
|
+
const view = environmentCube ?? image ?? skylightResources.prefilterView;
|
|
102
|
+
const rotation =
|
|
103
|
+
environmentCube === undefined ? (source?.rotation ?? [0, 0, 0, 1]) : [0, 0, 0, 1];
|
|
104
|
+
const scale =
|
|
105
|
+
environmentCube !== undefined || skybox !== undefined
|
|
106
|
+
? [1, 1, 1]
|
|
107
|
+
: (context.skylight?.color.map((value) => value * (context.skylight?.intensity ?? 0)) ?? [
|
|
108
|
+
0, 0, 0,
|
|
109
|
+
]);
|
|
110
|
+
const pose = camera.world;
|
|
111
|
+
context.runtime.device.queue
|
|
112
|
+
.writeBuffer(
|
|
113
|
+
resources.uniform,
|
|
114
|
+
0,
|
|
115
|
+
new Float32Array([
|
|
116
|
+
pose[0] ?? 1,
|
|
117
|
+
pose[1] ?? 0,
|
|
118
|
+
pose[2] ?? 0,
|
|
119
|
+
0,
|
|
120
|
+
pose[4] ?? 0,
|
|
121
|
+
pose[5] ?? 1,
|
|
122
|
+
pose[6] ?? 0,
|
|
123
|
+
0,
|
|
124
|
+
pose[8] ?? 0,
|
|
125
|
+
pose[9] ?? 0,
|
|
126
|
+
pose[10] ?? 1,
|
|
127
|
+
0,
|
|
128
|
+
...rotation,
|
|
129
|
+
...scale,
|
|
130
|
+
0,
|
|
131
|
+
]),
|
|
132
|
+
)
|
|
133
|
+
.unwrap();
|
|
134
|
+
let group = resources.groups.get(view);
|
|
135
|
+
if (group === undefined) {
|
|
136
|
+
group = context.runtime.device
|
|
137
|
+
.createBindGroup({
|
|
138
|
+
layout: resources.layout,
|
|
139
|
+
entries: [
|
|
140
|
+
{ binding: 0, resource: { kind: 'textureView', value: view } },
|
|
141
|
+
{ binding: 1, resource: { kind: 'sampler', value: skylightResources.prefilterSampler } },
|
|
142
|
+
{ binding: 2, resource: { kind: 'buffer', value: { buffer: resources.uniform } } },
|
|
143
|
+
],
|
|
144
|
+
})
|
|
145
|
+
.unwrap();
|
|
146
|
+
resources.groups.set(view, group);
|
|
147
|
+
}
|
|
148
|
+
pass.setPipeline(resources.pipeline);
|
|
149
|
+
pass.setBindGroup(0, group);
|
|
150
|
+
pass.draw(3);
|
|
151
|
+
}
|
package/src/reflection/filter.ts
CHANGED
|
@@ -63,6 +63,9 @@ export function boxProjectReflectionDirection(
|
|
|
63
63
|
point: readonly [number, number, number],
|
|
64
64
|
): [number, number, number] {
|
|
65
65
|
const ray = normalize(direction);
|
|
66
|
+
for (const axis of [0, 1, 2] as const) {
|
|
67
|
+
if (Math.abs(point[axis] - boxCenter[axis]) >= halfExtents[axis]) return ray;
|
|
68
|
+
}
|
|
66
69
|
let distance = Number.POSITIVE_INFINITY;
|
|
67
70
|
for (let axis = 0; axis < 3; axis += 1) {
|
|
68
71
|
const component = ray[axis] ?? 0;
|
|
@@ -12,6 +12,7 @@ export interface ReflectionProbeInput {
|
|
|
12
12
|
readonly priority: number;
|
|
13
13
|
readonly intensity: number;
|
|
14
14
|
readonly resolution: number;
|
|
15
|
+
readonly boxProjection?: boolean;
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export interface ReflectionProbeFact extends ReflectionProbeInput {
|
|
@@ -88,14 +89,18 @@ export function validateReflectionProbeInput(
|
|
|
88
89
|
},
|
|
89
90
|
};
|
|
90
91
|
}
|
|
91
|
-
if (
|
|
92
|
+
if (
|
|
93
|
+
!Number.isInteger(input.resolution) ||
|
|
94
|
+
input.resolution < 16 ||
|
|
95
|
+
(input.resolution & (input.resolution - 1)) !== 0
|
|
96
|
+
) {
|
|
92
97
|
return {
|
|
93
98
|
ok: false,
|
|
94
99
|
error: {
|
|
95
100
|
code: 'reflection-probe-input-invalid',
|
|
96
101
|
field: 'resolution',
|
|
97
102
|
value: input.resolution,
|
|
98
|
-
expected: 'a
|
|
103
|
+
expected: 'a power of two of at least 16 pixels',
|
|
99
104
|
},
|
|
100
105
|
};
|
|
101
106
|
}
|
|
@@ -108,11 +113,16 @@ export function estimateReflectionProbeBytes(
|
|
|
108
113
|
): number {
|
|
109
114
|
const maxResolution = limits.maxResolution ?? DEFAULT_REFLECTION_PROBE_LIMITS.maxResolution;
|
|
110
115
|
const clamped = Math.min(resolution, maxResolution);
|
|
111
|
-
let
|
|
112
|
-
for (let
|
|
113
|
-
|
|
116
|
+
let filteredTexels = 0;
|
|
117
|
+
for (let mip = 0; mip < 5; mip++) {
|
|
118
|
+
const size = Math.max(1, Math.floor(clamped / 2 ** mip));
|
|
119
|
+
filteredTexels += size * size;
|
|
114
120
|
}
|
|
115
|
-
|
|
121
|
+
// Raw cube + two alternating filtered cubes + their depth attachments.
|
|
122
|
+
return (
|
|
123
|
+
(clamped * clamped + 2 * filteredTexels) * 6 * REFLECTION_PROBE_BYTES_PER_TEXEL +
|
|
124
|
+
3 * clamped * clamped * 4
|
|
125
|
+
);
|
|
116
126
|
}
|
|
117
127
|
|
|
118
128
|
export function admitReflectionProbe(
|