@zephyr3d/scene 0.9.26 → 0.9.27
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/dist/animation/animationset.js +92 -30
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/joint_dynamics/convex_collider.js +320 -0
- package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
- package/dist/animation/skeleton.js +21 -1
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/asset/model.js +6 -2
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/camera.js +75 -23
- package/dist/camera/camera.js.map +1 -1
- package/dist/index.d.ts +4764 -3600
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/material/hairstrand.js +235 -235
- package/dist/material/hairstrand.js.map +1 -1
- package/dist/material/material.js +296 -296
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lit.js +33 -1
- package/dist/material/mixins/lit.js.map +1 -1
- package/dist/material/shader/helper.js +404 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/water.js +2057 -72
- package/dist/material/water.js.map +1 -1
- package/dist/posteffect/motionblur.js +663 -58
- package/dist/posteffect/motionblur.js.map +1 -1
- package/dist/posteffect/posteffect.js +12 -1
- package/dist/posteffect/posteffect.js.map +1 -1
- package/dist/posteffect/sao.js +46 -44
- package/dist/posteffect/sao.js.map +1 -1
- package/dist/posteffect/sss.js +30 -2
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/render/abuffer_oit.js +37 -37
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/clipmap.js +156 -5
- package/dist/render/clipmap.js.map +1 -1
- package/dist/render/cull_visitor.js +1 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/dualdepthpeeling_oit.js +49 -49
- package/dist/render/dualdepthpeeling_oit.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +3 -3
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/fft_wavegenerator.js +57 -15
- package/dist/render/fft_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +127 -20
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/hzb.js +80 -22
- package/dist/render/hzb.js.map +1 -1
- package/dist/render/lightpass.js +6 -3
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/oit.js +11 -11
- package/dist/render/oit.js.map +1 -1
- package/dist/render/render_queue.js +36 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/renderer.js +4 -0
- package/dist/render/renderer.js.map +1 -1
- package/dist/render/rendergraph/blackboard.js +1 -0
- package/dist/render/rendergraph/blackboard.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +318 -9
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
- package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
- package/dist/render/rendergraph/history_resources.js +8 -1
- package/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/render/underwater.js +624 -0
- package/dist/render/underwater.js.map +1 -0
- package/dist/render/water_caustics.js +1380 -0
- package/dist/render/water_caustics.js.map +1 -0
- package/dist/render/weightedblended_oit.js +33 -33
- package/dist/render/weightedblended_oit.js.map +1 -1
- package/dist/scene/water.js +540 -4
- package/dist/scene/water.js.map +1 -1
- package/dist/shaders/water.js +22 -19
- package/dist/shaders/water.js.map +1 -1
- package/dist/shaders/water_medium.js +56 -0
- package/dist/shaders/water_medium.js.map +1 -0
- package/dist/shadow/shadow_region.js +49 -49
- package/dist/shadow/shadow_region.js.map +1 -1
- package/dist/utility/serialization/manager.js +3 -1
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +31 -2
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +53 -25
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/water.js +1101 -21
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/shprojector.js +87 -87
- package/dist/utility/shprojector.js.map +1 -1
- package/package.json +1 -1
- package/dist/render/rendergraph/frame_graph_context.js +0 -41
- package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
- package/dist/shaders/ssgi.js +0 -63
- package/dist/shaders/ssgi.js.map +0 -1
- package/dist/shaders/ssgi_reprojection.js +0 -118
- package/dist/shaders/ssgi_reprojection.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forward_plus_builder.js","sources":["../../../src/render/rendergraph/forward_plus_builder.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, DEPTH_COMPARE_DEFAULT, REVERSE_Z, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n ColorState,\r\n FrameBuffer,\r\n GPUProgram,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from '../drawable';\r\nimport {\r\n RenderQueue,\r\n type RenderItemList,\r\n type RenderItemListInfo,\r\n type RenderQueueItem\r\n} from '../render_queue';\r\nimport type { PunctualLight, Scene } from '../../scene';\r\nimport type { Camera } from '../../camera';\r\nimport { LightPass } from '../lightpass';\r\nimport { ShadowMapPass } from '../shadowmap_pass';\r\nimport { DepthPass } from '../depthpass';\r\nimport { ClusteredLight } from '../cluster_light';\r\nimport { ShadowMaskRenderer } from '../shadow_mask_pass';\r\nimport { buildHiZ } from '../hzb';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { MaterialVaryingFlags } from '../../values';\r\nimport { ShaderHelper } from '../../material/shader/helper';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect';\r\nimport { RenderGraph } from './rendergraph';\r\nimport { RenderGraphExecutor } from './executor';\r\nimport { RGTextureAffinityCache } from './texture_affinity_cache';\r\nimport { DevicePoolAllocator } from './device_pool_allocator';\r\nimport { HistoryResourceManager } from './history_resource_manager';\r\nimport { RGHistoryResources } from './history_resources';\r\nimport { RGBlackboard, FrameResources, type FrameResourceKey } from './blackboard';\r\nimport { OrderingScope } from './render_context';\r\nimport type { FrameGraphContext } from './frame_graph_context';\r\nimport type { RenderModule } from './render_module';\r\nimport { RenderPipeline } from './render_pipeline';\r\nimport type { FrameResourceRequirements } from './frame_resource_requirements';\r\nimport { mergeFrameResourceRequirements } from './frame_resource_requirements';\r\nimport type { RGExecuteContext, RGHandle, RGTextureAttachment, RGTextureHandle } from './types';\r\nimport { renderObjectColors } from '../gpu_picking';\r\nimport type { Primitive } from '../primitive';\r\nimport { BoxShape } from '../../shapes';\r\n\r\nconst _scenePass = new LightPass();\r\nconst _depthPass = new DepthPass();\r\nconst _shadowMapPass = new ShadowMapPass();\r\nconst _clusters: ClusteredLight[] = [];\r\nconst _shadowMaskRenderer = new ShadowMaskRenderer();\r\nconst _devicePoolAllocator = new DevicePoolAllocator();\r\nconst _textureAffinityCaches = new WeakMap<\r\n Camera,\r\n { device: AbstractDevice; cache: RGTextureAffinityCache<Texture2D> }\r\n>();\r\n\r\nfunction getTextureAffinityCache(camera: Camera, device: AbstractDevice): RGTextureAffinityCache<Texture2D> {\r\n const current = _textureAffinityCaches.get(camera);\r\n if (current?.device === device) {\r\n return current.cache;\r\n }\r\n const cache = new RGTextureAffinityCache<Texture2D>();\r\n _textureAffinityCaches.set(camera, { device, cache });\r\n return cache;\r\n}\r\n\r\n/** Test-only access to the shared scene pass. @internal */\r\nexport function _getScenePassForTest(): LightPass {\r\n return _scenePass;\r\n}\r\n\r\nlet _backDepthColorState: Nullable<ColorState> = null;\r\nlet _frontDepthColorState: Nullable<ColorState> = null;\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\nfunction getClusteredLight(): ClusteredLight {\r\n return _clusters.length > 0 ? _clusters.pop()! : new ClusteredLight();\r\n}\r\nfunction freeClusteredLight(cl: ClusteredLight): void {\r\n _clusters.push(cl);\r\n}\r\n\r\nfunction getCoreMaterial(material: unknown): unknown {\r\n return (material as { coreMaterial?: unknown } | null | undefined)?.coreMaterial ?? material ?? null;\r\n}\r\n\r\nfunction hasSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { subsurfaceProfile?: unknown } | null)?.subsurfaceProfile;\r\n}\r\n\r\nfunction hasSkinSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { skinSSS?: unknown } | null)?.skinSSS;\r\n}\r\n\r\nfunction renderQueueHasActiveSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction renderQueueHasActiveSkinSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSkinSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction filterActualSSSItemList(items: RenderQueueItem[]): RenderQueueItem[] {\r\n return items.filter((item) => hasSSSMaterialCore(item.drawable.getMaterial?.()));\r\n}\r\n\r\nfunction filterActualSSSMaterialList(materialList: Set<any>): Set<any> {\r\n const filtered = new Set<any>();\r\n materialList.forEach((mat) => {\r\n if (hasSSSMaterialCore(mat)) {\r\n filtered.add(mat);\r\n }\r\n });\r\n return filtered;\r\n}\r\n\r\nfunction cloneActualSSSListInfo(source: RenderItemListInfo, _targetQueue: RenderQueue): RenderItemListInfo {\r\n return {\r\n itemList: filterActualSSSItemList(source.itemList),\r\n skinItemList: filterActualSSSItemList(source.skinItemList),\r\n morphItemList: filterActualSSSItemList(source.morphItemList),\r\n skinAndMorphItemList: filterActualSSSItemList(source.skinAndMorphItemList),\r\n instanceItemList: filterActualSSSItemList(source.instanceItemList),\r\n materialList: filterActualSSSMaterialList(source.materialList),\r\n instanceList: {},\r\n renderQueue: source.renderQueue\r\n };\r\n}\r\n\r\nfunction cloneActualSSSBundle(\r\n source: RenderItemList['opaque'],\r\n targetQueue: RenderQueue\r\n): RenderItemList['opaque'] {\r\n return {\r\n lit: source.lit.map((info) => cloneActualSSSListInfo(info, targetQueue)),\r\n unlit: source.unlit.map((info) => cloneActualSSSListInfo(info, targetQueue))\r\n };\r\n}\r\n\r\nfunction hasAnyActualSSSItems(renderItems: RenderItemListInfo[]): boolean {\r\n return renderItems.some(\r\n (info) =>\r\n info.itemList.length > 0 ||\r\n info.skinItemList.length > 0 ||\r\n info.morphItemList.length > 0 ||\r\n info.skinAndMorphItemList.length > 0 ||\r\n info.instanceItemList.length > 0\r\n );\r\n}\r\n\r\nfunction createActualSSSRenderQueue(renderQueue: RenderQueue): RenderQueue | null {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return null;\r\n }\r\n const queue = new RenderQueue(_scenePass);\r\n const sssOpaque = cloneActualSSSBundle(itemList.opaque, queue);\r\n if (!hasAnyActualSSSItems([...sssOpaque.lit, ...sssOpaque.unlit])) {\r\n queue.dispose();\r\n return null;\r\n }\r\n const emptyBundle = { lit: [], unlit: [] };\r\n const target = queue as unknown as {\r\n _itemList: RenderItemList;\r\n _shadowedLightList: PunctualLight[];\r\n _unshadowedLightList: PunctualLight[];\r\n _sunLight: typeof renderQueue.sunLight;\r\n _primaryDirectionalLight: typeof renderQueue.primaryDirectionalLight;\r\n _primaryTransmissionLight: typeof renderQueue.primaryTransmissionLight;\r\n _needSceneColor: boolean;\r\n _needSceneDepth: boolean;\r\n _needSceneColorWithDepth: boolean;\r\n _drawTransparent: boolean;\r\n };\r\n target._itemList = {\r\n opaque: sssOpaque,\r\n transmission: emptyBundle,\r\n transparent: emptyBundle,\r\n transmission_trans: emptyBundle\r\n };\r\n target._shadowedLightList = renderQueue.shadowedLights;\r\n target._unshadowedLightList = renderQueue.unshadowedLights;\r\n target._sunLight = renderQueue.sunLight;\r\n target._primaryDirectionalLight = renderQueue.primaryDirectionalLight;\r\n target._primaryTransmissionLight = renderQueue.primaryTransmissionLight;\r\n target._needSceneColor = false;\r\n target._needSceneDepth = false;\r\n target._needSceneColorWithDepth = false;\r\n target._drawTransparent = false;\r\n return queue;\r\n}\r\n\r\nfunction getSurfaceTextureFormat(ctx: DrawContext): TextureFormat {\r\n const caps = ctx.device.getDeviceCaps?.();\r\n return caps?.textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n}\r\n\r\nfunction getTextureFormatBytes(ctx: DrawContext, format: TextureFormat): number {\r\n return ctx.device.getDeviceCaps().textureCaps.getTextureFormatInfo(format).size;\r\n}\r\n\r\nfunction supportsSSGIRenderTargets(ctx: DrawContext): boolean {\r\n const caps = ctx.device.getDeviceCaps();\r\n const rgba16fBytes = caps.textureCaps.getTextureFormatInfo('rgba16f').size;\r\n return !!(\r\n caps.textureCaps.supportHalfFloatColorBuffer &&\r\n caps.framebufferCaps.maxDrawBuffers >= 2 &&\r\n caps.framebufferCaps.maxColorAttachmentBytesPerSample >= rgba16fBytes * 2\r\n );\r\n}\r\n\r\nfunction shouldStoreSSSDiffuse(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssBlurScale > 0;\r\n}\r\n\r\nfunction shouldStoreSSSTransmission(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssTransmissionStrength > 0;\r\n}\r\n\r\nfunction getSSSLightingTextureFormat(\r\n ctx: DrawContext,\r\n attachmentCount: number,\r\n surfaceAttachmentCount: number\r\n): TextureFormat {\r\n const colorFormat = ctx.colorFormat!;\r\n if (surfaceAttachmentCount === 0 || attachmentCount === 0) {\r\n return colorFormat;\r\n }\r\n const caps = ctx.device.getDeviceCaps();\r\n // MRT graph textures are not resolved on DrawContext yet.\r\n const surfaceFormat = getSurfaceTextureFormat(ctx);\r\n const colorBytes =\r\n getTextureFormatBytes(ctx, colorFormat) +\r\n getTextureFormatBytes(ctx, surfaceFormat) * surfaceAttachmentCount;\r\n const fullPrecisionBytes = colorBytes + getTextureFormatBytes(ctx, colorFormat) * attachmentCount;\r\n if (fullPrecisionBytes <= caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n return colorFormat;\r\n }\r\n return 'rgba8unorm';\r\n}\r\n\r\nfunction getFullMipLevelCount(width: number, height: number): number {\r\n return Math.max(1, Math.floor(Math.log2(Math.max(1, width, height))) + 1);\r\n}\r\n\r\nfunction hasSurfaceMRT(ctx: DrawContext): boolean {\r\n return !!(ctx.materialFlags & SURFACE_MRT_FLAGS);\r\n}\r\n\r\nfunction getLightPassColorAttachments(\r\n ctx: DrawContext,\r\n colorAttachment: TextureFormat | Texture2D\r\n): TextureFormat | Texture2D | Array<TextureFormat | Texture2D> {\r\n const attachments: Array<TextureFormat | Texture2D> = [colorAttachment];\r\n if (ctx.materialFlags & MaterialVaryingFlags.SCENE_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SceneRoughnessTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SCENE_STORE_NORMAL) {\r\n attachments.push(ctx.SceneNormalTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {\r\n attachments.push(ctx.SSSProfileTexture!, ctx.SSSParamTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n}\r\n\r\n/** Per-frame Forward+ feature options. @public */\r\nexport interface ForwardPlusOptions {\r\n /** Enable depth prepass (always true for now). */\r\n depthPrepass: boolean;\r\n /** Enable motion vectors (requires TAA or motionBlur). */\r\n motionVectors: boolean;\r\n /** Enable Hi-Z pyramid (for SSR ray tracing). */\r\n hiZ: boolean;\r\n /** Produce opaque-scene world normals. */\r\n sceneNormal: boolean;\r\n /** Produce opaque-scene roughness data. */\r\n sceneRoughness: boolean;\r\n /** Produce and consume the clustered screen-space shadow mask. */\r\n shadowMask: boolean;\r\n /** Enable screen-space reflections. */\r\n ssr: boolean;\r\n /** Enable screen-space diffuse global illumination. */\r\n ssgi: boolean;\r\n /** Whether to compute SSR thickness. */\r\n ssrCalcThickness: boolean;\r\n /** Whether GPU picking is requested this frame. */\r\n gpuPicking: boolean;\r\n /** Whether transmission/refraction materials are present. */\r\n needSceneColor: boolean;\r\n /** Whether scene-color-dependent materials also require scene depth. */\r\n needSceneColorWithDepth: boolean;\r\n /** Whether SSR needs transmission depth before the main light pass. */\r\n needsTransmissionDepthForSSR: boolean;\r\n /** Enable screen-space subsurface scattering. */\r\n sss: boolean;\r\n /** Enable the stylized skin-specific SSS pass. */\r\n skinSSS: boolean;\r\n /** Whether height fog is composited over the opaque scene this frame. */\r\n fogPresents: boolean;\r\n}\r\n\r\n/** Derive Forward+ options from scene and camera state. @internal */\r\nexport function deriveForwardPlusOptions(\r\n scene: Scene,\r\n camera: Camera,\r\n deviceType: string,\r\n renderQueue: RenderQueue\r\n): ForwardPlusOptions {\r\n const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ssgi =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);\r\n const skinSSS = camera.skinSSS && renderQueueHasActiveSkinSSS(renderQueue);\r\n const needSceneColor = renderQueue.needSceneColor();\r\n const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();\r\n return {\r\n depthPrepass: true,\r\n motionVectors: false,\r\n hiZ: false,\r\n sceneNormal: false,\r\n sceneRoughness: false,\r\n shadowMask: false,\r\n ssr: !!ssr,\r\n ssgi: !!ssgi,\r\n ssrCalcThickness: !!ssr && camera.ssrCalcThickness,\r\n gpuPicking: !!camera.getPickResultResolveFunc(),\r\n needSceneColor,\r\n needSceneColorWithDepth,\r\n needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,\r\n sss: !!sss,\r\n skinSSS: !!skinSSS,\r\n fogPresents: !!scene.env.sky?.fogPresents\r\n };\r\n}\r\n\r\nfunction resolveFrameResourceRequirements(\r\n ctx: DrawContext,\r\n options: ForwardPlusOptions,\r\n requirements: FrameResourceRequirements\r\n): void {\r\n const deviceType = ctx.device.type;\r\n options.motionVectors ||= !!requirements.motionVector;\r\n options.hiZ ||= !!requirements.hiZ;\r\n options.sceneNormal ||= !!requirements.sceneNormal;\r\n options.sceneRoughness ||= !!requirements.sceneRoughness;\r\n options.shadowMask ||= !!requirements.shadowMask;\r\n\r\n if (options.motionVectors && deviceType === 'webgl') {\r\n throw new Error('Forward+: MotionVector was requested but is not supported by the WebGL backend.');\r\n }\r\n if (options.hiZ && deviceType === 'webgl') {\r\n throw new Error('Forward+: HiZ was requested but is not supported by the WebGL backend.');\r\n }\r\n if (options.shadowMask && deviceType === 'webgl') {\r\n throw new Error('Forward+: ShadowMask was requested but is not supported by the WebGL backend.');\r\n }\r\n\r\n const surfaceAttachmentCount = Number(options.sceneNormal) + Number(options.sceneRoughness);\r\n if (surfaceAttachmentCount > 0) {\r\n const caps = ctx.device.getDeviceCaps();\r\n const maxDrawBuffers = caps.framebufferCaps.maxDrawBuffers ?? Number.MAX_SAFE_INTEGER;\r\n if (1 + surfaceAttachmentCount > maxDrawBuffers) {\r\n throw new Error(\r\n `Forward+: ${surfaceAttachmentCount} scene surface attachment(s) were requested, ` +\r\n `but the device supports only ${maxDrawBuffers} color attachments.`\r\n );\r\n }\r\n const bytesPerSample =\r\n getTextureFormatBytes(ctx, ctx.colorFormat) +\r\n getTextureFormatBytes(ctx, getSurfaceTextureFormat(ctx)) * surfaceAttachmentCount;\r\n if (bytesPerSample > caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n throw new Error(\r\n `Forward+: requested scene surface attachments require ${bytesPerSample} bytes per sample, ` +\r\n `but the device limit is ${caps.framebufferCaps.maxColorAttachmentBytesPerSample}.`\r\n );\r\n }\r\n }\r\n\r\n ctx.motionVectors = options.motionVectors;\r\n ctx.HiZ = options.hiZ;\r\n ctx.SSGI = options.ssgi;\r\n ctx.screenSpaceShadowMask = options.shadowMask;\r\n ctx.SSS = options.sss;\r\n}\r\n\r\nfunction validateProducedFrameResources(\r\n blackboard: RGBlackboard,\r\n options: ForwardPlusOptions,\r\n renderQueue: RenderQueue\r\n): void {\r\n const required: Array<[boolean, FrameResourceKey]> = [\r\n [options.motionVectors, FrameResources.MotionVector],\r\n [options.hiZ, FrameResources.HiZ],\r\n [options.sceneNormal, FrameResources.SceneNormal],\r\n [options.sceneRoughness, FrameResources.SceneRoughness],\r\n [options.shadowMask && renderQueue.shadowedLights.length > 0, FrameResources.ShadowMask]\r\n ];\r\n for (const [needed, resource] of required) {\r\n if (needed && !blackboard.has(resource)) {\r\n throw new Error(\r\n `Forward+: frame resource \"${resource}\" was requested but no enabled RenderModule produced it.`\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Mutable state shared by pass callbacks for one frame. @public */\r\nexport interface FrameState {\r\n ctx: DrawContext;\r\n renderQueue: RenderQueue;\r\n depthFramebuffer: Nullable<FrameBuffer>;\r\n sunLightColor: Nullable<any>;\r\n options: ForwardPlusOptions;\r\n renderQueueDisposed: boolean;\r\n clusteredLightReleased: boolean;\r\n sunLightRestored: boolean;\r\n}\r\n\r\ninterface ForwardPlusGraphBuildResult {\r\n backbuffer: RGHandle;\r\n frame: FrameState;\r\n externalDepthImport?: { handle: RGHandle; texture: Texture2D };\r\n}\r\n\r\ninterface HistoryReadBinding {\r\n name: string;\r\n handle: RGHandle;\r\n}\r\n\r\n/** Result of the depth prepass module. @public */\r\nexport interface DepthPrepassResult {\r\n depthHandle: RGHandle;\r\n motionVectorHandle?: RGHandle;\r\n graphDepthAttachmentHandle?: RGHandle;\r\n externalDepthAttachmentHandle?: RGHandle;\r\n externalDepthAttachment: Nullable<Texture2D>;\r\n depthFramebufferHandle: RGHandle;\r\n}\r\n\r\n/** Result of the main light pass module. @public */\r\nexport interface LightPassResult {\r\n sceneColorHandle: RGHandle;\r\n sceneColorFramebufferHandle?: RGHandle;\r\n sceneRoughnessHandle?: RGHandle;\r\n sceneNormalHandle?: RGHandle;\r\n sssDiffuseHandle?: RGHandle;\r\n sssTransmissionHandle?: RGHandle;\r\n skinSSSHandle?: RGHandle;\r\n}\r\n\r\n/** Non-resource state shared while Forward+ modules build. @public */\r\nexport interface ForwardPlusBuildState {\r\n /** Depth prepass outputs. */\r\n depth?: DepthPrepassResult;\r\n /** Depth attachment used by scene-color/SSS framebuffers (handle or backend texture). */\r\n renderDepthAttachment: Nullable<RGTextureAttachment>;\r\n /** True when the scene renders directly into the final framebuffer. */\r\n useFinalFramebufferAsIntermediate: boolean;\r\n /** Ordering token from the pre-light transmission-depth pass, if any. */\r\n preLightTransmissionDepthToken?: RGHandle;\r\n /** History textures kept in a read scope while the light pass executes. */\r\n lightHistoryReadBindings: HistoryReadBinding[];\r\n /** Main light pass outputs. */\r\n lightPass?: LightPassResult;\r\n /** Graph output handle produced by the composite tail. */\r\n presentedBackbuffer?: RGHandle;\r\n}\r\n\r\n/** Require state produced by an earlier module. @internal */\r\nfunction requireBuildState<K extends keyof ForwardPlusBuildState>(\r\n fg: FrameGraphContext,\r\n key: K,\r\n producerType: string,\r\n consumerType: string\r\n): NonNullable<ForwardPlusBuildState[K]> {\r\n const value = fg.state[key];\r\n if (!value) {\r\n throw new Error(\r\n `Forward+ module \"${consumerType}\" requires module \"${producerType}\" ` +\r\n `(build state \"${String(key)}\" was not produced). Did you remove it from the pipeline?`\r\n );\r\n }\r\n return value;\r\n}\r\n\r\n/** @internal */\r\nconst SkyUpdateModule: RenderModule<FrameGraphContext> = {\r\n type: 'SkyUpdate',\r\n prepare: () => ({ enabled: true }),\r\n setup({ graph, ctx, frame, ordering }: FrameGraphContext) {\r\n graph.addPass('SkyUpdate', (builder) => {\r\n ordering.emit(builder, 'SkyUpdateDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n frame.sunLightColor = ctx.scene.env.sky.update(ctx);\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ClusterLightsModule: RenderModule<FrameGraphContext> = {\r\n type: 'ClusterLights',\r\n prepare: () => ({ enabled: true }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('ClusterLights', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'ClusterLightsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n ctx.clusteredLight = getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(\r\n ctx.camera,\r\n renderQueue,\r\n ctx.screenSpaceShadowMask,\r\n ShaderHelper.getPreExposure(ctx)\r\n );\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst GPUPickingModule: RenderModule<FrameGraphContext> = {\r\n type: 'GPUPicking',\r\n prepare: ({ options }) => ({ enabled: options.gpuPicking }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('GPUPicking', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'GPUPickingDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ShadowMapsModule: RenderModule<FrameGraphContext> = {\r\n type: 'ShadowMaps',\r\n // Light-owned shadow maps are observable side effects.\r\n prepare: ({ renderQueue }) => ({ enabled: renderQueue.shadowedLights.length > 0 }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('ShadowMaps', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'ShadowMapsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst DepthPrepassModule: RenderModule<FrameGraphContext> = {\r\n type: 'DepthPrepass',\r\n writes: [FrameResources.LinearDepth, FrameResources.MotionVector, FrameResources.SceneDepthAttachment],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, ordering, blackboard, options } = fg;\r\n const result = graph.addPass('DepthPrepass', (builder) => {\r\n ordering.chainInto(builder);\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n\r\n const depthHandle = builder.createTexture({\r\n format,\r\n label: 'linearDepth',\r\n allocationKey: 'ForwardPlus.LinearDepth'\r\n });\r\n const motionVectorHandle = options.motionVectors\r\n ? builder.createTexture({\r\n format: mvFormat,\r\n label: 'motionVector',\r\n allocationKey: 'ForwardPlus.MotionVector'\r\n })\r\n : undefined;\r\n const finalDepthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const externalDepthAttachment = finalDepthAttachment?.isTexture2D()\r\n ? (finalDepthAttachment as Texture2D)\r\n : null;\r\n const externalDepthAttachmentHandle = externalDepthAttachment\r\n ? graph.importTexture('externalSceneDepth')\r\n : undefined;\r\n const graphDepthAttachmentHandle = externalDepthAttachment\r\n ? undefined\r\n : builder.createTexture({\r\n format: ctx.depthFormat,\r\n label: 'sceneDepth',\r\n allocationKey: 'ForwardPlus.SceneDepth'\r\n });\r\n const depthAttachmentOrFormat =\r\n externalDepthAttachmentHandle ?? graphDepthAttachmentHandle ?? ctx.depthFormat;\r\n const depthFramebufferHandle = builder.createFramebuffer({\r\n label: 'DepthPrepassFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle ? [depthHandle, motionVectorHandle] : depthHandle,\r\n depthAttachment: depthAttachmentOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n const skyMotionVectorFramebufferHandle = motionVectorHandle\r\n ? builder.createFramebuffer({\r\n label: 'SkyMotionVectorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle,\r\n depthAttachment: depthAttachmentOrFormat\r\n })\r\n : undefined;\r\n\r\n builder.addSubpass('SceneDepth', (rgCtx) => {\r\n const depthFramebuffer = rgCtx.getFramebuffer(depthFramebufferHandle);\r\n frame.depthFramebuffer = renderSceneDepth(\r\n frame,\r\n depthFramebuffer,\r\n rgCtx,\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n });\r\n if (skyMotionVectorFramebufferHandle) {\r\n builder.addSubpass('SkyMotionVectors', (rgCtx) => {\r\n renderSkyMotionVectors(ctx, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n // After the sky, which writes at the far plane: a blended surface in\r\n // front of empty background has to replace what the sky put there.\r\n builder.addSubpass('TransparentMotionVectors', (rgCtx) => {\r\n renderTransparentMotionVectors(frame, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n }\r\n\r\n return {\r\n depthHandle,\r\n motionVectorHandle,\r\n graphDepthAttachmentHandle,\r\n externalDepthAttachmentHandle,\r\n externalDepthAttachment,\r\n depthFramebufferHandle\r\n };\r\n });\r\n\r\n fg.state.depth = result;\r\n // Depth mutations re-register their versions through the blackboard.\r\n blackboard.set(FrameResources.LinearDepth, result.depthHandle);\r\n if (result.motionVectorHandle) {\r\n blackboard.set(FrameResources.MotionVector, result.motionVectorHandle);\r\n }\r\n blackboard.set(\r\n FrameResources.SceneDepthAttachment,\r\n result.graphDepthAttachmentHandle ?? result.externalDepthAttachmentHandle!\r\n );\r\n // Later modules share this attachment without owning it.\r\n fg.state.renderDepthAttachment =\r\n result.graphDepthAttachmentHandle ?? result.externalDepthAttachmentHandle ?? null;\r\n // Opaque effects require a texture and may require surface MRT attachments.\r\n const opaqueLayerHasEffects = !!ctx.compositor?.layerHasEnabledEffect(PostEffectLayer.opaque);\r\n fg.state.useFinalFramebufferAsIntermediate =\r\n !!result.externalDepthAttachment &&\r\n result.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment() &&\r\n !opaqueLayerHasEffects;\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ShadowMaskModule: RenderModule<FrameGraphContext> = {\r\n type: 'ShadowMaskPass',\r\n writes: [FrameResources.ShadowMask],\r\n // shadowMapInfo is populated at execute time and cannot gate graph building.\r\n prepare: ({ ctx, options, renderQueue }) => ({\r\n enabled: options.shadowMask && renderQueue.shadowedLights.length > 0,\r\n requirements: {\r\n shadowMask:\r\n ctx.device.type !== 'webgl' &&\r\n ctx.camera.screenSpaceShadowMask &&\r\n renderQueue.shadowedLights.length > 0\r\n }\r\n }),\r\n setup(fg: FrameGraphContext) {\r\n // Four shadow lights share each RGBA8 layer in clustered-light order.\r\n const { graph, ctx, renderQueue, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'ShadowMaskPass');\r\n const numShadowLights = renderQueue.shadowedLights.length;\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numShadowLights);\r\n const maskPassResult = graph.addPass('ShadowMaskPass', (builder) => {\r\n // Capture the depth version declared at this pipeline position.\r\n const maskDepthHandle = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(maskDepthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // Per-layer framebuffers are temporary views of this graph texture.\r\n const maskHandle = builder.createTexture({\r\n format: 'rgba8unorm',\r\n label: 'shadowMask',\r\n arrayLayers: numLayers,\r\n allocationKey: 'ForwardPlus.ShadowMask'\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const depthTex = rgCtx.getTexture<Texture2D>(maskDepthHandle);\r\n const maskTex = rgCtx.getTexture<Texture2DArray>(maskHandle);\r\n _shadowMaskRenderer.render(ctx, depthTex, renderQueue.shadowedLights, (layer) =>\r\n rgCtx.createFramebuffer({\r\n width: maskTex.width,\r\n height: maskTex.height,\r\n colorAttachments: maskTex,\r\n depthAttachment: null,\r\n attachmentLayer: layer\r\n })\r\n );\r\n });\r\n return { maskHandle };\r\n });\r\n blackboard.set(FrameResources.ShadowMask, maskPassResult.maskHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst TransmissionDepthForSSRModule: RenderModule<FrameGraphContext> = {\r\n type: 'TransmissionDepthForSSR',\r\n writes: [FrameResources.LinearDepth],\r\n prepare: ({ options }) => ({ enabled: options.needsTransmissionDepthForSSR }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'TransmissionDepthForSSR');\r\n const transmissionDepthResult = graph.addPass('TransmissionDepthForSSR', (builder) => {\r\n const currentDepth = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(currentDepth);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // Version the in-place depth mutation for downstream dependencies.\r\n const depthOut = builder.write(currentDepth);\r\n const done = builder.createToken('TransmissionDepthForSSRDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return { done, depthOut };\r\n });\r\n fg.state.preLightTransmissionDepthToken = transmissionDepthResult.done;\r\n // Publish the post-transmission depth version.\r\n blackboard.set(FrameResources.LinearDepth, transmissionDepthResult.depthOut);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst HiZModule: RenderModule<FrameGraphContext> = {\r\n type: 'HiZ',\r\n writes: [FrameResources.HiZ],\r\n prepare: ({ options }) => ({ enabled: options.hiZ }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'HiZ');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n //const hiZWidth = nextPowerOf2(ctx.renderWidth);\r\n //const hiZHeight = nextPowerOf2(ctx.renderHeight);\r\n let hiZHandle: RGTextureHandle | undefined;\r\n graph.addPass('HiZ', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n hiZHandle = builder.createTexture({\r\n format: REVERSE_Z ? 'r16f' : 'r32f',\r\n label: 'hiZ',\r\n sizeMode: 'backbuffer-relative',\r\n mipLevels: getFullMipLevelCount(ctx.renderWidth, ctx.renderHeight),\r\n allocationKey: 'ForwardPlus.HiZ'\r\n });\r\n const hiZFramebufferHandle = builder.createFramebuffer({\r\n label: 'HiZFramebuffer',\r\n colorAttachments: hiZHandle,\r\n depthAttachment: null\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const passCtx = frame.ctx;\r\n // Resolve the declared handle, not mutable framebuffer state.\r\n const depthFb = rgCtx.getFramebuffer(depthPassResult.depthFramebufferHandle);\r\n const depthTex = depthFb.getDepthAttachment() as Texture2D;\r\n if (!depthTex) {\r\n throw new Error('HiZ pass: depth prepass framebuffer has no depth attachment.');\r\n }\r\n const hiZTex = rgCtx.getTexture<Texture2D>(hiZHandle!);\r\n const HiZFrameBuffer = rgCtx.getFramebuffer(hiZFramebufferHandle);\r\n buildHiZ(depthTex, HiZFrameBuffer);\r\n passCtx.HiZTexture = hiZTex;\r\n });\r\n });\r\n if (hiZHandle) {\r\n blackboard.set(FrameResources.HiZ, hiZHandle);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SSSProfileModule: RenderModule<FrameGraphContext> = {\r\n type: 'SSSProfile',\r\n prepare: ({ options }) => ({ enabled: options.sss }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SSSProfile');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const sssProfileResult = graph.addPass('SSSProfile', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const profileHandle = builder.createTexture({\r\n format: 'rgba16f',\r\n label: 'sssProfile',\r\n allocationKey: 'ForwardPlus.SSSProfile'\r\n });\r\n const paramHandle = builder.createTexture({\r\n format: 'rgba8unorm',\r\n label: 'sssParam',\r\n allocationKey: 'ForwardPlus.SSSParam'\r\n });\r\n const colorAttachments = [ctx.colorFormat!, profileHandle, paramHandle];\r\n const framebufferHandle = builder.createFramebuffer({\r\n label: 'SSSProfileFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderForwardSSSProfile(\r\n frame,\r\n rgCtx.getFramebuffer(framebufferHandle),\r\n rgCtx.getTexture<Texture2D>(profileHandle),\r\n rgCtx.getTexture<Texture2D>(paramHandle),\r\n null\r\n );\r\n });\r\n\r\n return {\r\n profileHandle,\r\n paramHandle,\r\n framebufferHandle\r\n };\r\n });\r\n blackboard.set(FrameResources.SSSProfile, sssProfileResult.profileHandle);\r\n blackboard.set(FrameResources.SSSParam, sssProfileResult.paramHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SceneColorGrabModule: RenderModule<FrameGraphContext> = {\r\n type: 'SceneColorGrab',\r\n prepare: ({ options }) => ({ enabled: options.needSceneColor }),\r\n setup(fg: FrameGraphContext) {\r\n // Refraction samples this non-transmission scene copy.\r\n const { graph, ctx, frame, blackboard, options } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SceneColorGrab');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const grabResult = graph.addPass('SceneColorGrab', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n const copyHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorCopy',\r\n allocationKey: 'ForwardPlus.SceneColorCopy'\r\n });\r\n // Isolate depth when SSR inserts transmission depth before LightPass.\r\n const copyFramebufferHandle = !options.needsTransmissionDepthForSSR\r\n ? builder.createFramebuffer({\r\n label: 'SceneColorCopyFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: copyHandle,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n })\r\n : undefined;\r\n builder.setExecute((rgCtx) => {\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderSceneColorGrab(frame, rgCtx, copyHandle, copyFramebufferHandle);\r\n });\r\n return { copyHandle, copyFramebufferHandle };\r\n });\r\n blackboard.set(FrameResources.SceneColorCopy, grabResult.copyHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst LightPassModule: RenderModule<FrameGraphContext> = {\r\n type: 'LightPass',\r\n writes: [\r\n FrameResources.SceneColor,\r\n FrameResources.SceneRoughness,\r\n FrameResources.SceneNormal,\r\n FrameResources.SSSDiffuse,\r\n FrameResources.SSSTransmission,\r\n FrameResources.SkinSSS\r\n ],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options, backbuffer } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'LightPass');\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n const sssProfileHandle = blackboard.get(FrameResources.SSSProfile);\r\n const sssParamHandle = blackboard.get(FrameResources.SSSParam);\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const useFinalFramebufferAsIntermediate = fg.state.useFinalFramebufferAsIntermediate;\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const historyManager = fg.history;\r\n\r\n // Keep SSR history scoped while the light pass executes.\r\n const lightHistoryReadBindings = fg.state.lightHistoryReadBindings;\r\n const historySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n if (historyManager && options.ssr && ctx.camera?.ssrTemporal && options.motionVectors) {\r\n const reflectHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_REFLECT,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (reflectHistoryHandle && motionVectorHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSR_REFLECT, handle: reflectHistoryHandle },\r\n { name: RGHistoryResources.SSR_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n if (historyManager && options.ssgi) {\r\n const ssgiHistorySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n const irradianceHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_IRRADIANCE,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n ssgiHistorySize\r\n );\r\n const surfaceHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_SURFACE,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n ssgiHistorySize\r\n );\r\n if (irradianceHistoryHandle && surfaceHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSGI_IRRADIANCE, handle: irradianceHistoryHandle },\r\n { name: RGHistoryResources.SSGI_SURFACE, handle: surfaceHistoryHandle }\r\n );\r\n }\r\n }\r\n\r\n const opaquePassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const binding of lightHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n\r\n // Direct rendering writes the backbuffer; otherwise create a texture.\r\n const sceneColorHandle = useFinalFramebufferAsIntermediate\r\n ? builder.write(backbuffer)\r\n : builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColor',\r\n allocationKey: 'ForwardPlus.SceneColor'\r\n });\r\n\r\n if (sceneColorCopyHandle) {\r\n builder.read(sceneColorCopyHandle);\r\n }\r\n if (sssProfileHandle) {\r\n builder.read(sssProfileHandle);\r\n }\r\n if (sssParamHandle) {\r\n builder.read(sssParamHandle);\r\n }\r\n const surfaceAttachmentCount = Number(options.sceneRoughness) + Number(options.sceneNormal);\r\n // Surface MRT products are exposed through blackboard handles.\r\n const sceneRoughnessHandle = options.sceneRoughness\r\n ? builder.createTexture({\r\n format: getSurfaceTextureFormat(ctx),\r\n label: 'sceneRoughness',\r\n allocationKey: 'ForwardPlus.SceneRoughness'\r\n })\r\n : undefined;\r\n const sceneNormalHandle = options.sceneNormal\r\n ? builder.createTexture({\r\n format: getSurfaceTextureFormat(ctx),\r\n label: 'sceneNormal',\r\n allocationKey: 'ForwardPlus.SceneNormal'\r\n })\r\n : undefined;\r\n const writeSSSDiffuse = options.sss && shouldStoreSSSDiffuse(ctx);\r\n let writeSSSTransmission = options.sss && shouldStoreSSSTransmission(ctx);\r\n if (\r\n writeSSSDiffuse &&\r\n writeSSSTransmission &&\r\n surfaceAttachmentCount > 0 &&\r\n getSSSLightingTextureFormat(ctx, 2, surfaceAttachmentCount) !== ctx.colorFormat\r\n ) {\r\n writeSSSTransmission = false;\r\n }\r\n const writeSkinSSS = options.skinSSS;\r\n const sssLightingAttachmentCount =\r\n (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0) + (writeSkinSSS ? 1 : 0);\r\n const sssLightingFormat = getSSSLightingTextureFormat(\r\n ctx,\r\n sssLightingAttachmentCount,\r\n surfaceAttachmentCount\r\n );\r\n const sssDiffuseHandle = writeSSSDiffuse\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'sssDiffuse',\r\n allocationKey: 'ForwardPlus.SSSDiffuse'\r\n })\r\n : undefined;\r\n const sssTransmissionHandle = writeSSSTransmission\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'sssTransmission',\r\n allocationKey: 'ForwardPlus.SSSTransmission'\r\n })\r\n : undefined;\r\n const skinSSSHandle = writeSkinSSS\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'skinSSS',\r\n allocationKey: 'ForwardPlus.SkinSSS'\r\n })\r\n : undefined;\r\n const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate\r\n ? undefined\r\n : builder.createFramebuffer({\r\n label: 'SceneColorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorHandle,\r\n depthAttachment: renderDepthAttachment\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n const sceneColorTex = rgCtx.getTexture<Texture2D>(sceneColorHandle);\r\n const sceneColorCopyTex = sceneColorCopyHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneColorCopyHandle)\r\n : null;\r\n // Legacy effects still read resolved MRT textures from DrawContext.\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n ctx.HiZTexture = hiZHandle ? rgCtx.getTexture<Texture2D>(hiZHandle) : null;\r\n ctx.SceneRoughnessTexture = sceneRoughnessHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneRoughnessHandle)\r\n : null;\r\n ctx.SceneNormalTexture = sceneNormalHandle ? rgCtx.getTexture<Texture2D>(sceneNormalHandle) : null;\r\n ctx.SSSProfileTexture = sssProfileHandle ? rgCtx.getTexture<Texture2D>(sssProfileHandle) : null;\r\n ctx.SSSParamTexture = sssParamHandle ? rgCtx.getTexture<Texture2D>(sssParamHandle) : null;\r\n ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture<Texture2D>(sssDiffuseHandle) : null;\r\n ctx.SSSTransmissionTexture = sssTransmissionHandle\r\n ? rgCtx.getTexture<Texture2D>(sssTransmissionHandle)\r\n : null;\r\n ctx.SkinSSSTexture = skinSSSHandle ? rgCtx.getTexture<Texture2D>(skinSSSHandle) : null;\r\n const renderLightPass = () =>\r\n renderOpaqueScenePass(frame, sceneColorTex, sceneColorCopyTex, rgCtx, sceneColorFramebufferHandle);\r\n if (historyManager && lightHistoryReadBindings.length > 0) {\r\n const ssgiIrradianceBinding = lightHistoryReadBindings.find(\r\n (binding) => binding.name === RGHistoryResources.SSGI_IRRADIANCE\r\n );\r\n const ssgiSurfaceBinding = lightHistoryReadBindings.find(\r\n (binding) => binding.name === RGHistoryResources.SSGI_SURFACE\r\n );\r\n ctx.SSGIIrradianceHistoryTexture = ssgiIrradianceBinding\r\n ? rgCtx.getTexture<Texture2D>(ssgiIrradianceBinding.handle)\r\n : null;\r\n ctx.SSGISurfaceHistoryTexture = ssgiSurfaceBinding\r\n ? rgCtx.getTexture<Texture2D>(ssgiSurfaceBinding.handle)\r\n : null;\r\n historyManager.beginReadScope(\r\n lightHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderLightPass();\r\n } finally {\r\n historyManager.endReadScope();\r\n ctx.SSGIIrradianceHistoryTexture = null;\r\n ctx.SSGISurfaceHistoryTexture = null;\r\n }\r\n } else {\r\n renderLightPass();\r\n }\r\n });\r\n\r\n return {\r\n sceneColorHandle,\r\n sceneColorFramebufferHandle,\r\n sceneRoughnessHandle,\r\n sceneNormalHandle,\r\n sssDiffuseHandle,\r\n sssTransmissionHandle,\r\n skinSSSHandle\r\n };\r\n });\r\n const lightPassResult: LightPassResult = opaquePassResult;\r\n fg.state.lightPass = lightPassResult;\r\n blackboard.set(FrameResources.SceneColor, lightPassResult.sceneColorHandle);\r\n if (lightPassResult.sceneRoughnessHandle) {\r\n blackboard.set(FrameResources.SceneRoughness, lightPassResult.sceneRoughnessHandle);\r\n }\r\n if (lightPassResult.sceneNormalHandle) {\r\n blackboard.set(FrameResources.SceneNormal, lightPassResult.sceneNormalHandle);\r\n }\r\n if (lightPassResult.sssDiffuseHandle) {\r\n blackboard.set(FrameResources.SSSDiffuse, lightPassResult.sssDiffuseHandle);\r\n }\r\n if (lightPassResult.sssTransmissionHandle) {\r\n blackboard.set(FrameResources.SSSTransmission, lightPassResult.sssTransmissionHandle);\r\n }\r\n if (lightPassResult.skinSSSHandle) {\r\n blackboard.set(FrameResources.SkinSSS, lightPassResult.skinSSSHandle);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SkyPassModule: RenderModule<FrameGraphContext> = {\r\n type: 'SkyPass',\r\n reads: [{ resource: FrameResources.SceneColor, version: 'current' }],\r\n writes: [FrameResources.SceneColor, FrameResources.SceneColorNoFog],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SkyPass');\r\n const lightPassResult = requireBuildState(fg, 'lightPass', 'LightPass', 'SkyPass');\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const sceneColorHandle = blackboard.expect(FrameResources.SceneColor);\r\n // Screen-space passes must not read fog as surface radiance. Snapshot the lit\r\n // scene with sky but before fog, and only when fog is actually present and a\r\n // consumer exists, so fog-free scenes allocate nothing extra. The refraction\r\n // background path already baked sky and fog into the copy, so no fog-free\r\n // version can be recovered there and consumers keep their existing input.\r\n const captureNoFog = !sceneColorCopyHandle && (options.ssgi || options.ssr) && options.fogPresents;\r\n\r\n const skyPassResult = graph.addPass('SkyPass', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n const noFog = captureNoFog\r\n ? builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorNoFog',\r\n allocationKey: 'ForwardPlus.SceneColorNoFog'\r\n })\r\n : null;\r\n const out = builder.write(sceneColorHandle);\r\n builder.setExecute((rgCtx) => {\r\n // The refraction background already contains sky and fog.\r\n if (!sceneColorCopyHandle) {\r\n renderSkyScenePass(\r\n frame,\r\n rgCtx,\r\n lightPassResult.sceneColorFramebufferHandle,\r\n noFog ? rgCtx.getTexture<Texture2D>(noFog) : null\r\n );\r\n }\r\n });\r\n return { color: out, noFog };\r\n });\r\n\r\n lightPassResult.sceneColorHandle = skyPassResult.color;\r\n blackboard.set(FrameResources.SceneColor, skyPassResult.color);\r\n if (skyPassResult.noFog) {\r\n blackboard.set(FrameResources.SceneColorNoFog, skyPassResult.noFog);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst CompositeTailModule: RenderModule<FrameGraphContext> = {\r\n type: 'CompositeTail',\r\n writes: [FrameResources.SceneColor, FrameResources.LinearDepth, FrameResources.PresentedColor],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options, backbuffer } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'CompositeTail');\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const lightPassResult = requireBuildState(fg, 'lightPass', 'LightPass', 'CompositeTail');\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const useFinalFramebufferAsIntermediate = fg.state.useFinalFramebufferAsIntermediate;\r\n const lightHistoryReadBindings = fg.state.lightHistoryReadBindings;\r\n const historyManager = fg.history;\r\n\r\n // Opaque effects finish before transparent geometry uses their output.\r\n const opaqueChainInput = blackboard.expect(FrameResources.SceneColor);\r\n // Include textures sampled indirectly through DrawContext.\r\n const opaqueChainDeps: RGHandle[] = [blackboard.expect(FrameResources.LinearDepth)];\r\n if (hiZHandle) {\r\n opaqueChainDeps.push(hiZHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n opaqueChainDeps.push(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (sceneColorCopyHandle) {\r\n opaqueChainDeps.push(sceneColorCopyHandle);\r\n }\r\n for (const handle of [\r\n blackboard.get(FrameResources.SSSProfile),\r\n blackboard.get(FrameResources.SSSParam),\r\n blackboard.get(FrameResources.SceneRoughness),\r\n blackboard.get(FrameResources.SceneNormal),\r\n blackboard.get(FrameResources.SSSDiffuse),\r\n blackboard.get(FrameResources.SSSTransmission),\r\n blackboard.get(FrameResources.SkinSSS)\r\n ]) {\r\n if (handle) {\r\n opaqueChainDeps.push(handle);\r\n }\r\n }\r\n const opaqueChainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.opaque,\r\n blackboard,\r\n input: opaqueChainInput,\r\n finalOutput: null,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: opaqueChainDeps,\r\n historyReads: lightHistoryReadBindings,\r\n history: historyManager\r\n })\r\n : { color: opaqueChainInput, wroteFinal: false };\r\n const opaqueChainRan = opaqueChainResult.color !== opaqueChainInput;\r\n\r\n // Transparent geometry writes a new version of the opaque-chain output.\r\n const sceneColorHandle = graph.addPass('TransparentPass', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (hiZHandle) {\r\n // Transparent materials may ray-march HiZ.\r\n builder.read(hiZHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (sceneColorCopyHandle) {\r\n builder.read(sceneColorCopyHandle);\r\n }\r\n if (shadowMaskHandle) {\r\n // Transparent geometry goes through the same clustered-light bind group\r\n // as the opaque pass, which binds ctx.shadowMaskTexture whenever\r\n // screenSpaceShadowMask is on (ShaderHelper, UNIFORM_NAME_SHADOW_MASK).\r\n // Declaring the read is what keeps the mask alive: the executor derives\r\n // each resource's lastUse from declared reads and returns the texture to\r\n // the pool immediately after, so without this the mask would be recycled\r\n // after LightPass while this pass is still sampling it.\r\n builder.read(shadowMaskHandle);\r\n }\r\n builder.read(opaqueChainResult.color);\r\n const out = builder.write(opaqueChainResult.color);\r\n builder.setExecute((rgCtx) => {\r\n // Pulled here rather than inherited from LightPass's execute. The value\r\n // is the same, but relying on the leftover would make this pass depend\r\n // on execution order instead of on its own declared inputs.\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderTransparentScenePass(\r\n frame,\r\n rgCtx,\r\n opaqueChainRan ? opaqueChainResult.color : null,\r\n lightPassResult.sceneColorFramebufferHandle\r\n );\r\n });\r\n return out;\r\n });\r\n blackboard.set(FrameResources.SceneColor, sceneColorHandle);\r\n\r\n const chainInput = sceneColorHandle;\r\n // Track whether the chain input still resides in the final target.\r\n const backbufferResidentHandle = useFinalFramebufferAsIntermediate ? sceneColorHandle : null;\r\n const chainDependencies: RGHandle[] = [];\r\n const finalOutput = { handle: backbuffer, isScreen: !ctx.finalFramebuffer };\r\n const endLayerHasEffects = !!ctx.compositor?.layerHasEnabledEffect(PostEffectLayer.end);\r\n\r\n // Transparent-layer effects read depth before its transmission mutation.\r\n const transparentChainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.transparent,\r\n blackboard,\r\n input: chainInput,\r\n finalOutput: endLayerHasEffects ? null : finalOutput,\r\n inputResidesInFinalTarget: !!backbufferResidentHandle,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: chainDependencies,\r\n history: historyManager\r\n })\r\n : { color: chainInput, wroteFinal: false };\r\n\r\n // WAR orders this depth mutation after pre-transmission readers.\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor && !options.needsTransmissionDepthForSSR) {\r\n const transmissionDepthResult = graph.addPass('TransmissionDepth', (builder) => {\r\n const currentDepth = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(sceneColorHandle);\r\n if (transparentChainResult.color !== sceneColorHandle) {\r\n builder.read(transparentChainResult.color);\r\n }\r\n builder.read(currentDepth);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const depthOut = builder.write(currentDepth);\r\n const done = builder.createToken('TransmissionDepthDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return { done, depthOut };\r\n });\r\n transmissionDepthToken = transmissionDepthResult.done;\r\n blackboard.set(FrameResources.LinearDepth, transmissionDepthResult.depthOut);\r\n }\r\n\r\n const endChainDependencies = transmissionDepthToken\r\n ? [...chainDependencies, transmissionDepthToken]\r\n : chainDependencies;\r\n const chainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.end,\r\n blackboard,\r\n input: transparentChainResult.color,\r\n finalOutput,\r\n inputResidesInFinalTarget:\r\n !!backbufferResidentHandle && transparentChainResult.color === chainInput,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: endChainDependencies,\r\n history: historyManager\r\n })\r\n : { color: transparentChainResult.color, wroteFinal: false };\r\n const finalWroteFinal = chainResult.wroteFinal || transparentChainResult.wroteFinal;\r\n\r\n let presentedBackbuffer: RGHandle;\r\n if (finalWroteFinal) {\r\n presentedBackbuffer = chainResult.color;\r\n } else {\r\n presentedBackbuffer = graph.addPass('Blit', (builder) => {\r\n builder.read(chainResult.color);\r\n for (const dep of endChainDependencies) {\r\n builder.read(dep);\r\n }\r\n const outputBackbuffer = builder.write(backbuffer);\r\n // Skip copies when the output already resides in the final target.\r\n const needsBlit = chainResult.color !== backbufferResidentHandle;\r\n builder.setExecute((rgCtx) => {\r\n const sourceTex = needsBlit ? rgCtx.getTexture<Texture2D>(chainResult.color) : null;\r\n if (sourceTex) {\r\n const blitter = new CopyBlitter();\r\n blitter.srgbOut = !ctx.finalFramebuffer;\r\n blitter.blit(sourceTex, ctx.finalFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));\r\n }\r\n });\r\n return outputBackbuffer;\r\n });\r\n }\r\n fg.state.presentedBackbuffer = presentedBackbuffer;\r\n // Downstream modules may replace this sink registration.\r\n blackboard.set(FrameResources.PresentedColor, presentedBackbuffer);\r\n }\r\n};\r\n\r\n/** Built-in Forward+ modules addressable by pipeline anchors. @public */\r\nexport const ForwardPlusModules = {\r\n SkyUpdate: SkyUpdateModule,\r\n ClusterLights: ClusterLightsModule,\r\n GPUPicking: GPUPickingModule,\r\n ShadowMaps: ShadowMapsModule,\r\n DepthPrepass: DepthPrepassModule,\r\n ShadowMask: ShadowMaskModule,\r\n TransmissionDepthForSSR: TransmissionDepthForSSRModule,\r\n HiZ: HiZModule,\r\n SSSProfile: SSSProfileModule,\r\n SceneColorGrab: SceneColorGrabModule,\r\n LightPass: LightPassModule,\r\n SkyPass: SkyPassModule,\r\n CompositeTail: CompositeTailModule\r\n} as const;\r\n\r\n/** The default module order assembled by {@link createForwardPlusPipeline}. */\r\nconst DEFAULT_FORWARD_PLUS_MODULES: readonly RenderModule<FrameGraphContext>[] = [\r\n SkyUpdateModule,\r\n ClusterLightsModule,\r\n GPUPickingModule,\r\n ShadowMapsModule,\r\n DepthPrepassModule,\r\n ShadowMaskModule,\r\n TransmissionDepthForSSRModule,\r\n HiZModule,\r\n SSSProfileModule,\r\n SceneColorGrabModule,\r\n LightPassModule,\r\n SkyPassModule,\r\n CompositeTailModule\r\n];\r\n\r\n/** @internal */\r\nlet _defaultForwardPlusPipeline: RenderPipeline<FrameGraphContext> | null = null;\r\n\r\n/** Create an independent pipeline with the built-in Forward+ modules. @public */\r\nexport function createForwardPlusPipeline(): RenderPipeline<FrameGraphContext> {\r\n return new RenderPipeline<FrameGraphContext>(DEFAULT_FORWARD_PLUS_MODULES);\r\n}\r\n\r\n/** Return the shared default pipeline. Mutations affect cameras using it. @public */\r\nexport function getDefaultForwardPlusPipeline(): RenderPipeline<FrameGraphContext> {\r\n if (!_defaultForwardPlusPipeline) {\r\n _defaultForwardPlusPipeline = createForwardPlusPipeline();\r\n }\r\n return _defaultForwardPlusPipeline;\r\n}\r\n\r\n/** Build the Forward+ render graph and return its backbuffer output. @public */\r\nexport function buildForwardPlusGraph(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): RGHandle {\r\n return buildForwardPlusGraphInternal(graph, ctx, renderQueue, options).backbuffer;\r\n}\r\n\r\nfunction buildForwardPlusGraphInternal(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): ForwardPlusGraphBuildResult {\r\n const backbuffer = graph.importTexture('backbuffer');\r\n // Irradiance, moments and surface history require renderable half-float\r\n // targets. Keep ordinary IBL active on devices that cannot provide them.\r\n options.ssgi &&= supportsSSGIRenderTargets(ctx);\r\n ctx.SSS = !!options.sss;\r\n ctx.SSGI = !!options.ssgi;\r\n ctx.SSGIIrradianceHistoryTexture = null;\r\n ctx.SSGISurfaceHistoryTexture = null;\r\n ctx.SkinSSSTexture = null;\r\n // ShadowMask sets this only when it produces a texture.\r\n ctx.shadowMaskTexture = null;\r\n\r\n const blackboard = new RGBlackboard();\r\n\r\n const frame: FrameState = {\r\n ctx,\r\n renderQueue,\r\n depthFramebuffer: null,\r\n sunLightColor: null,\r\n options,\r\n renderQueueDisposed: false,\r\n clusteredLightReleased: false,\r\n sunLightRestored: false\r\n };\r\n\r\n const ordering = new OrderingScope();\r\n const fg: FrameGraphContext = {\r\n graph,\r\n ctx,\r\n finalFramebuffer: ctx.finalFramebuffer,\r\n renderQueue,\r\n blackboard,\r\n frame,\r\n history: ctx.camera?.getHistoryResourceManager?.() ?? null,\r\n options,\r\n ordering,\r\n backbuffer,\r\n state: {\r\n renderDepthAttachment: null,\r\n useFinalFramebufferAsIntermediate: false,\r\n lightHistoryReadBindings: []\r\n }\r\n };\r\n\r\n const pipeline = ctx.camera?.renderPipeline ?? getDefaultForwardPlusPipeline();\r\n const requirements = ctx.compositor?.collectRequirements(ctx) ?? {};\r\n mergeFrameResourceRequirements(requirements, pipeline.collectRequirements(fg));\r\n resolveFrameResourceRequirements(ctx, options, requirements);\r\n\r\n pipeline.build(fg);\r\n validateProducedFrameResources(blackboard, options, renderQueue);\r\n\r\n const presented = blackboard.get(FrameResources.PresentedColor) ?? fg.state.presentedBackbuffer!;\r\n const depth = fg.state.depth;\r\n const externalDepthImport =\r\n depth?.externalDepthAttachmentHandle && depth.externalDepthAttachment\r\n ? { handle: depth.externalDepthAttachmentHandle, texture: depth.externalDepthAttachment }\r\n : undefined;\r\n return { backbuffer: presented, frame, externalDepthImport };\r\n}\r\n\r\n/** @internal */\r\nfunction renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]): void {\r\n ctx.renderPass = _shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n try {\r\n for (const light of lights) {\r\n light.shadow.render(ctx, _shadowMapPass);\r\n }\r\n } finally {\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderForwardSSSProfile(\r\n frame: FrameState,\r\n profileFramebuffer: FrameBuffer,\r\n profileTexture: Texture2D,\r\n paramTexture: Texture2D,\r\n normalTexture: Nullable<Texture2D>\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n if (!ctx.SSS || !ctx.depthTexture) {\r\n return;\r\n }\r\n const sssRenderQueue = createActualSSSRenderQueue(renderQueue);\r\n if (!sssRenderQueue) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n const savedCompositor = ctx.compositor;\r\n const savedTransmission = _scenePass.transmission;\r\n const savedRenderOpaque = _scenePass.renderOpaque;\r\n const savedRenderTransparent = _scenePass.renderTransparent;\r\n const savedClearColor = _scenePass.clearColor;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedCommandBufferReuse = ctx.camera.commandBufferReuse;\r\n const savedProfileTexture = ctx.SSSProfileTexture;\r\n const savedParamTexture = ctx.SSSParamTexture;\r\n const savedNormalTexture = ctx.SceneNormalTexture;\r\n\r\n let profileFlags = MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n if (normalTexture) {\r\n profileFlags |= MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n }\r\n\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(profileFramebuffer);\r\n ctx.SSSProfileTexture = profileTexture;\r\n ctx.SSSParamTexture = paramTexture;\r\n ctx.SceneNormalTexture = normalTexture;\r\n ctx.compositor = null;\r\n ctx.camera.commandBufferReuse = false;\r\n ctx.materialFlags =\r\n (ctx.materialFlags &\r\n ~(\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n )) |\r\n profileFlags;\r\n _scenePass.transmission = false;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.clearColor = Vector4.zero();\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.render(ctx, null, null, sssRenderQueue);\r\n } finally {\r\n _scenePass.clearColor = savedClearColor;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n _scenePass.renderTransparent = savedRenderTransparent;\r\n _scenePass.renderOpaque = savedRenderOpaque;\r\n _scenePass.transmission = savedTransmission;\r\n ctx.camera.commandBufferReuse = savedCommandBufferReuse;\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.compositor = savedCompositor;\r\n ctx.SSSProfileTexture = savedProfileTexture;\r\n ctx.SSSParamTexture = savedParamTexture;\r\n ctx.SceneNormalTexture = savedNormalTexture;\r\n device.popDeviceStates();\r\n sssRenderQueue.dispose();\r\n }\r\n}\r\n\r\nfunction releaseIntermediateFramebuffer(frame: FrameState): void {\r\n // Each pass owns device state; only clear the shared context field.\r\n frame.ctx.intermediateFramebuffer = null;\r\n}\r\n\r\nfunction releaseDepthFramebuffer(frame: FrameState): void {\r\n frame.depthFramebuffer = null;\r\n}\r\n\r\nfunction disposeRenderQueue(frame: FrameState): void {\r\n if (!frame.renderQueueDisposed) {\r\n frame.renderQueue.dispose();\r\n frame.renderQueueDisposed = true;\r\n }\r\n}\r\n\r\nfunction releaseClusteredLight(frame: FrameState): void {\r\n if (!frame.clusteredLightReleased && frame.ctx.clusteredLight) {\r\n freeClusteredLight(frame.ctx.clusteredLight);\r\n frame.ctx.clusteredLight = undefined;\r\n frame.clusteredLightReleased = true;\r\n }\r\n}\r\n\r\nfunction restoreSunLight(frame: FrameState): void {\r\n if (!frame.sunLightRestored && frame.sunLightColor && frame.ctx.sunLight) {\r\n frame.ctx.sunLight.color = frame.sunLightColor;\r\n frame.sunLightRestored = true;\r\n }\r\n}\r\n\r\nfunction cleanupFrame(frame: FrameState): void {\r\n const { ctx } = frame;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SCENE_STORE_ROUGHNESS;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n disposeRenderQueue(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n/** @internal */\r\nfunction renderSceneDepth(\r\n frame: FrameState,\r\n existingDepthFb: Nullable<FrameBuffer>,\r\n rgCtx: RGExecuteContext,\r\n depthTex?: Texture2D,\r\n motionVectorTex?: Nullable<Texture2D>,\r\n transmissionOverride?: boolean\r\n): FrameBuffer {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n const transmission = transmissionOverride ?? !!existingDepthFb;\r\n let depthFramebuffer = existingDepthFb;\r\n\r\n // Current callers must provide the graph-managed prepass framebuffer.\r\n console.assert(\r\n !!existingDepthFb,\r\n 'renderSceneDepth: called without an existing depth framebuffer; the ' +\r\n 'self-allocating fallback path is untested in the forward+ pipeline.'\r\n );\r\n\r\n if (!depthFramebuffer) {\r\n if (depthTex) {\r\n const colorAttachments = motionVectorTex ? [depthTex, motionVectorTex] : depthTex;\r\n const depthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const depthTexOrFormat = depthAttachment?.isTexture2D() ? depthAttachment : ctx.depthFormat;\r\n\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: depthTex.width,\r\n height: depthTex.height,\r\n colorAttachments,\r\n depthAttachment: depthTexOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n if (!ctx.finalFramebuffer) {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n if (originDepth?.isTexture2D()) {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: originDepth.width,\r\n height: originDepth.height,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: originDepth,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!transmission) {\r\n frame.depthFramebuffer = depthFramebuffer!;\r\n }\r\n\r\n ctx.device.pushDeviceStates();\r\n try {\r\n ctx.device.setFramebuffer(depthFramebuffer!);\r\n _depthPass.encodeDepth = depthFramebuffer!.getColorAttachments()[0].format === 'rgba8unorm';\r\n _depthPass.clearColor = transmission\r\n ? null\r\n : _depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n _depthPass.clearDepth = transmission ? null : DEPTH_CLEAR_VALUE;\r\n _depthPass.clearStencil = null;\r\n _depthPass.transmission = transmission;\r\n\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!_backDepthColorState) {\r\n _backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!_frontDepthColorState) {\r\n _frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = _backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n _depthPass.renderBackface = true;\r\n _depthPass.transmission = false;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n _depthPass.clearColor = null;\r\n _depthPass.renderBackface = false;\r\n ctx.forceColorState = _frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.forceColorState = null;\r\n ctx.forceCullMode = null;\r\n _depthPass.renderBackface = false;\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n if (!transmission) {\r\n ctx.motionVectorTexture = ctx.motionVectors\r\n ? (depthFramebuffer!.getColorAttachments()[1] as Texture2D)\r\n : null;\r\n ctx.linearDepthTexture = depthFramebuffer!.getColorAttachments()[0] as Texture2D;\r\n ctx.depthTexture = depthFramebuffer!.getDepthAttachment() as Texture2D;\r\n ctx.depthPrepassAttachment = ctx.depthTexture;\r\n }\r\n return depthFramebuffer!;\r\n}\r\n\r\nlet _skyMVProgram: Nullable<GPUProgram> = null;\r\nlet _skyMVBindGroup: Nullable<BindGroup> = null;\r\nlet _skyMVBox: Nullable<Primitive> = null;\r\n\r\n/** @internal */\r\n/**\r\n * Fills in motion vectors for blended geometry that opted into them.\r\n *\r\n * @remarks\r\n * The transparent queue never reaches the ordinary prepass, so without this a\r\n * blended surface carries whatever velocity belongs to what is behind it. The\r\n * framebuffer here holds the motion vector attachment alone, so nothing touches\r\n * the linear depth the light pass and the screen-space effects read, and the\r\n * materials run with depth test on and depth write off, so the scene depth is\r\n * left as the opaque pass built it.\r\n *\r\n * Materials that have not opted in discard, which leaves the velocity beneath\r\n * them intact. See {@link MeshMaterial.transparentMotionVector} for why that is\r\n * the right default and where the approximation breaks.\r\n * @internal\r\n */\r\nfunction renderTransparentMotionVectors(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle: RGHandle\r\n): void {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n if (!ctx.motionVectors || !renderQueue.itemList?.transparent) {\r\n return;\r\n }\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rgCtx.getFramebuffer(framebufferHandle));\r\n _depthPass.motionVectorOnly = true;\r\n _depthPass.encodeDepth = false;\r\n _depthPass.transmission = false;\r\n _depthPass.renderBackface = false;\r\n // Nothing is cleared: this pass only replaces the pixels its own geometry\r\n // covers, and everything else in the target is already correct.\r\n _depthPass.clearColor = null;\r\n _depthPass.clearDepth = null;\r\n _depthPass.clearStencil = null;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n _depthPass.motionVectorOnly = false;\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderSkyMotionVectors(\r\n ctx: DrawContext,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle?: RGHandle\r\n): void {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const fb = framebufferHandle\r\n ? rgCtx.getFramebuffer(framebufferHandle)\r\n : rgCtx.createFramebuffer({\r\n colorAttachments: ctx.motionVectorTexture,\r\n depthAttachment: ctx.depthTexture\r\n });\r\n\r\n if (!_skyMVProgram) {\r\n _skyMVProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = ShaderHelper.farthestClipZ(this, this.clipPos.w);\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n _skyMVProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n\r\n if (!_skyMVBindGroup) {\r\n _skyMVBindGroup = device.createBindGroup(_skyMVProgram.bindGroupLayouts[0]);\r\n }\r\n\r\n if (!_skyMVBox) {\r\n _skyMVBox = new BoxShape({ size: 2, needNormal: false, needUV: false });\r\n }\r\n\r\n _skyMVBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n _skyMVBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n _skyMVBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n _skyMVBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n\r\n device.pushDeviceStates();\r\n device.setProgram(_skyMVProgram);\r\n device.setBindGroup(0, _skyMVBindGroup);\r\n device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, DEPTH_COMPARE_DEFAULT));\r\n device.setFramebuffer(fb);\r\n _skyMVBox.draw();\r\n device.popDeviceStates();\r\n}\r\n\r\nfunction blitToCurrentColorAttachment(ctx: DrawContext, source: Texture2D): void {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n const destination = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n new CopyBlitter().blit(source, destination, fetchSampler('clamp_nearest_nomip'));\r\n}\r\n\r\n/** Render the refraction background before LightPass. @internal */\r\nfunction renderSceneColorGrab(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n copyHandle: RGHandle,\r\n copyFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n const copyTex = rgCtx.getTexture<Texture2D>(copyHandle);\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const isolateSceneColorDepth = frame.options.needsTransmissionDepthForSSR;\r\n const savedDepthPrepassAttachment = ctx.depthPrepassAttachment;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n\r\n // The background copy has no surface MRT attachments.\r\n const sceneColorMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const sceneColorFramebuffer = copyFramebufferHandle\r\n ? rgCtx.getFramebuffer(copyFramebufferHandle)\r\n : rgCtx.createFramebuffer({\r\n width: copyTex.width,\r\n height: copyTex.height,\r\n colorAttachments: copyTex,\r\n depthAttachment: isolateSceneColorDepth ? ctx.depthFormat : depthTex,\r\n ignoreDepthStencil: false\r\n });\r\n let sceneColorStatePushed = false;\r\n try {\r\n device.pushDeviceStates();\r\n sceneColorStatePushed = true;\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n _scenePass.transmission = false;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = undefined;\r\n _scenePass.clearDepth = DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = 0;\r\n } else {\r\n _scenePass.clearDepth = depthTex ? null : DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n }\r\n ctx.materialFlags = sceneColorMaterialFlags;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = savedDepthPrepassAttachment;\r\n }\r\n if (sceneColorStatePushed) {\r\n device.popDeviceStates();\r\n }\r\n ctx.compositor = compositor;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function renderOpaqueScenePass(\r\n frame: FrameState,\r\n sceneColorTex: Texture2D,\r\n sceneColorCopyTex: Nullable<Texture2D>,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n );\r\n\r\n if (ctx.SceneRoughnessTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SCENE_STORE_ROUGHNESS;\r\n }\r\n if (ctx.SceneNormalTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n }\r\n if (ctx.SSS) {\r\n if (ctx.SSSDiffuseTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n }\r\n if (ctx.SSSTransmissionTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n }\r\n }\r\n if (ctx.SkinSSSTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_SSS_STORE;\r\n }\r\n\r\n // Prefer the graph framebuffer; final-target mode has no graph framebuffer.\r\n if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {\r\n ctx.intermediateFramebuffer = rgCtx.getFramebuffer(sceneColorFramebufferHandle);\r\n } else if (!sceneColorFramebufferHandle && depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else {\r\n ctx.intermediateFramebuffer = rgCtx.createFramebuffer({\r\n width: sceneColorTex.width,\r\n height: sceneColorTex.height,\r\n colorAttachments: getLightPassColorAttachments(ctx, sceneColorTex),\r\n depthAttachment: depthTex\r\n });\r\n }\r\n\r\n // Graph passes do not communicate through leftover device state.\r\n ctx.device.pushDeviceStates();\r\n try {\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n ctx.device.setFramebuffer(ctx.intermediateFramebuffer);\r\n ctx.device.setViewport(null);\r\n ctx.device.setScissor(null);\r\n\r\n _scenePass.transmission = false;\r\n _scenePass.renderSky = false;\r\n _scenePass.clearDepth = depthTex ? null : DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n\r\n if (renderQueue.needSceneColor() && sceneColorCopyTex) {\r\n // Seed the main target with the refraction background.\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n blitToCurrentColorAttachment(ctx, ctx.sceneColorTexture);\r\n if (hasSurfaceMRT(ctx)) {\r\n // Re-render opaque lists to populate MRT data missing from the copy.\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n }\r\n _scenePass.transmission = true;\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n }\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n // Restore shared pass flags before the next graph pass.\r\n _scenePass.renderTransparent = true;\r\n _scenePass.renderSky = true;\r\n _scenePass.transmission = false;\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** Render sky and fog after opaque geometry. @internal */\r\nexport function renderSkyScenePass(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle,\r\n sceneColorNoFog?: Nullable<Texture2D>\r\n): void {\r\n const { ctx } = frame;\r\n const framebuffer = sceneColorFramebufferHandle\r\n ? rgCtx.getFramebuffer(sceneColorFramebufferHandle)\r\n : ctx.finalFramebuffer;\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n ctx.scene.env.sky.renderSky(ctx);\r\n if (ctx.scene.env.sky.fogPresents) {\r\n // Snapshot between sky and fog. Sky belongs in the copy - a ray that hits\r\n // the sky should read the sky - while fog does not, because the fog a\r\n // screen-space pass would sample lies along the camera ray rather than the\r\n // path it integrates.\r\n if (sceneColorNoFog) {\r\n const source = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n if (source) {\r\n new CopyBlitter().blit(source, sceneColorNoFog, fetchSampler('clamp_nearest_nomip'));\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n }\r\n ctx.scene.env.sky.renderFog(ctx.camera);\r\n }\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** Render transmission, transparency, and OIT over the opaque result. @internal */\r\nexport function renderTransparentScenePass(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n opaqueChainOutput: Nullable<RGHandle>,\r\n sceneColorFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n let framebuffer: Nullable<FrameBuffer>;\r\n if (opaqueChainOutput) {\r\n // Opaque effects redirect transparent rendering to their chain output.\r\n const chainTex = rgCtx.getTexture<Texture2D>(opaqueChainOutput);\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n framebuffer = rgCtx.createFramebuffer({\r\n width: chainTex.width,\r\n height: chainTex.height,\r\n colorAttachments: chainTex,\r\n depthAttachment: depthTex\r\n });\r\n // The chain output has no surface MRT attachments.\r\n ctx.materialFlags &= ~SURFACE_MRT_FLAGS;\r\n } else if (sceneColorFramebufferHandle) {\r\n // Continue in the light pass target when no opaque effect ran.\r\n framebuffer = rgCtx.getFramebuffer(sceneColorFramebufferHandle);\r\n } else {\r\n // Scene color already resides in the final framebuffer.\r\n framebuffer = ctx.finalFramebuffer;\r\n }\r\n device.pushDeviceStates();\r\n try {\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n // Derive transmission mode instead of inheriting shared pass state.\r\n _scenePass.transmission = renderQueue.needSceneColor();\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.renderOpaque = false;\r\n _scenePass.renderTransparent = true;\r\n _scenePass.renderSky = false;\r\n try {\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderSky = true;\r\n }\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** @internal */\r\nfunction renderTransmissionDepthPass(frame: FrameState, rgCtx: RGExecuteContext): void {\r\n renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);\r\n}\r\n\r\n/** Build and execute the Forward+ graph for one frame. @public */\r\nexport function executeForwardPlusGraph(ctx: DrawContext): void {\r\n const device = ctx.device;\r\n const graph = new RenderGraph();\r\n let renderQueue: RenderQueue | null = null;\r\n let frame: FrameState | null = null;\r\n let executor: RenderGraphExecutor<Texture2D> | null = null;\r\n let historyManager: HistoryResourceManager<Texture2D> | null = null;\r\n let historyFrameStarted = false;\r\n let motionVectorFramePrepared = false;\r\n let motionVectorFrameCommitted = false;\r\n\r\n try {\r\n renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n options.ssgi &&= supportsSSGIRenderTargets(ctx);\r\n ctx.SSS = options.sss;\r\n\r\n historyManager = ctx.camera.getHistoryResourceManager();\r\n if (!historyManager) {\r\n historyManager = new HistoryResourceManager<Texture2D>(_devicePoolAllocator);\r\n ctx.camera.setHistoryResourceManager(historyManager);\r\n }\r\n if (!options.ssgi) {\r\n historyManager.invalidate(RGHistoryResources.SSGI_SCENE_COLOR);\r\n historyManager.invalidate(RGHistoryResources.SSGI_IRRADIANCE);\r\n historyManager.invalidate(RGHistoryResources.SSGI_SURFACE);\r\n historyManager.invalidate(RGHistoryResources.SSGI_MOMENTS);\r\n }\r\n historyManager.beginFrame();\r\n historyFrameStarted = true;\r\n\r\n const buildResult = buildForwardPlusGraphInternal(graph, ctx, renderQueue, options);\r\n frame = buildResult.frame;\r\n\r\n if (options.motionVectors) {\r\n ctx.camera.prepareMotionVectorFrame(ctx.camera.TAA, ctx.renderWidth, ctx.renderHeight);\r\n motionVectorFramePrepared = true;\r\n } else {\r\n ctx.camera.clearMotionVectorFrame();\r\n }\r\n\r\n const compiled = graph.compile([buildResult.backbuffer]);\r\n\r\n executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight, {\r\n textureAffinityCache: getTextureAffinityCache(ctx.camera, device)\r\n });\r\n\r\n if (ctx.finalFramebuffer) {\r\n const backbufferTex = ctx.finalFramebuffer.getColorAttachments()[0] as Texture2D;\r\n executor.setImportedTexture(buildResult.backbuffer, backbufferTex);\r\n }\r\n if (buildResult.externalDepthImport) {\r\n executor.setImportedTexture(\r\n buildResult.externalDepthImport.handle,\r\n buildResult.externalDepthImport.texture\r\n );\r\n }\r\n historyManager.bindImportedTextures(executor);\r\n\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\r\n historyFrameStarted = false;\r\n if (motionVectorFramePrepared) {\r\n ctx.camera.commitMotionVectorFrame();\r\n motionVectorFrameCommitted = true;\r\n }\r\n } finally {\r\n if (historyFrameStarted) {\r\n historyManager?.discardFrame();\r\n }\r\n if (frame) {\r\n cleanupFrame(frame);\r\n } else {\r\n renderQueue?.dispose();\r\n }\r\n executor?.reset();\r\n if (motionVectorFramePrepared && !motionVectorFrameCommitted) {\r\n ctx.camera.clearMotionVectorFrame();\r\n }\r\n }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_shadowMaskRenderer","ShadowMaskRenderer","_devicePoolAllocator","DevicePoolAllocator","_textureAffinityCaches","WeakMap","getTextureAffinityCache","camera","device","current","get","cache","RGTextureAffinityCache","set","_backDepthColorState","_frontDepthColorState","SURFACE_MRT_FLAGS","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","cl","push","getCoreMaterial","material","coreMaterial","hasSSSMaterialCore","subsurfaceProfile","hasSkinSSSMaterialCore","skinSSS","renderQueueHasActiveSSS","renderQueue","itemList","lists","opaque","lit","unlit","list","materialList","renderQueueHasActiveSkinSSS","filterActualSSSItemList","items","filter","item","drawable","getMaterial","filterActualSSSMaterialList","filtered","Set","forEach","mat","add","cloneActualSSSListInfo","source","_targetQueue","skinItemList","morphItemList","skinAndMorphItemList","instanceItemList","instanceList","cloneActualSSSBundle","targetQueue","map","info","hasAnyActualSSSItems","renderItems","some","createActualSSSRenderQueue","queue","RenderQueue","sssOpaque","dispose","emptyBundle","target","_itemList","transmission","transparent","transmission_trans","_shadowedLightList","shadowedLights","_unshadowedLightList","unshadowedLights","_sunLight","sunLight","_primaryDirectionalLight","primaryDirectionalLight","_primaryTransmissionLight","primaryTransmissionLight","_needSceneColor","_needSceneDepth","_needSceneColorWithDepth","_drawTransparent","getSurfaceTextureFormat","ctx","caps","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getTextureFormatBytes","format","getTextureFormatInfo","size","supportsSSGIRenderTargets","rgba16fBytes","framebufferCaps","maxDrawBuffers","maxColorAttachmentBytesPerSample","shouldStoreSSSDiffuse","sssStrength","sssBlurScale","shouldStoreSSSTransmission","sssTransmissionStrength","getSSSLightingTextureFormat","attachmentCount","surfaceAttachmentCount","colorFormat","surfaceFormat","colorBytes","fullPrecisionBytes","getFullMipLevelCount","width","height","Math","max","floor","log2","hasSurfaceMRT","materialFlags","getLightPassColorAttachments","colorAttachment","attachments","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","deriveForwardPlusOptions","scene","deviceType","ssr","SSR","env","light","envLight","hasRadiance","ssgi","SSGI","HDR","ssgiIntensity","type","hasIrradiance","sss","SSS","needSceneColor","needSceneColorWithDepth","depthPrepass","motionVectors","hiZ","sceneNormal","sceneRoughness","shadowMask","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needsTransmissionDepthForSSR","fogPresents","sky","resolveFrameResourceRequirements","options","requirements","motionVector","Error","Number","MAX_SAFE_INTEGER","bytesPerSample","HiZ","screenSpaceShadowMask","validateProducedFrameResources","blackboard","required","FrameResources","MotionVector","SceneNormal","SceneRoughness","ShadowMask","needed","resource","has","requireBuildState","fg","key","producerType","consumerType","value","state","String","SkyUpdateModule","prepare","enabled","setup","graph","frame","ordering","addPass","builder","emit","sideEffect","setExecute","sunLightColor","update","ClusterLightsModule","chainInto","clusteredLight","calculateLightIndex","ShaderHelper","getPreExposure","GPUPickingModule","pickResolveFunc","renderObjectColors","ShadowMapsModule","renderShadowMaps","DepthPrepassModule","writes","LinearDepth","SceneDepthAttachment","result","SSRCalcThickness","mvFormat","depthHandle","createTexture","label","allocationKey","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","externalDepthAttachmentHandle","importTexture","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","createFramebuffer","renderWidth","renderHeight","colorAttachments","depthAttachment","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","rgCtx","depthFramebuffer","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","renderTransparentMotionVectors","depth","renderDepthAttachment","opaqueLayerHasEffects","compositor","layerHasEnabledEffect","PostEffectLayer","useFinalFramebufferAsIntermediate","ShadowMaskModule","depthPassResult","numShadowLights","numLayers","getLayerCount","maskPassResult","maskDepthHandle","expect","read","maskHandle","arrayLayers","depthTex","getTexture","maskTex","render","layer","attachmentLayer","TransmissionDepthForSSRModule","transmissionDepthResult","currentDepth","depthOut","write","done","createToken","renderTransmissionDepthPass","preLightTransmissionDepthToken","HiZModule","hiZHandle","REVERSE_Z","sizeMode","mipLevels","hiZFramebufferHandle","passCtx","depthFb","hiZTex","HiZFrameBuffer","buildHiZ","HiZTexture","SSSProfileModule","shadowMaskHandle","sssProfileResult","profileHandle","paramHandle","framebufferHandle","shadowMaskTexture","renderForwardSSSProfile","SSSProfile","SSSParam","SceneColorGrabModule","grabResult","copyHandle","copyFramebufferHandle","renderSceneColorGrab","SceneColorCopy","LightPassModule","SceneColor","SSSDiffuse","SSSTransmission","SkinSSS","backbuffer","sssProfileHandle","sssParamHandle","sceneColorCopyHandle","historyManager","history","lightHistoryReadBindings","historySize","ssrTemporal","reflectHistoryHandle","importPreviousIfCompatible","RGHistoryResources","SSR_REFLECT","motionVectorHistoryHandle","SSR_MOTION_VECTOR","name","handle","ssgiHistorySize","irradianceHistoryHandle","SSGI_IRRADIANCE","surfaceHistoryHandle","SSGI_SURFACE","opaquePassResult","binding","sceneColorHandle","sceneRoughnessHandle","sceneNormalHandle","writeSSSDiffuse","writeSSSTransmission","writeSkinSSS","sssLightingAttachmentCount","sssLightingFormat","sssDiffuseHandle","sssTransmissionHandle","skinSSSHandle","sceneColorFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderLightPass","renderOpaqueScenePass","ssgiIrradianceBinding","find","ssgiSurfaceBinding","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","beginReadScope","texture","endReadScope","lightPassResult","lightPass","SkyPassModule","reads","version","SceneColorNoFog","captureNoFog","skyPassResult","noFog","out","renderSkyScenePass","color","CompositeTailModule","PresentedColor","opaqueChainInput","opaqueChainDeps","opaqueChainResult","buildLayer","input","finalOutput","sceneDepthAttachment","dependencies","historyReads","wroteFinal","opaqueChainRan","renderTransparentScenePass","chainInput","backbufferResidentHandle","chainDependencies","isScreen","endLayerHasEffects","end","transparentChainResult","inputResidesInFinalTarget","transmissionDepthToken","endChainDependencies","chainResult","finalWroteFinal","presentedBackbuffer","dep","outputBackbuffer","needsBlit","sourceTex","blitter","CopyBlitter","srgbOut","blit","fetchSampler","ForwardPlusModules","SkyUpdate","ClusterLights","GPUPicking","ShadowMaps","DepthPrepass","TransmissionDepthForSSR","SceneColorGrab","SkyPass","CompositeTail","DEFAULT_FORWARD_PLUS_MODULES","_defaultForwardPlusPipeline","createForwardPlusPipeline","RenderPipeline","getDefaultForwardPlusPipeline","buildForwardPlusGraph","buildForwardPlusGraphInternal","RGBlackboard","renderQueueDisposed","clusteredLightReleased","sunLightRestored","OrderingScope","getHistoryResourceManager","pipeline","renderPipeline","collectRequirements","mergeFrameResourceRequirements","build","presented","externalDepthImport","lights","renderPass","pushDeviceStates","shadow","popDeviceStates","profileFramebuffer","profileTexture","paramTexture","normalTexture","depthTexture","sssRenderQueue","savedMaterialFlags","savedCompositor","savedTransmission","savedRenderOpaque","renderOpaque","savedRenderTransparent","renderTransparent","savedClearColor","clearColor","savedClearDepth","clearDepth","savedClearStencil","clearStencil","savedCommandBufferReuse","commandBufferReuse","savedProfileTexture","savedParamTexture","savedNormalTexture","profileFlags","setFramebuffer","Vector4","zero","releaseIntermediateFramebuffer","intermediateFramebuffer","releaseDepthFramebuffer","disposeRenderQueue","releaseClusteredLight","restoreSunLight","cleanupFrame","existingDepthFb","motionVectorTex","transmissionOverride","console","assert","originDepth","encodeDepth","getColorAttachments","DEPTH_CLEAR_VALUE","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthPrepassAttachment","_skyMVProgram","_skyMVBindGroup","_skyMVBox","motionVectorOnly","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","farthestClipZ","w","$builtins","position","$outputs","currentPos","prevPos","fragment","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","DEPTH_COMPARE_DEFAULT","draw","blitToCurrentColorAttachment","framebuffer","destination","getColorAttachment","copyTex","isolateSceneColorDepth","savedDepthPrepassAttachment","sceneColorMaterialFlags","sceneColorFramebuffer","sceneColorStatePushed","setViewport","setScissor","renderSky","sceneColorTexture","sceneColorNoFog","renderFog","opaqueChainOutput","chainTex","executeForwardPlusGraph","RenderGraph","executor","historyFrameStarted","motionVectorFramePrepared","motionVectorFrameCommitted","cullScene","HistoryResourceManager","setHistoryResourceManager","invalidate","SSGI_SCENE_COLOR","SSGI_MOMENTS","beginFrame","buildResult","prepareMotionVectorFrame","TAA","clearMotionVectorFrame","compiled","compile","RenderGraphExecutor","textureAffinityCache","backbufferTex","setImportedTexture","bindImportedTextures","execute","commitFrame","commitMotionVectorFrame","discardFrame","reset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"forward_plus_builder.js","sources":["../../../src/render/rendergraph/forward_plus_builder.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DEPTH_CLEAR_VALUE, DEPTH_COMPARE_DEFAULT, Vector4 } from '@zephyr3d/base';\r\nimport type {\r\n AbstractDevice,\r\n BindGroup,\r\n ColorState,\r\n FrameBuffer,\r\n GPUProgram,\r\n Texture2D,\r\n Texture2DArray,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { DrawContext } from '../drawable';\r\nimport {\r\n RenderQueue,\r\n type RenderItemList,\r\n type RenderItemListInfo,\r\n type RenderQueueItem\r\n} from '../render_queue';\r\nimport type { PunctualLight, Scene } from '../../scene';\r\nimport type { Camera } from '../../camera';\r\nimport { LightPass } from '../lightpass';\r\nimport { ShadowMapPass } from '../shadowmap_pass';\r\nimport { DepthPass } from '../depthpass';\r\nimport { ClusteredLight } from '../cluster_light';\r\nimport { ShadowMaskRenderer } from '../shadow_mask_pass';\r\nimport { buildHiZ, getHiZFormat } from '../hzb';\r\nimport { CopyBlitter } from '../../blitter';\r\nimport { fetchSampler } from '../../utility/misc';\r\nimport { MaterialVaryingFlags } from '../../values';\r\nimport { MAX_CAUSTIC_WATERS, ShaderHelper } from '../../material/shader/helper';\r\nimport { REFRACT_BLUR_MAX_LOD } from '../../material/water';\r\nimport { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect';\r\nimport { RenderGraph } from './rendergraph';\r\nimport { RenderGraphExecutor } from './executor';\r\nimport { RGTextureAffinityCache } from './texture_affinity_cache';\r\nimport { DevicePoolAllocator } from './device_pool_allocator';\r\nimport { HistoryResourceManager } from './history_resource_manager';\r\nimport { RGHistoryResources } from './history_resources';\r\nimport { RGBlackboard, FrameResources, type FrameResourceKey } from './blackboard';\r\nimport { OrderingScope } from './render_context';\r\nimport type { FrameGraphContext } from './frame_graph_context';\r\nimport type { RenderModule } from './render_module';\r\nimport { RenderPipeline } from './render_pipeline';\r\nimport type { FrameResourceRequirements } from './frame_resource_requirements';\r\nimport { mergeFrameResourceRequirements } from './frame_resource_requirements';\r\nimport type {\r\n RGExecuteContext,\r\n RGHandle,\r\n RGResolvedSize,\r\n RGTextureAttachment,\r\n RGTextureDesc,\r\n RGTextureHandle\r\n} from './types';\r\nimport { renderObjectColors } from '../gpu_picking';\r\nimport type { Primitive } from '../primitive';\r\nimport { BoxShape } from '../../shapes';\r\nimport type { Water } from '../../scene/water';\r\nimport { WaterCausticsRenderer } from '../water_caustics';\r\nimport { selectUnderwaterSource, UnderwaterRenderer } from '../underwater';\r\n\r\nconst _scenePass = new LightPass();\r\nconst _depthPass = new DepthPass();\r\nconst _shadowMapPass = new ShadowMapPass();\r\nconst _clusters: ClusteredLight[] = [];\r\nconst _shadowMaskRenderer = new ShadowMaskRenderer();\r\nconst _waterCausticsRenderer = new WaterCausticsRenderer();\r\nconst _underwaterRenderer = new UnderwaterRenderer();\r\nconst _devicePoolAllocator = new DevicePoolAllocator();\r\nconst _textureAffinityCaches = new WeakMap<\r\n Camera,\r\n { device: AbstractDevice; cache: RGTextureAffinityCache<Texture2D> }\r\n>();\r\n\r\nfunction getTextureAffinityCache(camera: Camera, device: AbstractDevice): RGTextureAffinityCache<Texture2D> {\r\n const current = _textureAffinityCaches.get(camera);\r\n if (current?.device === device) {\r\n return current.cache;\r\n }\r\n const cache = new RGTextureAffinityCache<Texture2D>();\r\n _textureAffinityCaches.set(camera, { device, cache });\r\n return cache;\r\n}\r\n\r\n/** Test-only access to the shared scene pass. @internal */\r\nexport function _getScenePassForTest(): LightPass {\r\n return _scenePass;\r\n}\r\n\r\nlet _backDepthColorState: Nullable<ColorState> = null;\r\nlet _frontDepthColorState: Nullable<ColorState> = null;\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\nfunction getClusteredLight(): ClusteredLight {\r\n return _clusters.length > 0 ? _clusters.pop()! : new ClusteredLight();\r\n}\r\nfunction freeClusteredLight(cl: ClusteredLight): void {\r\n _clusters.push(cl);\r\n}\r\n\r\nfunction getCoreMaterial(material: unknown): unknown {\r\n return (material as { coreMaterial?: unknown } | null | undefined)?.coreMaterial ?? material ?? null;\r\n}\r\n\r\nfunction hasSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { subsurfaceProfile?: unknown } | null)?.subsurfaceProfile;\r\n}\r\n\r\nfunction hasSkinSSSMaterialCore(material: unknown): boolean {\r\n return !!(getCoreMaterial(material) as { skinSSS?: unknown } | null)?.skinSSS;\r\n}\r\n\r\nfunction renderQueueHasActiveSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction renderQueueHasActiveSkinSSS(renderQueue: RenderQueue): boolean {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return false;\r\n }\r\n const lists = [...itemList.opaque.lit, ...itemList.opaque.unlit];\r\n for (const list of lists) {\r\n for (const material of list.materialList) {\r\n if (hasSkinSSSMaterialCore(material)) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\nfunction filterActualSSSItemList(items: RenderQueueItem[]): RenderQueueItem[] {\r\n return items.filter((item) => hasSSSMaterialCore(item.drawable.getMaterial?.()));\r\n}\r\n\r\nfunction filterActualSSSMaterialList(materialList: Set<any>): Set<any> {\r\n const filtered = new Set<any>();\r\n materialList.forEach((mat) => {\r\n if (hasSSSMaterialCore(mat)) {\r\n filtered.add(mat);\r\n }\r\n });\r\n return filtered;\r\n}\r\n\r\nfunction cloneActualSSSListInfo(source: RenderItemListInfo, _targetQueue: RenderQueue): RenderItemListInfo {\r\n return {\r\n itemList: filterActualSSSItemList(source.itemList),\r\n skinItemList: filterActualSSSItemList(source.skinItemList),\r\n morphItemList: filterActualSSSItemList(source.morphItemList),\r\n skinAndMorphItemList: filterActualSSSItemList(source.skinAndMorphItemList),\r\n instanceItemList: filterActualSSSItemList(source.instanceItemList),\r\n materialList: filterActualSSSMaterialList(source.materialList),\r\n instanceList: {},\r\n renderQueue: source.renderQueue\r\n };\r\n}\r\n\r\nfunction cloneActualSSSBundle(\r\n source: RenderItemList['opaque'],\r\n targetQueue: RenderQueue\r\n): RenderItemList['opaque'] {\r\n return {\r\n lit: source.lit.map((info) => cloneActualSSSListInfo(info, targetQueue)),\r\n unlit: source.unlit.map((info) => cloneActualSSSListInfo(info, targetQueue))\r\n };\r\n}\r\n\r\nfunction hasAnyActualSSSItems(renderItems: RenderItemListInfo[]): boolean {\r\n return renderItems.some(\r\n (info) =>\r\n info.itemList.length > 0 ||\r\n info.skinItemList.length > 0 ||\r\n info.morphItemList.length > 0 ||\r\n info.skinAndMorphItemList.length > 0 ||\r\n info.instanceItemList.length > 0\r\n );\r\n}\r\n\r\nfunction createActualSSSRenderQueue(renderQueue: RenderQueue): RenderQueue | null {\r\n const itemList = renderQueue.itemList;\r\n if (!itemList) {\r\n return null;\r\n }\r\n const queue = new RenderQueue(_scenePass);\r\n const sssOpaque = cloneActualSSSBundle(itemList.opaque, queue);\r\n if (!hasAnyActualSSSItems([...sssOpaque.lit, ...sssOpaque.unlit])) {\r\n queue.dispose();\r\n return null;\r\n }\r\n const emptyBundle = { lit: [], unlit: [] };\r\n const target = queue as unknown as {\r\n _itemList: RenderItemList;\r\n _shadowedLightList: PunctualLight[];\r\n _unshadowedLightList: PunctualLight[];\r\n _sunLight: typeof renderQueue.sunLight;\r\n _primaryDirectionalLight: typeof renderQueue.primaryDirectionalLight;\r\n _primaryTransmissionLight: typeof renderQueue.primaryTransmissionLight;\r\n _needSceneColor: boolean;\r\n _needSceneDepth: boolean;\r\n _needSceneColorWithDepth: boolean;\r\n _drawTransparent: boolean;\r\n };\r\n target._itemList = {\r\n opaque: sssOpaque,\r\n transmission: emptyBundle,\r\n transparent: emptyBundle,\r\n transmission_trans: emptyBundle\r\n };\r\n target._shadowedLightList = renderQueue.shadowedLights;\r\n target._unshadowedLightList = renderQueue.unshadowedLights;\r\n target._sunLight = renderQueue.sunLight;\r\n target._primaryDirectionalLight = renderQueue.primaryDirectionalLight;\r\n target._primaryTransmissionLight = renderQueue.primaryTransmissionLight;\r\n target._needSceneColor = false;\r\n target._needSceneDepth = false;\r\n target._needSceneColorWithDepth = false;\r\n target._drawTransparent = false;\r\n return queue;\r\n}\r\n\r\nfunction getSurfaceTextureFormat(ctx: DrawContext): TextureFormat {\r\n const caps = ctx.device.getDeviceCaps?.();\r\n return caps?.textureCaps.supportHalfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n}\r\n\r\nfunction getTextureFormatBytes(ctx: DrawContext, format: TextureFormat): number {\r\n return ctx.device.getDeviceCaps().textureCaps.getTextureFormatInfo(format).size;\r\n}\r\n\r\nfunction supportsSSGIRenderTargets(ctx: DrawContext): boolean {\r\n const caps = ctx.device.getDeviceCaps();\r\n const rgba16fBytes = caps.textureCaps.getTextureFormatInfo('rgba16f').size;\r\n return !!(\r\n caps.textureCaps.supportHalfFloatColorBuffer &&\r\n caps.framebufferCaps.maxDrawBuffers >= 2 &&\r\n caps.framebufferCaps.maxColorAttachmentBytesPerSample >= rgba16fBytes * 2\r\n );\r\n}\r\n\r\nfunction shouldStoreSSSDiffuse(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssBlurScale > 0;\r\n}\r\n\r\nfunction shouldStoreSSSTransmission(ctx: DrawContext): boolean {\r\n return ctx.camera.sssStrength > 0 && ctx.camera.sssTransmissionStrength > 0;\r\n}\r\n\r\nfunction getSSSLightingTextureFormat(\r\n ctx: DrawContext,\r\n attachmentCount: number,\r\n surfaceAttachmentCount: number\r\n): TextureFormat {\r\n const colorFormat = ctx.colorFormat!;\r\n if (surfaceAttachmentCount === 0 || attachmentCount === 0) {\r\n return colorFormat;\r\n }\r\n const caps = ctx.device.getDeviceCaps();\r\n // MRT graph textures are not resolved on DrawContext yet.\r\n const surfaceFormat = getSurfaceTextureFormat(ctx);\r\n const colorBytes =\r\n getTextureFormatBytes(ctx, colorFormat) +\r\n getTextureFormatBytes(ctx, surfaceFormat) * surfaceAttachmentCount;\r\n const fullPrecisionBytes = colorBytes + getTextureFormatBytes(ctx, colorFormat) * attachmentCount;\r\n if (fullPrecisionBytes <= caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n return colorFormat;\r\n }\r\n return 'rgba8unorm';\r\n}\r\n\r\nfunction getFullMipLevelCount(width: number, height: number): number {\r\n return Math.max(1, Math.floor(Math.log2(Math.max(1, width, height))) + 1);\r\n}\r\n\r\n/**\r\n * Levels the scene colour copy is allocated with.\r\n *\r\n * Deep enough to serve the refraction blur, which clamps its own LOD, and no\r\n * deeper: the coarsest levels of a full chain are averages of the whole frame,\r\n * which is not a plausible answer for \"what is behind this water\", and every\r\n * level costs bandwidth to generate on each grab. Capped against the full chain\r\n * so a small render target stays legal.\r\n *\r\n * Derived from the water material's clamp rather than restated, so the two\r\n * cannot drift: a level count one short of it would leave the sampler asking for\r\n * a level that does not exist.\r\n */\r\nfunction getSceneColorMipLevelCount(width: number, height: number): number {\r\n return Math.min(REFRACT_BLUR_MAX_LOD + 1, getFullMipLevelCount(width, height));\r\n}\r\n\r\nfunction hasSurfaceMRT(ctx: DrawContext): boolean {\r\n return !!(ctx.materialFlags & SURFACE_MRT_FLAGS);\r\n}\r\n\r\nfunction getLightPassColorAttachments(\r\n ctx: DrawContext,\r\n colorAttachment: TextureFormat | Texture2D\r\n): TextureFormat | Texture2D | Array<TextureFormat | Texture2D> {\r\n const attachments: Array<TextureFormat | Texture2D> = [colorAttachment];\r\n if (ctx.materialFlags & MaterialVaryingFlags.SCENE_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SceneRoughnessTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SCENE_STORE_NORMAL) {\r\n attachments.push(ctx.SceneNormalTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_PROFILE) {\r\n attachments.push(ctx.SSSProfileTexture!, ctx.SSSParamTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\r\n attachments.push(ctx.SkinSSSTexture!);\r\n }\r\n return attachments.length === 1 ? attachments[0] : attachments;\r\n}\r\n\r\n/** Per-frame Forward+ feature options. @public */\r\nexport interface ForwardPlusOptions {\r\n /** Enable depth prepass (always true for now). */\r\n depthPrepass: boolean;\r\n /** Enable motion vectors (requires TAA or motionBlur). */\r\n motionVectors: boolean;\r\n /** Enable Hi-Z pyramid (for SSR ray tracing). */\r\n hiZ: boolean;\r\n /**\r\n * Add the nearest-depth channel to the Hi-Z pyramid (for proximity queries).\r\n * Implies {@link ForwardPlusOptions.hiZ}.\r\n */\r\n hiZNearest: boolean;\r\n /** Produce opaque-scene world normals. */\r\n sceneNormal: boolean;\r\n /** Produce opaque-scene roughness data. */\r\n sceneRoughness: boolean;\r\n /** Produce and consume the clustered screen-space shadow mask. */\r\n shadowMask: boolean;\r\n /** Enable screen-space reflections. */\r\n ssr: boolean;\r\n /** Enable screen-space diffuse global illumination. */\r\n ssgi: boolean;\r\n /** Whether to compute SSR thickness. */\r\n ssrCalcThickness: boolean;\r\n /** Whether GPU picking is requested this frame. */\r\n gpuPicking: boolean;\r\n /** Whether transmission/refraction materials are present. */\r\n needSceneColor: boolean;\r\n /** Whether scene-color-dependent materials also require scene depth. */\r\n needSceneColorWithDepth: boolean;\r\n /** Whether SSR needs transmission depth before the main light pass. */\r\n needsTransmissionDepthForSSR: boolean;\r\n /** Enable screen-space subsurface scattering. */\r\n sss: boolean;\r\n /** Enable the stylized skin-specific SSS pass. */\r\n skinSSS: boolean;\r\n /** Whether height fog is composited over the opaque scene this frame. */\r\n fogPresents: boolean;\r\n}\r\n\r\n/** Derive Forward+ options from scene and camera state. @internal */\r\nexport function deriveForwardPlusOptions(\r\n scene: Scene,\r\n camera: Camera,\r\n deviceType: string,\r\n renderQueue: RenderQueue\r\n): ForwardPlusOptions {\r\n const ssr = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const ssgi =\r\n camera.SSGI &&\r\n camera.HDR &&\r\n camera.ssgiIntensity > 0 &&\r\n scene.env.light.type === 'ibl' &&\r\n !!scene.env.light.envLight?.hasRadiance() &&\r\n !!scene.env.light.envLight?.hasIrradiance();\r\n const sss = camera.SSS && renderQueueHasActiveSSS(renderQueue);\r\n const skinSSS = camera.skinSSS && renderQueueHasActiveSkinSSS(renderQueue);\r\n const needSceneColor = renderQueue.needSceneColor();\r\n const needSceneColorWithDepth = renderQueue.needSceneColorWithDepth();\r\n // Requested by materials rather than by a post effect, so it is resolved here\r\n // instead of in resolveFrameResourceRequirements. WebGL1 has no Hi-Z at all,\r\n // and a material asking for one there would turn a missing feature into a\r\n // thrown frame; the material is expected to shade without it.\r\n const needHiZNearest = (renderQueue.needHiZNearest() || camera.HiZNearest) && deviceType !== 'webgl';\r\n return {\r\n depthPrepass: true,\r\n motionVectors: false,\r\n hiZ: needHiZNearest,\r\n hiZNearest: needHiZNearest,\r\n sceneNormal: false,\r\n sceneRoughness: false,\r\n shadowMask: false,\r\n ssr: !!ssr,\r\n ssgi: !!ssgi,\r\n ssrCalcThickness: !!ssr && camera.ssrCalcThickness,\r\n gpuPicking: !!camera.getPickResultResolveFunc(),\r\n needSceneColor,\r\n needSceneColorWithDepth,\r\n needsTransmissionDepthForSSR: !!ssr && needSceneColor && !needSceneColorWithDepth,\r\n sss: !!sss,\r\n skinSSS: !!skinSSS,\r\n fogPresents: !!scene.env.sky?.fogPresents\r\n };\r\n}\r\n\r\nfunction resolveFrameResourceRequirements(\r\n ctx: DrawContext,\r\n options: ForwardPlusOptions,\r\n requirements: FrameResourceRequirements\r\n): void {\r\n const deviceType = ctx.device.type;\r\n options.motionVectors ||= !!requirements.motionVector;\r\n options.hiZNearest ||= !!requirements.hiZNearest;\r\n // The nearest channel lives on the same pyramid, so asking for it is asking\r\n // for the pyramid.\r\n options.hiZ ||= !!requirements.hiZ || options.hiZNearest;\r\n options.sceneNormal ||= !!requirements.sceneNormal;\r\n options.sceneRoughness ||= !!requirements.sceneRoughness;\r\n options.shadowMask ||= !!requirements.shadowMask;\r\n\r\n if (options.motionVectors && deviceType === 'webgl') {\r\n throw new Error('Forward+: MotionVector was requested but is not supported by the WebGL backend.');\r\n }\r\n if (options.hiZ && deviceType === 'webgl') {\r\n throw new Error('Forward+: HiZ was requested but is not supported by the WebGL backend.');\r\n }\r\n if (options.shadowMask && deviceType === 'webgl') {\r\n throw new Error('Forward+: ShadowMask was requested but is not supported by the WebGL backend.');\r\n }\r\n\r\n const surfaceAttachmentCount = Number(options.sceneNormal) + Number(options.sceneRoughness);\r\n if (surfaceAttachmentCount > 0) {\r\n const caps = ctx.device.getDeviceCaps();\r\n const maxDrawBuffers = caps.framebufferCaps.maxDrawBuffers ?? Number.MAX_SAFE_INTEGER;\r\n if (1 + surfaceAttachmentCount > maxDrawBuffers) {\r\n throw new Error(\r\n `Forward+: ${surfaceAttachmentCount} scene surface attachment(s) were requested, ` +\r\n `but the device supports only ${maxDrawBuffers} color attachments.`\r\n );\r\n }\r\n const bytesPerSample =\r\n getTextureFormatBytes(ctx, ctx.colorFormat) +\r\n getTextureFormatBytes(ctx, getSurfaceTextureFormat(ctx)) * surfaceAttachmentCount;\r\n if (bytesPerSample > caps.framebufferCaps.maxColorAttachmentBytesPerSample) {\r\n throw new Error(\r\n `Forward+: requested scene surface attachments require ${bytesPerSample} bytes per sample, ` +\r\n `but the device limit is ${caps.framebufferCaps.maxColorAttachmentBytesPerSample}.`\r\n );\r\n }\r\n }\r\n\r\n ctx.motionVectors = options.motionVectors;\r\n ctx.HiZ = options.hiZ;\r\n ctx.SSGI = options.ssgi;\r\n ctx.screenSpaceShadowMask = options.shadowMask;\r\n ctx.SSS = options.sss;\r\n}\r\n\r\nfunction validateProducedFrameResources(\r\n blackboard: RGBlackboard,\r\n options: ForwardPlusOptions,\r\n renderQueue: RenderQueue\r\n): void {\r\n const required: Array<[boolean, FrameResourceKey]> = [\r\n [options.motionVectors, FrameResources.MotionVector],\r\n [options.hiZ, FrameResources.HiZ],\r\n [options.sceneNormal, FrameResources.SceneNormal],\r\n [options.sceneRoughness, FrameResources.SceneRoughness],\r\n [options.shadowMask && renderQueue.shadowedLights.length > 0, FrameResources.ShadowMask]\r\n ];\r\n for (const [needed, resource] of required) {\r\n if (needed && !blackboard.has(resource)) {\r\n throw new Error(\r\n `Forward+: frame resource \"${resource}\" was requested but no enabled RenderModule produced it.`\r\n );\r\n }\r\n }\r\n}\r\n\r\n/** Mutable state shared by pass callbacks for one frame. @public */\r\nexport interface FrameState {\r\n ctx: DrawContext;\r\n renderQueue: RenderQueue;\r\n depthFramebuffer: Nullable<FrameBuffer>;\r\n sunLightColor: Nullable<any>;\r\n options: ForwardPlusOptions;\r\n renderQueueDisposed: boolean;\r\n clusteredLightReleased: boolean;\r\n sunLightRestored: boolean;\r\n}\r\n\r\ninterface ForwardPlusGraphBuildResult {\r\n backbuffer: RGHandle;\r\n frame: FrameState;\r\n externalDepthImport?: { handle: RGHandle; texture: Texture2D };\r\n}\r\n\r\ninterface HistoryReadBinding {\r\n name: string;\r\n handle: RGHandle;\r\n}\r\n\r\n/** Result of the depth prepass module. @public */\r\nexport interface DepthPrepassResult {\r\n depthHandle: RGHandle;\r\n motionVectorHandle?: RGHandle;\r\n graphDepthAttachmentHandle?: RGHandle;\r\n externalDepthAttachmentHandle?: RGHandle;\r\n externalDepthAttachment: Nullable<Texture2D>;\r\n depthFramebufferHandle: RGHandle;\r\n}\r\n\r\n/** Result of the main light pass module. @public */\r\nexport interface LightPassResult {\r\n sceneColorHandle: RGHandle;\r\n sceneColorFramebufferHandle?: RGHandle;\r\n sceneRoughnessHandle?: RGHandle;\r\n sceneNormalHandle?: RGHandle;\r\n sssDiffuseHandle?: RGHandle;\r\n sssTransmissionHandle?: RGHandle;\r\n skinSSSHandle?: RGHandle;\r\n}\r\n\r\n/** Non-resource state shared while Forward+ modules build. @public */\r\nexport interface ForwardPlusBuildState {\r\n /** Depth prepass outputs. */\r\n depth?: DepthPrepassResult;\r\n /** Depth attachment used by scene-color/SSS framebuffers (handle or backend texture). */\r\n renderDepthAttachment: Nullable<RGTextureAttachment>;\r\n /** True when the scene renders directly into the final framebuffer. */\r\n useFinalFramebufferAsIntermediate: boolean;\r\n /** Ordering token from the pre-light transmission-depth pass, if any. */\r\n preLightTransmissionDepthToken?: RGHandle;\r\n /** History textures kept in a read scope while the light pass executes. */\r\n lightHistoryReadBindings: HistoryReadBinding[];\r\n /** Main light pass outputs. */\r\n lightPass?: LightPassResult;\r\n /** Graph output handle produced by the composite tail. */\r\n presentedBackbuffer?: RGHandle;\r\n}\r\n\r\n/** Require state produced by an earlier module. @internal */\r\nfunction requireBuildState<K extends keyof ForwardPlusBuildState>(\r\n fg: FrameGraphContext,\r\n key: K,\r\n producerType: string,\r\n consumerType: string\r\n): NonNullable<ForwardPlusBuildState[K]> {\r\n const value = fg.state[key];\r\n if (!value) {\r\n throw new Error(\r\n `Forward+ module \"${consumerType}\" requires module \"${producerType}\" ` +\r\n `(build state \"${String(key)}\" was not produced). Did you remove it from the pipeline?`\r\n );\r\n }\r\n return value;\r\n}\r\n\r\n/** @internal */\r\nconst SkyUpdateModule: RenderModule<FrameGraphContext> = {\r\n type: 'SkyUpdate',\r\n prepare: () => ({ enabled: true }),\r\n setup({ graph, ctx, frame, ordering }: FrameGraphContext) {\r\n graph.addPass('SkyUpdate', (builder) => {\r\n ordering.emit(builder, 'SkyUpdateDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n frame.sunLightColor = ctx.scene.env.sky.update(ctx);\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ClusterLightsModule: RenderModule<FrameGraphContext> = {\r\n type: 'ClusterLights',\r\n prepare: () => ({ enabled: true }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('ClusterLights', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'ClusterLightsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n ctx.clusteredLight = getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(\r\n ctx.camera,\r\n renderQueue,\r\n ctx.screenSpaceShadowMask,\r\n ShaderHelper.getPreExposure(ctx)\r\n );\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst GPUPickingModule: RenderModule<FrameGraphContext> = {\r\n type: 'GPUPicking',\r\n prepare: ({ options }) => ({ enabled: options.gpuPicking }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('GPUPicking', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'GPUPickingDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n const pickResolveFunc = ctx.camera.getPickResultResolveFunc();\r\n if (pickResolveFunc) {\r\n renderObjectColors(ctx, pickResolveFunc, renderQueue);\r\n }\r\n });\r\n });\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ShadowMapsModule: RenderModule<FrameGraphContext> = {\r\n type: 'ShadowMaps',\r\n // Light-owned shadow maps are observable side effects.\r\n prepare: ({ renderQueue }) => ({ enabled: renderQueue.shadowedLights.length > 0 }),\r\n setup({ graph, ctx, renderQueue, ordering }: FrameGraphContext) {\r\n graph.addPass('ShadowMaps', (builder) => {\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'ShadowMapsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n });\r\n });\r\n }\r\n};\r\n\r\n/**\r\n * Picks the water surface and light the caustic map is built from.\r\n *\r\n * Only one pair is handled per frame: the caustics ride on a single light's\r\n * additive pass, and a second water body would need a second map. The largest\r\n * visible water surface wins, which is the one a camera near several of them is\r\n * most likely to be looking through.\r\n * @internal\r\n */\r\nfunction selectWaterCausticSource(\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue\r\n): Nullable<{ waters: Water[]; light: PunctualLight }> {\r\n if (ctx.device.type === 'webgl' || renderQueue.waters.length === 0) {\r\n return null;\r\n }\r\n // The caustic light must own an additive shadow pass, because that is the pass\r\n // the caustic uniforms are declared and bound on.\r\n const candidate = renderQueue.sunLight ?? renderQueue.primaryDirectionalLight;\r\n const light =\r\n candidate && candidate.castShadow && renderQueue.shadowedLights.indexOf(candidate) >= 0\r\n ? candidate\r\n : null;\r\n if (!light) {\r\n return null;\r\n }\r\n const waters = renderQueue.waters.filter((water) => WaterCausticsRenderer.canRender(water, light));\r\n if (waters.length === 0) {\r\n return null;\r\n }\r\n // Largest first, which decides both what survives the cap and which body's\r\n // settings describe the shared map. Area is a stand-in for \"the one the viewer\r\n // is most likely to be over\"; a camera-distance sort would swap the map's\r\n // whole configuration as the viewer walks between two pools, and swapping it\r\n // discards the temporal history every time.\r\n waters.sort((a, b) => {\r\n const ra = a.material.region;\r\n const rb = b.material.region;\r\n const areaA = Math.max(0, ra.z - ra.x) * Math.max(0, ra.w - ra.y);\r\n const areaB = Math.max(0, rb.z - rb.x) * Math.max(0, rb.w - rb.y);\r\n return areaB - areaA;\r\n });\r\n return { waters: waters.slice(0, MAX_CAUSTIC_WATERS), light };\r\n}\r\n\r\n/** @internal */\r\nconst WaterCausticsModule: RenderModule<FrameGraphContext> = {\r\n type: 'WaterCaustics',\r\n writes: [FrameResources.WaterCaustics],\r\n prepare: ({ ctx, renderQueue }) => ({ enabled: !!selectWaterCausticSource(ctx, renderQueue) }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, renderQueue, ordering, blackboard } = fg;\r\n const source = selectWaterCausticSource(ctx, renderQueue)!;\r\n // Map-wide settings come from the largest body; see selectWaterCausticSource.\r\n const material = source.waters[0].material;\r\n const size = material.causticsResolution;\r\n const format = WaterCausticsRenderer.getMapFormat(ctx.device);\r\n const history = fg.history;\r\n const temporal = material.causticsTemporalStrength > 0;\r\n const mapDesc: RGTextureDesc = { format, sizeMode: 'absolute', width: size, height: size };\r\n const mapSize: RGResolvedSize = { width: size, height: size };\r\n // Null on the first frame, after a resize, and whenever the map format\r\n // changes; the renderer falls back to the current frame alone.\r\n const previousHandle =\r\n temporal && history\r\n ? history.importPreviousIfCompatible(graph, RGHistoryResources.WATER_CAUSTICS, mapDesc, mapSize)\r\n : null;\r\n const result = graph.addPass('WaterCaustics', (builder) => {\r\n // The wave textures the splat pass samples are updated by the scene, not by\r\n // the graph, so chain after the passes that have already run rather than\r\n // declaring a resource dependency on them.\r\n ordering.chainInto(builder);\r\n ordering.emit(builder, 'WaterCausticsDone');\r\n // The map leaves the graph through the draw context rather than through a\r\n // handle a later pass samples, so nothing would otherwise keep this alive.\r\n builder.sideEffect();\r\n // Fixed-size, unlike almost every other graph texture: the map covers a\r\n // world-space footprint, not the screen.\r\n const mapHandle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: size,\r\n height: size,\r\n label: 'waterCaustics',\r\n allocationKey: 'ForwardPlus.WaterCaustics'\r\n });\r\n const scratchHandle = builder.createTexture({\r\n format,\r\n sizeMode: 'absolute',\r\n width: size,\r\n height: size,\r\n label: 'waterCausticsScratch',\r\n allocationKey: 'ForwardPlus.WaterCausticsScratch'\r\n });\r\n // The displaced surface height along each map ray, which the receiver\r\n // gates its depth on. Same slice and size as the map so it shares the\r\n // map's uv; four channels, one per water slot.\r\n const heightHandle = builder.createTexture({\r\n format: WaterCausticsRenderer.getHeightMapFormat(),\r\n sizeMode: 'absolute',\r\n width: size,\r\n height: size,\r\n label: 'waterCausticHeights',\r\n allocationKey: 'ForwardPlus.WaterCausticHeights'\r\n });\r\n if (previousHandle) {\r\n builder.read(previousHandle);\r\n }\r\n builder.setExecute((rgCtx) => {\r\n const map = rgCtx.getTexture<Texture2D>(mapHandle);\r\n const scratch = rgCtx.getTexture<Texture2D>(scratchHandle);\r\n const heights = rgCtx.getTexture<Texture2D>(heightHandle);\r\n const previous = previousHandle ? rgCtx.getTexture<Texture2D>(previousHandle) : null;\r\n const resolved = _waterCausticsRenderer.render(\r\n ctx,\r\n source.waters,\r\n source.light,\r\n map,\r\n scratch,\r\n heights,\r\n previous,\r\n (texture: Texture2D) =>\r\n rgCtx.createFramebuffer({\r\n width: texture.width,\r\n height: texture.height,\r\n colorAttachments: texture,\r\n depthAttachment: null\r\n })\r\n );\r\n if (temporal && history) {\r\n // Commit whichever texture the renderer settled on, so the next frame\r\n // reprojects the map that was actually shown rather than the\r\n // pre-resolve one.\r\n history.queueRetainedCommit(RGHistoryResources.WATER_CAUSTICS, mapDesc, mapSize, resolved);\r\n }\r\n // Publish only after the map exists: the light pass keys its shader\r\n // variant on this flag and binds the texture in the same step.\r\n ctx.waterCaustics = true;\r\n ctx.waterCausticLight = source.light;\r\n ctx.waterCausticTexture = resolved;\r\n ctx.waterCausticHeightTexture = heights;\r\n ctx.waterCausticUniforms = _waterCausticsRenderer.uniforms;\r\n });\r\n return { mapHandle, scratchHandle };\r\n });\r\n // Which target holds the result depends on whether the resolve ran. Both are\r\n // declared by this pass, so either is a valid handle for consumers to read.\r\n blackboard.set(\r\n FrameResources.WaterCaustics,\r\n temporal && previousHandle ? result.scratchHandle : result.mapHandle\r\n );\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst DepthPrepassModule: RenderModule<FrameGraphContext> = {\r\n type: 'DepthPrepass',\r\n writes: [FrameResources.LinearDepth, FrameResources.MotionVector, FrameResources.SceneDepthAttachment],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, ordering, blackboard, options } = fg;\r\n const result = graph.addPass('DepthPrepass', (builder) => {\r\n ordering.chainInto(builder);\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n\r\n const depthHandle = builder.createTexture({\r\n format,\r\n label: 'linearDepth',\r\n allocationKey: 'ForwardPlus.LinearDepth'\r\n });\r\n const motionVectorHandle = options.motionVectors\r\n ? builder.createTexture({\r\n format: mvFormat,\r\n label: 'motionVector',\r\n allocationKey: 'ForwardPlus.MotionVector'\r\n })\r\n : undefined;\r\n const finalDepthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const externalDepthAttachment = finalDepthAttachment?.isTexture2D()\r\n ? (finalDepthAttachment as Texture2D)\r\n : null;\r\n const externalDepthAttachmentHandle = externalDepthAttachment\r\n ? graph.importTexture('externalSceneDepth')\r\n : undefined;\r\n const graphDepthAttachmentHandle = externalDepthAttachment\r\n ? undefined\r\n : builder.createTexture({\r\n format: ctx.depthFormat,\r\n label: 'sceneDepth',\r\n allocationKey: 'ForwardPlus.SceneDepth'\r\n });\r\n const depthAttachmentOrFormat =\r\n externalDepthAttachmentHandle ?? graphDepthAttachmentHandle ?? ctx.depthFormat;\r\n const depthFramebufferHandle = builder.createFramebuffer({\r\n label: 'DepthPrepassFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle ? [depthHandle, motionVectorHandle] : depthHandle,\r\n depthAttachment: depthAttachmentOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n const skyMotionVectorFramebufferHandle = motionVectorHandle\r\n ? builder.createFramebuffer({\r\n label: 'SkyMotionVectorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: motionVectorHandle,\r\n depthAttachment: depthAttachmentOrFormat\r\n })\r\n : undefined;\r\n\r\n builder.addSubpass('SceneDepth', (rgCtx) => {\r\n const depthFramebuffer = rgCtx.getFramebuffer(depthFramebufferHandle);\r\n frame.depthFramebuffer = renderSceneDepth(\r\n frame,\r\n depthFramebuffer,\r\n rgCtx,\r\n undefined,\r\n undefined,\r\n false\r\n );\r\n });\r\n if (skyMotionVectorFramebufferHandle) {\r\n builder.addSubpass('SkyMotionVectors', (rgCtx) => {\r\n renderSkyMotionVectors(ctx, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n // After the sky, which writes at the far plane: a blended surface in\r\n // front of empty background has to replace what the sky put there.\r\n builder.addSubpass('TransparentMotionVectors', (rgCtx) => {\r\n renderTransparentMotionVectors(frame, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n }\r\n\r\n return {\r\n depthHandle,\r\n motionVectorHandle,\r\n graphDepthAttachmentHandle,\r\n externalDepthAttachmentHandle,\r\n externalDepthAttachment,\r\n depthFramebufferHandle\r\n };\r\n });\r\n\r\n fg.state.depth = result;\r\n // Depth mutations re-register their versions through the blackboard.\r\n blackboard.set(FrameResources.LinearDepth, result.depthHandle);\r\n if (result.motionVectorHandle) {\r\n blackboard.set(FrameResources.MotionVector, result.motionVectorHandle);\r\n }\r\n blackboard.set(\r\n FrameResources.SceneDepthAttachment,\r\n result.graphDepthAttachmentHandle ?? result.externalDepthAttachmentHandle!\r\n );\r\n // Later modules share this attachment without owning it.\r\n fg.state.renderDepthAttachment =\r\n result.graphDepthAttachmentHandle ?? result.externalDepthAttachmentHandle ?? null;\r\n // Opaque effects require a texture and may require surface MRT attachments.\r\n const opaqueLayerHasEffects = !!ctx.compositor?.layerHasEnabledEffect(PostEffectLayer.opaque);\r\n fg.state.useFinalFramebufferAsIntermediate =\r\n !!result.externalDepthAttachment &&\r\n result.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment() &&\r\n !opaqueLayerHasEffects;\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst ShadowMaskModule: RenderModule<FrameGraphContext> = {\r\n type: 'ShadowMaskPass',\r\n writes: [FrameResources.ShadowMask],\r\n // shadowMapInfo is populated at execute time and cannot gate graph building.\r\n prepare: ({ ctx, options, renderQueue }) => ({\r\n enabled: options.shadowMask && renderQueue.shadowedLights.length > 0,\r\n requirements: {\r\n shadowMask:\r\n ctx.device.type !== 'webgl' &&\r\n ctx.camera.screenSpaceShadowMask &&\r\n renderQueue.shadowedLights.length > 0\r\n }\r\n }),\r\n setup(fg: FrameGraphContext) {\r\n // Four shadow lights share each RGBA8 layer in clustered-light order.\r\n const { graph, ctx, renderQueue, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'ShadowMaskPass');\r\n const numShadowLights = renderQueue.shadowedLights.length;\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numShadowLights);\r\n const maskPassResult = graph.addPass('ShadowMaskPass', (builder) => {\r\n // Capture the depth version declared at this pipeline position.\r\n const maskDepthHandle = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(maskDepthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // Per-layer framebuffers are temporary views of this graph texture.\r\n const maskHandle = builder.createTexture({\r\n format: 'rgba8unorm',\r\n label: 'shadowMask',\r\n arrayLayers: numLayers,\r\n allocationKey: 'ForwardPlus.ShadowMask'\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const depthTex = rgCtx.getTexture<Texture2D>(maskDepthHandle);\r\n const maskTex = rgCtx.getTexture<Texture2DArray>(maskHandle);\r\n _shadowMaskRenderer.render(ctx, depthTex, renderQueue.shadowedLights, (layer) =>\r\n rgCtx.createFramebuffer({\r\n width: maskTex.width,\r\n height: maskTex.height,\r\n colorAttachments: maskTex,\r\n depthAttachment: null,\r\n attachmentLayer: layer\r\n })\r\n );\r\n });\r\n return { maskHandle };\r\n });\r\n blackboard.set(FrameResources.ShadowMask, maskPassResult.maskHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst TransmissionDepthForSSRModule: RenderModule<FrameGraphContext> = {\r\n type: 'TransmissionDepthForSSR',\r\n writes: [FrameResources.LinearDepth],\r\n prepare: ({ options }) => ({ enabled: options.needsTransmissionDepthForSSR }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'TransmissionDepthForSSR');\r\n const transmissionDepthResult = graph.addPass('TransmissionDepthForSSR', (builder) => {\r\n const currentDepth = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(currentDepth);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // Version the in-place depth mutation for downstream dependencies.\r\n const depthOut = builder.write(currentDepth);\r\n const done = builder.createToken('TransmissionDepthForSSRDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return { done, depthOut };\r\n });\r\n fg.state.preLightTransmissionDepthToken = transmissionDepthResult.done;\r\n // Publish the post-transmission depth version.\r\n blackboard.set(FrameResources.LinearDepth, transmissionDepthResult.depthOut);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst HiZModule: RenderModule<FrameGraphContext> = {\r\n type: 'HiZ',\r\n writes: [FrameResources.HiZ],\r\n prepare: ({ options }) => ({ enabled: options.hiZ }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'HiZ');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n //const hiZWidth = nextPowerOf2(ctx.renderWidth);\r\n //const hiZHeight = nextPowerOf2(ctx.renderHeight);\r\n let hiZHandle: RGTextureHandle | undefined;\r\n graph.addPass('HiZ', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n hiZHandle = builder.createTexture({\r\n format: getHiZFormat(options.hiZNearest),\r\n label: 'hiZ',\r\n sizeMode: 'backbuffer-relative',\r\n mipLevels: getFullMipLevelCount(ctx.renderWidth, ctx.renderHeight),\r\n // Keyed on the channel count: a one- and a two-channel pyramid are\r\n // different textures, and pooling them under one key would hand a\r\n // consumer a pyramid with no nearest channel in it.\r\n allocationKey: `ForwardPlus.HiZ${options.hiZNearest ? '.MinMax' : ''}`\r\n });\r\n const hiZFramebufferHandle = builder.createFramebuffer({\r\n label: 'HiZFramebuffer',\r\n colorAttachments: hiZHandle,\r\n depthAttachment: null\r\n });\r\n builder.setExecute((rgCtx) => {\r\n const passCtx = frame.ctx;\r\n // Resolve the declared handle, not mutable framebuffer state.\r\n const depthFb = rgCtx.getFramebuffer(depthPassResult.depthFramebufferHandle);\r\n const depthTex = depthFb.getDepthAttachment() as Texture2D;\r\n if (!depthTex) {\r\n throw new Error('HiZ pass: depth prepass framebuffer has no depth attachment.');\r\n }\r\n const hiZTex = rgCtx.getTexture<Texture2D>(hiZHandle!);\r\n const HiZFrameBuffer = rgCtx.getFramebuffer(hiZFramebufferHandle);\r\n buildHiZ(depthTex, HiZFrameBuffer);\r\n passCtx.HiZTexture = hiZTex;\r\n });\r\n });\r\n if (hiZHandle) {\r\n blackboard.set(FrameResources.HiZ, hiZHandle);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SSSProfileModule: RenderModule<FrameGraphContext> = {\r\n type: 'SSSProfile',\r\n prepare: ({ options }) => ({ enabled: options.sss }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SSSProfile');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const waterCausticsHandle = blackboard.get(FrameResources.WaterCaustics);\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const sssProfileResult = graph.addPass('SSSProfile', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n if (waterCausticsHandle) {\r\n // Same reason as the shadow mask: the map reaches the shader through\r\n // ctx.waterCausticTexture, so only a declared read stops the executor\r\n // from recycling it while this pass is still sampling it.\r\n builder.read(waterCausticsHandle);\r\n }\r\n const profileHandle = builder.createTexture({\r\n format: 'rgba16f',\r\n label: 'sssProfile',\r\n allocationKey: 'ForwardPlus.SSSProfile'\r\n });\r\n const paramHandle = builder.createTexture({\r\n format: 'rgba8unorm',\r\n label: 'sssParam',\r\n allocationKey: 'ForwardPlus.SSSParam'\r\n });\r\n const colorAttachments = [ctx.colorFormat!, profileHandle, paramHandle];\r\n const framebufferHandle = builder.createFramebuffer({\r\n label: 'SSSProfileFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderForwardSSSProfile(\r\n frame,\r\n rgCtx.getFramebuffer(framebufferHandle),\r\n rgCtx.getTexture<Texture2D>(profileHandle),\r\n rgCtx.getTexture<Texture2D>(paramHandle),\r\n null\r\n );\r\n });\r\n\r\n return {\r\n profileHandle,\r\n paramHandle,\r\n framebufferHandle\r\n };\r\n });\r\n blackboard.set(FrameResources.SSSProfile, sssProfileResult.profileHandle);\r\n blackboard.set(FrameResources.SSSParam, sssProfileResult.paramHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SceneColorGrabModule: RenderModule<FrameGraphContext> = {\r\n type: 'SceneColorGrab',\r\n prepare: ({ options }) => ({ enabled: options.needSceneColor }),\r\n setup(fg: FrameGraphContext) {\r\n // Refraction samples this non-transmission scene copy.\r\n const { graph, ctx, frame, blackboard, options } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SceneColorGrab');\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const waterCausticsHandle = blackboard.get(FrameResources.WaterCaustics);\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const grabResult = graph.addPass('SceneColorGrab', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n if (waterCausticsHandle) {\r\n // Same reason as the shadow mask: the map reaches the shader through\r\n // ctx.waterCausticTexture, so only a declared read stops the executor\r\n // from recycling it while this pass is still sampling it.\r\n builder.read(waterCausticsHandle);\r\n }\r\n // A few mip levels, because the refraction background is sampled at a LOD\r\n // and not only at mip 0: water picks one from how deep and how turbid the\r\n // column is, so a stone under clear shallows stays sharp while the same\r\n // stone under metres of silt smears. With a single-level texture the\r\n // sampler returned mip 0 whatever LOD was asked for, and the blur did\r\n // nothing.\r\n //\r\n // Nothing here generates the chain - both backends do it when the\r\n // framebuffer is unbound, for any colour attachment with more than one\r\n // level (WebGL `framebuffer_webgl.ts` unbind, WebGPU `renderpass_webgpu.ts`\r\n // end), and `generateMipmaps` defaults to true on colour attachments. The\r\n // level count is the whole precondition.\r\n //\r\n // Not the full chain down to 1x1. The consumer clamps its LOD, and the\r\n // coarsest levels of a full chain average across the whole frame - a\r\n // sample from one stops being \"what is behind the water\" and becomes the\r\n // mean of the image. Generating them would cost bandwidth every frame to\r\n // produce levels nothing may read.\r\n const copyHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorCopy',\r\n mipLevels: getSceneColorMipLevelCount(ctx.renderWidth, ctx.renderHeight),\r\n allocationKey: 'ForwardPlus.SceneColorCopy'\r\n });\r\n // Isolate depth when SSR inserts transmission depth before LightPass.\r\n const copyFramebufferHandle = !options.needsTransmissionDepthForSSR\r\n ? builder.createFramebuffer({\r\n label: 'SceneColorCopyFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: copyHandle,\r\n depthAttachment: renderDepthAttachment,\r\n ignoreDepthStencil: false\r\n })\r\n : undefined;\r\n builder.setExecute((rgCtx) => {\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderSceneColorGrab(frame, rgCtx, copyHandle, copyFramebufferHandle);\r\n });\r\n return { copyHandle, copyFramebufferHandle };\r\n });\r\n blackboard.set(FrameResources.SceneColorCopy, grabResult.copyHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst LightPassModule: RenderModule<FrameGraphContext> = {\r\n type: 'LightPass',\r\n writes: [\r\n FrameResources.SceneColor,\r\n FrameResources.SceneRoughness,\r\n FrameResources.SceneNormal,\r\n FrameResources.SSSDiffuse,\r\n FrameResources.SSSTransmission,\r\n FrameResources.SkinSSS\r\n ],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options, backbuffer } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'LightPass');\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const waterCausticsHandle = blackboard.get(FrameResources.WaterCaustics);\r\n const preLightTransmissionDepthToken = fg.state.preLightTransmissionDepthToken;\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n const sssProfileHandle = blackboard.get(FrameResources.SSSProfile);\r\n const sssParamHandle = blackboard.get(FrameResources.SSSParam);\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const useFinalFramebufferAsIntermediate = fg.state.useFinalFramebufferAsIntermediate;\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const historyManager = fg.history;\r\n\r\n // Keep SSR history scoped while the light pass executes.\r\n const lightHistoryReadBindings = fg.state.lightHistoryReadBindings;\r\n const historySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n if (historyManager && options.ssr && ctx.camera?.ssrTemporal && options.motionVectors) {\r\n const reflectHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_REFLECT,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n const motionVectorHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSR_MOTION_VECTOR,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n historySize\r\n );\r\n if (reflectHistoryHandle && motionVectorHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSR_REFLECT, handle: reflectHistoryHandle },\r\n { name: RGHistoryResources.SSR_MOTION_VECTOR, handle: motionVectorHistoryHandle }\r\n );\r\n }\r\n }\r\n if (historyManager && options.ssgi) {\r\n const ssgiHistorySize = { width: ctx.renderWidth, height: ctx.renderHeight };\r\n const irradianceHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_IRRADIANCE,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n ssgiHistorySize\r\n );\r\n const surfaceHistoryHandle = historyManager.importPreviousIfCompatible(\r\n graph,\r\n RGHistoryResources.SSGI_SURFACE,\r\n {\r\n format: 'rgba16f',\r\n sizeMode: 'absolute',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight\r\n },\r\n ssgiHistorySize\r\n );\r\n if (irradianceHistoryHandle && surfaceHistoryHandle) {\r\n lightHistoryReadBindings.push(\r\n { name: RGHistoryResources.SSGI_IRRADIANCE, handle: irradianceHistoryHandle },\r\n { name: RGHistoryResources.SSGI_SURFACE, handle: surfaceHistoryHandle }\r\n );\r\n }\r\n }\r\n\r\n const opaquePassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (shadowMaskHandle) {\r\n builder.read(shadowMaskHandle);\r\n }\r\n if (waterCausticsHandle) {\r\n // Same reason as the shadow mask: the map reaches the shader through\r\n // ctx.waterCausticTexture, so only a declared read stops the executor\r\n // from recycling it while this pass is still sampling it.\r\n builder.read(waterCausticsHandle);\r\n }\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n if (hiZHandle) {\r\n builder.read(hiZHandle);\r\n }\r\n for (const binding of lightHistoryReadBindings) {\r\n builder.read(binding.handle);\r\n }\r\n\r\n // Direct rendering writes the backbuffer; otherwise create a texture.\r\n const sceneColorHandle = useFinalFramebufferAsIntermediate\r\n ? builder.write(backbuffer)\r\n : builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColor',\r\n allocationKey: 'ForwardPlus.SceneColor'\r\n });\r\n\r\n if (sceneColorCopyHandle) {\r\n builder.read(sceneColorCopyHandle);\r\n }\r\n if (sssProfileHandle) {\r\n builder.read(sssProfileHandle);\r\n }\r\n if (sssParamHandle) {\r\n builder.read(sssParamHandle);\r\n }\r\n const surfaceAttachmentCount = Number(options.sceneRoughness) + Number(options.sceneNormal);\r\n // Surface MRT products are exposed through blackboard handles.\r\n const sceneRoughnessHandle = options.sceneRoughness\r\n ? builder.createTexture({\r\n format: getSurfaceTextureFormat(ctx),\r\n label: 'sceneRoughness',\r\n allocationKey: 'ForwardPlus.SceneRoughness'\r\n })\r\n : undefined;\r\n const sceneNormalHandle = options.sceneNormal\r\n ? builder.createTexture({\r\n format: getSurfaceTextureFormat(ctx),\r\n label: 'sceneNormal',\r\n allocationKey: 'ForwardPlus.SceneNormal'\r\n })\r\n : undefined;\r\n const writeSSSDiffuse = options.sss && shouldStoreSSSDiffuse(ctx);\r\n let writeSSSTransmission = options.sss && shouldStoreSSSTransmission(ctx);\r\n if (\r\n writeSSSDiffuse &&\r\n writeSSSTransmission &&\r\n surfaceAttachmentCount > 0 &&\r\n getSSSLightingTextureFormat(ctx, 2, surfaceAttachmentCount) !== ctx.colorFormat\r\n ) {\r\n writeSSSTransmission = false;\r\n }\r\n const writeSkinSSS = options.skinSSS;\r\n const sssLightingAttachmentCount =\r\n (writeSSSDiffuse ? 1 : 0) + (writeSSSTransmission ? 1 : 0) + (writeSkinSSS ? 1 : 0);\r\n const sssLightingFormat = getSSSLightingTextureFormat(\r\n ctx,\r\n sssLightingAttachmentCount,\r\n surfaceAttachmentCount\r\n );\r\n const sssDiffuseHandle = writeSSSDiffuse\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'sssDiffuse',\r\n allocationKey: 'ForwardPlus.SSSDiffuse'\r\n })\r\n : undefined;\r\n const sssTransmissionHandle = writeSSSTransmission\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'sssTransmission',\r\n allocationKey: 'ForwardPlus.SSSTransmission'\r\n })\r\n : undefined;\r\n const skinSSSHandle = writeSkinSSS\r\n ? builder.createTexture({\r\n format: sssLightingFormat,\r\n label: 'skinSSS',\r\n allocationKey: 'ForwardPlus.SkinSSS'\r\n })\r\n : undefined;\r\n const sceneColorFramebufferHandle = useFinalFramebufferAsIntermediate\r\n ? undefined\r\n : builder.createFramebuffer({\r\n label: 'SceneColorFramebuffer',\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: sceneColorHandle,\r\n depthAttachment: renderDepthAttachment\r\n });\r\n\r\n builder.setExecute((rgCtx) => {\r\n const sceneColorTex = rgCtx.getTexture<Texture2D>(sceneColorHandle);\r\n const sceneColorCopyTex = sceneColorCopyHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneColorCopyHandle)\r\n : null;\r\n // Legacy effects still read resolved MRT textures from DrawContext.\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n ctx.HiZTexture = hiZHandle ? rgCtx.getTexture<Texture2D>(hiZHandle) : null;\r\n ctx.SceneRoughnessTexture = sceneRoughnessHandle\r\n ? rgCtx.getTexture<Texture2D>(sceneRoughnessHandle)\r\n : null;\r\n ctx.SceneNormalTexture = sceneNormalHandle ? rgCtx.getTexture<Texture2D>(sceneNormalHandle) : null;\r\n ctx.SSSProfileTexture = sssProfileHandle ? rgCtx.getTexture<Texture2D>(sssProfileHandle) : null;\r\n ctx.SSSParamTexture = sssParamHandle ? rgCtx.getTexture<Texture2D>(sssParamHandle) : null;\r\n ctx.SSSDiffuseTexture = sssDiffuseHandle ? rgCtx.getTexture<Texture2D>(sssDiffuseHandle) : null;\r\n ctx.SSSTransmissionTexture = sssTransmissionHandle\r\n ? rgCtx.getTexture<Texture2D>(sssTransmissionHandle)\r\n : null;\r\n ctx.SkinSSSTexture = skinSSSHandle ? rgCtx.getTexture<Texture2D>(skinSSSHandle) : null;\r\n const renderLightPass = () =>\r\n renderOpaqueScenePass(frame, sceneColorTex, sceneColorCopyTex, rgCtx, sceneColorFramebufferHandle);\r\n if (historyManager && lightHistoryReadBindings.length > 0) {\r\n const ssgiIrradianceBinding = lightHistoryReadBindings.find(\r\n (binding) => binding.name === RGHistoryResources.SSGI_IRRADIANCE\r\n );\r\n const ssgiSurfaceBinding = lightHistoryReadBindings.find(\r\n (binding) => binding.name === RGHistoryResources.SSGI_SURFACE\r\n );\r\n ctx.SSGIIrradianceHistoryTexture = ssgiIrradianceBinding\r\n ? rgCtx.getTexture<Texture2D>(ssgiIrradianceBinding.handle)\r\n : null;\r\n ctx.SSGISurfaceHistoryTexture = ssgiSurfaceBinding\r\n ? rgCtx.getTexture<Texture2D>(ssgiSurfaceBinding.handle)\r\n : null;\r\n historyManager.beginReadScope(\r\n lightHistoryReadBindings.map((binding) => ({\r\n name: binding.name,\r\n texture: rgCtx.getTexture<Texture2D>(binding.handle)\r\n }))\r\n );\r\n try {\r\n renderLightPass();\r\n } finally {\r\n historyManager.endReadScope();\r\n ctx.SSGIIrradianceHistoryTexture = null;\r\n ctx.SSGISurfaceHistoryTexture = null;\r\n }\r\n } else {\r\n renderLightPass();\r\n }\r\n });\r\n\r\n return {\r\n sceneColorHandle,\r\n sceneColorFramebufferHandle,\r\n sceneRoughnessHandle,\r\n sceneNormalHandle,\r\n sssDiffuseHandle,\r\n sssTransmissionHandle,\r\n skinSSSHandle\r\n };\r\n });\r\n const lightPassResult: LightPassResult = opaquePassResult;\r\n fg.state.lightPass = lightPassResult;\r\n blackboard.set(FrameResources.SceneColor, lightPassResult.sceneColorHandle);\r\n if (lightPassResult.sceneRoughnessHandle) {\r\n blackboard.set(FrameResources.SceneRoughness, lightPassResult.sceneRoughnessHandle);\r\n }\r\n if (lightPassResult.sceneNormalHandle) {\r\n blackboard.set(FrameResources.SceneNormal, lightPassResult.sceneNormalHandle);\r\n }\r\n if (lightPassResult.sssDiffuseHandle) {\r\n blackboard.set(FrameResources.SSSDiffuse, lightPassResult.sssDiffuseHandle);\r\n }\r\n if (lightPassResult.sssTransmissionHandle) {\r\n blackboard.set(FrameResources.SSSTransmission, lightPassResult.sssTransmissionHandle);\r\n }\r\n if (lightPassResult.skinSSSHandle) {\r\n blackboard.set(FrameResources.SkinSSS, lightPassResult.skinSSSHandle);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst SkyPassModule: RenderModule<FrameGraphContext> = {\r\n type: 'SkyPass',\r\n reads: [{ resource: FrameResources.SceneColor, version: 'current' }],\r\n writes: [FrameResources.SceneColor, FrameResources.SceneColorNoFog],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'SkyPass');\r\n const lightPassResult = requireBuildState(fg, 'lightPass', 'LightPass', 'SkyPass');\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const sceneColorHandle = blackboard.expect(FrameResources.SceneColor);\r\n // Screen-space passes must not read fog as surface radiance. Snapshot the lit\r\n // scene with sky but before fog, and only when fog is actually present and a\r\n // consumer exists, so fog-free scenes allocate nothing extra. The refraction\r\n // background path already baked sky and fog into the copy, so no fog-free\r\n // version can be recovered there and consumers keep their existing input.\r\n const captureNoFog = !sceneColorCopyHandle && (options.ssgi || options.ssr) && options.fogPresents;\r\n\r\n const skyPassResult = graph.addPass('SkyPass', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n const noFog = captureNoFog\r\n ? builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorNoFog',\r\n allocationKey: 'ForwardPlus.SceneColorNoFog'\r\n })\r\n : null;\r\n const out = builder.write(sceneColorHandle);\r\n builder.setExecute((rgCtx) => {\r\n // The refraction background already contains sky and fog.\r\n if (!sceneColorCopyHandle) {\r\n renderSkyScenePass(\r\n frame,\r\n rgCtx,\r\n lightPassResult.sceneColorFramebufferHandle,\r\n noFog ? rgCtx.getTexture<Texture2D>(noFog) : null\r\n );\r\n }\r\n });\r\n return { color: out, noFog };\r\n });\r\n\r\n lightPassResult.sceneColorHandle = skyPassResult.color;\r\n blackboard.set(FrameResources.SceneColor, skyPassResult.color);\r\n if (skyPassResult.noFog) {\r\n blackboard.set(FrameResources.SceneColorNoFog, skyPassResult.noFog);\r\n }\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst UnderwaterModule: RenderModule<FrameGraphContext> = {\r\n type: 'Underwater',\r\n reads: [{ resource: FrameResources.SceneColor, version: 'current' }],\r\n writes: [FrameResources.SceneColor],\r\n prepare: ({ ctx }) => ({ enabled: !!ctx.underwater }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'Underwater');\r\n const lightPassResult = requireBuildState(fg, 'lightPass', 'LightPass', 'Underwater');\r\n const sceneColorHandle = blackboard.expect(FrameResources.SceneColor);\r\n const waterCausticsHandle = blackboard.get(FrameResources.WaterCaustics);\r\n const state = ctx.underwater!;\r\n\r\n // After the sky, before the transparent pass: the medium has to cover the\r\n // sky - that is what the horizon fades into underwater - and the opaque\r\n // scene is the only thing the depth buffer describes, so it is also the only\r\n // thing this can reach. Transparent geometry is on its own, exactly as it is\r\n // for atmospheric fog.\r\n const underwaterColorHandle = graph.addPass('Underwater', (builder) => {\r\n builder.read(sceneColorHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (waterCausticsHandle) {\r\n // The light shafts sample the caustic map, which reaches the shader\r\n // through ctx.waterCausticTexture rather than through a handle. Same\r\n // lifetime argument as the shadow mask in CompositeTail: only a declared\r\n // read stops the executor returning it to the pool after LightPass.\r\n builder.read(waterCausticsHandle);\r\n }\r\n const out = builder.write(sceneColorHandle);\r\n builder.setExecute((rgCtx) => {\r\n const colorTexture = rgCtx.getTexture<Texture2D>(sceneColorHandle);\r\n const depthTexture = frame.depthFramebuffer?.getDepthAttachment() as Nullable<Texture2D>;\r\n if (!colorTexture || !depthTexture) {\r\n return;\r\n }\r\n // Color only. The scene depth is sampled by this pass, which it cannot\r\n // be while it is still attached to the bound framebuffer.\r\n const colorFramebuffer = rgCtx.createFramebuffer({\r\n width: colorTexture.width,\r\n height: colorTexture.height,\r\n colorAttachments: colorTexture,\r\n depthAttachment: null\r\n });\r\n _underwaterRenderer.render(ctx, state, colorFramebuffer, depthTexture);\r\n });\r\n return out;\r\n });\r\n\r\n lightPassResult.sceneColorHandle = underwaterColorHandle;\r\n blackboard.set(FrameResources.SceneColor, underwaterColorHandle);\r\n }\r\n};\r\n\r\n/** @internal */\r\nconst CompositeTailModule: RenderModule<FrameGraphContext> = {\r\n type: 'CompositeTail',\r\n writes: [FrameResources.SceneColor, FrameResources.LinearDepth, FrameResources.PresentedColor],\r\n prepare: () => ({ enabled: true }),\r\n setup(fg: FrameGraphContext) {\r\n const { graph, ctx, frame, blackboard, options, backbuffer } = fg;\r\n const depthPassResult = requireBuildState(fg, 'depth', 'DepthPrepass', 'CompositeTail');\r\n const hiZHandle = blackboard.get(FrameResources.HiZ);\r\n const sceneColorCopyHandle = blackboard.get(FrameResources.SceneColorCopy);\r\n const shadowMaskHandle = blackboard.get(FrameResources.ShadowMask);\r\n const waterCausticsHandle = blackboard.get(FrameResources.WaterCaustics);\r\n const lightPassResult = requireBuildState(fg, 'lightPass', 'LightPass', 'CompositeTail');\r\n const renderDepthAttachment = fg.state.renderDepthAttachment;\r\n const useFinalFramebufferAsIntermediate = fg.state.useFinalFramebufferAsIntermediate;\r\n const lightHistoryReadBindings = fg.state.lightHistoryReadBindings;\r\n const historyManager = fg.history;\r\n\r\n // Opaque effects finish before transparent geometry uses their output.\r\n const opaqueChainInput = blackboard.expect(FrameResources.SceneColor);\r\n // Include textures sampled indirectly through DrawContext.\r\n const opaqueChainDeps: RGHandle[] = [blackboard.expect(FrameResources.LinearDepth)];\r\n if (hiZHandle) {\r\n opaqueChainDeps.push(hiZHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n opaqueChainDeps.push(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (sceneColorCopyHandle) {\r\n opaqueChainDeps.push(sceneColorCopyHandle);\r\n }\r\n for (const handle of [\r\n blackboard.get(FrameResources.SSSProfile),\r\n blackboard.get(FrameResources.SSSParam),\r\n blackboard.get(FrameResources.SceneRoughness),\r\n blackboard.get(FrameResources.SceneNormal),\r\n blackboard.get(FrameResources.SSSDiffuse),\r\n blackboard.get(FrameResources.SSSTransmission),\r\n blackboard.get(FrameResources.SkinSSS)\r\n ]) {\r\n if (handle) {\r\n opaqueChainDeps.push(handle);\r\n }\r\n }\r\n const opaqueChainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.opaque,\r\n blackboard,\r\n input: opaqueChainInput,\r\n finalOutput: null,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: opaqueChainDeps,\r\n historyReads: lightHistoryReadBindings,\r\n history: historyManager\r\n })\r\n : { color: opaqueChainInput, wroteFinal: false };\r\n const opaqueChainRan = opaqueChainResult.color !== opaqueChainInput;\r\n\r\n // Transparent geometry writes a new version of the opaque-chain output.\r\n const sceneColorHandle = graph.addPass('TransparentPass', (builder) => {\r\n builder.read(blackboard.expect(FrameResources.LinearDepth));\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (hiZHandle) {\r\n // Transparent materials may ray-march HiZ.\r\n builder.read(hiZHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (sceneColorCopyHandle) {\r\n builder.read(sceneColorCopyHandle);\r\n }\r\n if (shadowMaskHandle) {\r\n // Transparent geometry goes through the same clustered-light bind group\r\n // as the opaque pass, which binds ctx.shadowMaskTexture whenever\r\n // screenSpaceShadowMask is on (ShaderHelper, UNIFORM_NAME_SHADOW_MASK).\r\n // Declaring the read is what keeps the mask alive: the executor derives\r\n // each resource's lastUse from declared reads and returns the texture to\r\n // the pool immediately after, so without this the mask would be recycled\r\n // after LightPass while this pass is still sampling it.\r\n builder.read(shadowMaskHandle);\r\n }\r\n if (waterCausticsHandle) {\r\n // Same lifetime argument as the shadow mask above.\r\n builder.read(waterCausticsHandle);\r\n }\r\n builder.read(opaqueChainResult.color);\r\n const out = builder.write(opaqueChainResult.color);\r\n builder.setExecute((rgCtx) => {\r\n // Pulled here rather than inherited from LightPass's execute. The value\r\n // is the same, but relying on the leftover would make this pass depend\r\n // on execution order instead of on its own declared inputs.\r\n ctx.shadowMaskTexture = shadowMaskHandle ? rgCtx.getTexture<Texture2DArray>(shadowMaskHandle) : null;\r\n renderTransparentScenePass(\r\n frame,\r\n rgCtx,\r\n opaqueChainRan ? opaqueChainResult.color : null,\r\n lightPassResult.sceneColorFramebufferHandle\r\n );\r\n });\r\n return out;\r\n });\r\n blackboard.set(FrameResources.SceneColor, sceneColorHandle);\r\n\r\n const chainInput = sceneColorHandle;\r\n // Track whether the chain input still resides in the final target.\r\n const backbufferResidentHandle = useFinalFramebufferAsIntermediate ? sceneColorHandle : null;\r\n const chainDependencies: RGHandle[] = [];\r\n const finalOutput = { handle: backbuffer, isScreen: !ctx.finalFramebuffer };\r\n const endLayerHasEffects = !!ctx.compositor?.layerHasEnabledEffect(PostEffectLayer.end);\r\n\r\n // Transparent-layer effects read depth before its transmission mutation.\r\n const transparentChainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.transparent,\r\n blackboard,\r\n input: chainInput,\r\n finalOutput: endLayerHasEffects ? null : finalOutput,\r\n inputResidesInFinalTarget: !!backbufferResidentHandle,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: chainDependencies,\r\n history: historyManager\r\n })\r\n : { color: chainInput, wroteFinal: false };\r\n\r\n // WAR orders this depth mutation after pre-transmission readers.\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor && !options.needsTransmissionDepthForSSR) {\r\n const transmissionDepthResult = graph.addPass('TransmissionDepth', (builder) => {\r\n const currentDepth = blackboard.expect(FrameResources.LinearDepth);\r\n builder.read(sceneColorHandle);\r\n if (transparentChainResult.color !== sceneColorHandle) {\r\n builder.read(transparentChainResult.color);\r\n }\r\n builder.read(currentDepth);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const depthOut = builder.write(currentDepth);\r\n const done = builder.createToken('TransmissionDepthDone');\r\n builder.sideEffect();\r\n builder.setExecute((rgCtx) => {\r\n renderTransmissionDepthPass(frame, rgCtx);\r\n });\r\n return { done, depthOut };\r\n });\r\n transmissionDepthToken = transmissionDepthResult.done;\r\n blackboard.set(FrameResources.LinearDepth, transmissionDepthResult.depthOut);\r\n }\r\n\r\n const endChainDependencies = transmissionDepthToken\r\n ? [...chainDependencies, transmissionDepthToken]\r\n : chainDependencies;\r\n const chainResult = ctx.compositor\r\n ? ctx.compositor.buildLayer({\r\n graph,\r\n ctx,\r\n layer: PostEffectLayer.end,\r\n blackboard,\r\n input: transparentChainResult.color,\r\n finalOutput,\r\n inputResidesInFinalTarget:\r\n !!backbufferResidentHandle && transparentChainResult.color === chainInput,\r\n sceneDepthAttachment: renderDepthAttachment,\r\n dependencies: endChainDependencies,\r\n history: historyManager\r\n })\r\n : { color: transparentChainResult.color, wroteFinal: false };\r\n const finalWroteFinal = chainResult.wroteFinal || transparentChainResult.wroteFinal;\r\n\r\n let presentedBackbuffer: RGHandle;\r\n if (finalWroteFinal) {\r\n presentedBackbuffer = chainResult.color;\r\n } else {\r\n presentedBackbuffer = graph.addPass('Blit', (builder) => {\r\n builder.read(chainResult.color);\r\n for (const dep of endChainDependencies) {\r\n builder.read(dep);\r\n }\r\n const outputBackbuffer = builder.write(backbuffer);\r\n // Skip copies when the output already resides in the final target.\r\n const needsBlit = chainResult.color !== backbufferResidentHandle;\r\n builder.setExecute((rgCtx) => {\r\n const sourceTex = needsBlit ? rgCtx.getTexture<Texture2D>(chainResult.color) : null;\r\n if (sourceTex) {\r\n const blitter = new CopyBlitter();\r\n blitter.srgbOut = !ctx.finalFramebuffer;\r\n blitter.blit(sourceTex, ctx.finalFramebuffer ?? null, fetchSampler('clamp_nearest_nomip'));\r\n }\r\n });\r\n return outputBackbuffer;\r\n });\r\n }\r\n fg.state.presentedBackbuffer = presentedBackbuffer;\r\n // Downstream modules may replace this sink registration.\r\n blackboard.set(FrameResources.PresentedColor, presentedBackbuffer);\r\n }\r\n};\r\n\r\n/** Built-in Forward+ modules addressable by pipeline anchors. @public */\r\nexport const ForwardPlusModules = {\r\n SkyUpdate: SkyUpdateModule,\r\n ClusterLights: ClusterLightsModule,\r\n GPUPicking: GPUPickingModule,\r\n ShadowMaps: ShadowMapsModule,\r\n WaterCaustics: WaterCausticsModule,\r\n DepthPrepass: DepthPrepassModule,\r\n ShadowMask: ShadowMaskModule,\r\n TransmissionDepthForSSR: TransmissionDepthForSSRModule,\r\n HiZ: HiZModule,\r\n SSSProfile: SSSProfileModule,\r\n SceneColorGrab: SceneColorGrabModule,\r\n LightPass: LightPassModule,\r\n SkyPass: SkyPassModule,\r\n Underwater: UnderwaterModule,\r\n CompositeTail: CompositeTailModule\r\n} as const;\r\n\r\n/** The default module order assembled by {@link createForwardPlusPipeline}. */\r\nconst DEFAULT_FORWARD_PLUS_MODULES: readonly RenderModule<FrameGraphContext>[] = [\r\n SkyUpdateModule,\r\n ClusterLightsModule,\r\n GPUPickingModule,\r\n ShadowMapsModule,\r\n WaterCausticsModule,\r\n DepthPrepassModule,\r\n ShadowMaskModule,\r\n TransmissionDepthForSSRModule,\r\n HiZModule,\r\n SSSProfileModule,\r\n SceneColorGrabModule,\r\n LightPassModule,\r\n SkyPassModule,\r\n UnderwaterModule,\r\n CompositeTailModule\r\n];\r\n\r\n/** @internal */\r\nlet _defaultForwardPlusPipeline: RenderPipeline<FrameGraphContext> | null = null;\r\n\r\n/** Create an independent pipeline with the built-in Forward+ modules. @public */\r\nexport function createForwardPlusPipeline(): RenderPipeline<FrameGraphContext> {\r\n return new RenderPipeline<FrameGraphContext>(DEFAULT_FORWARD_PLUS_MODULES);\r\n}\r\n\r\n/** Return the shared default pipeline. Mutations affect cameras using it. @public */\r\nexport function getDefaultForwardPlusPipeline(): RenderPipeline<FrameGraphContext> {\r\n if (!_defaultForwardPlusPipeline) {\r\n _defaultForwardPlusPipeline = createForwardPlusPipeline();\r\n }\r\n return _defaultForwardPlusPipeline;\r\n}\r\n\r\n/** Build the Forward+ render graph and return its backbuffer output. @public */\r\nexport function buildForwardPlusGraph(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): RGHandle {\r\n return buildForwardPlusGraphInternal(graph, ctx, renderQueue, options).backbuffer;\r\n}\r\n\r\nfunction buildForwardPlusGraphInternal(\r\n graph: RenderGraph,\r\n ctx: DrawContext,\r\n renderQueue: RenderQueue,\r\n options: ForwardPlusOptions\r\n): ForwardPlusGraphBuildResult {\r\n const backbuffer = graph.importTexture('backbuffer');\r\n // Irradiance, moments and surface history require renderable half-float\r\n // targets. Keep ordinary IBL active on devices that cannot provide them.\r\n options.ssgi &&= supportsSSGIRenderTargets(ctx);\r\n ctx.SSS = !!options.sss;\r\n ctx.SSGI = !!options.ssgi;\r\n ctx.SSGIIrradianceHistoryTexture = null;\r\n ctx.SSGISurfaceHistoryTexture = null;\r\n ctx.SkinSSSTexture = null;\r\n // ShadowMask sets this only when it produces a texture.\r\n ctx.shadowMaskTexture = null;\r\n // WaterCaustics turns these on together once it has produced a map; they are\r\n // read by every light pass, so they must start cleared each frame.\r\n ctx.waterCaustics = false;\r\n ctx.waterCausticLight = null;\r\n ctx.waterCausticTexture = null;\r\n ctx.waterCausticHeightTexture = null;\r\n ctx.waterCausticUniforms = null;\r\n\r\n const blackboard = new RGBlackboard();\r\n\r\n const frame: FrameState = {\r\n ctx,\r\n renderQueue,\r\n depthFramebuffer: null,\r\n sunLightColor: null,\r\n options,\r\n renderQueueDisposed: false,\r\n clusteredLightReleased: false,\r\n sunLightRestored: false\r\n };\r\n\r\n const ordering = new OrderingScope();\r\n const fg: FrameGraphContext = {\r\n graph,\r\n ctx,\r\n finalFramebuffer: ctx.finalFramebuffer,\r\n renderQueue,\r\n blackboard,\r\n frame,\r\n history: ctx.camera?.getHistoryResourceManager?.() ?? null,\r\n options,\r\n ordering,\r\n backbuffer,\r\n state: {\r\n renderDepthAttachment: null,\r\n useFinalFramebufferAsIntermediate: false,\r\n lightHistoryReadBindings: []\r\n }\r\n };\r\n\r\n const pipeline = ctx.camera?.renderPipeline ?? getDefaultForwardPlusPipeline();\r\n const requirements = ctx.compositor?.collectRequirements(ctx) ?? {};\r\n mergeFrameResourceRequirements(requirements, pipeline.collectRequirements(fg));\r\n resolveFrameResourceRequirements(ctx, options, requirements);\r\n\r\n pipeline.build(fg);\r\n validateProducedFrameResources(blackboard, options, renderQueue);\r\n\r\n const presented = blackboard.get(FrameResources.PresentedColor) ?? fg.state.presentedBackbuffer!;\r\n const depth = fg.state.depth;\r\n const externalDepthImport =\r\n depth?.externalDepthAttachmentHandle && depth.externalDepthAttachment\r\n ? { handle: depth.externalDepthAttachmentHandle, texture: depth.externalDepthAttachment }\r\n : undefined;\r\n return { backbuffer: presented, frame, externalDepthImport };\r\n}\r\n\r\n/** @internal */\r\nfunction renderShadowMaps(ctx: DrawContext, lights: PunctualLight[]): void {\r\n ctx.renderPass = _shadowMapPass;\r\n ctx.device.pushDeviceStates();\r\n try {\r\n for (const light of lights) {\r\n light.shadow.render(ctx, _shadowMapPass);\r\n }\r\n } finally {\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderForwardSSSProfile(\r\n frame: FrameState,\r\n profileFramebuffer: FrameBuffer,\r\n profileTexture: Texture2D,\r\n paramTexture: Texture2D,\r\n normalTexture: Nullable<Texture2D>\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n if (!ctx.SSS || !ctx.depthTexture) {\r\n return;\r\n }\r\n const sssRenderQueue = createActualSSSRenderQueue(renderQueue);\r\n if (!sssRenderQueue) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n const savedCompositor = ctx.compositor;\r\n const savedTransmission = _scenePass.transmission;\r\n const savedRenderOpaque = _scenePass.renderOpaque;\r\n const savedRenderTransparent = _scenePass.renderTransparent;\r\n const savedClearColor = _scenePass.clearColor;\r\n const savedClearDepth = _scenePass.clearDepth;\r\n const savedClearStencil = _scenePass.clearStencil;\r\n const savedCommandBufferReuse = ctx.camera.commandBufferReuse;\r\n const savedProfileTexture = ctx.SSSProfileTexture;\r\n const savedParamTexture = ctx.SSSParamTexture;\r\n const savedNormalTexture = ctx.SceneNormalTexture;\r\n\r\n let profileFlags = MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n if (normalTexture) {\r\n profileFlags |= MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n }\r\n\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(profileFramebuffer);\r\n ctx.SSSProfileTexture = profileTexture;\r\n ctx.SSSParamTexture = paramTexture;\r\n ctx.SceneNormalTexture = normalTexture;\r\n ctx.compositor = null;\r\n ctx.camera.commandBufferReuse = false;\r\n ctx.materialFlags =\r\n (ctx.materialFlags &\r\n ~(\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n )) |\r\n profileFlags;\r\n _scenePass.transmission = false;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.clearColor = Vector4.zero();\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.render(ctx, null, null, sssRenderQueue);\r\n } finally {\r\n _scenePass.clearColor = savedClearColor;\r\n _scenePass.clearDepth = savedClearDepth;\r\n _scenePass.clearStencil = savedClearStencil;\r\n _scenePass.renderTransparent = savedRenderTransparent;\r\n _scenePass.renderOpaque = savedRenderOpaque;\r\n _scenePass.transmission = savedTransmission;\r\n ctx.camera.commandBufferReuse = savedCommandBufferReuse;\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.compositor = savedCompositor;\r\n ctx.SSSProfileTexture = savedProfileTexture;\r\n ctx.SSSParamTexture = savedParamTexture;\r\n ctx.SceneNormalTexture = savedNormalTexture;\r\n device.popDeviceStates();\r\n sssRenderQueue.dispose();\r\n }\r\n}\r\n\r\nfunction releaseIntermediateFramebuffer(frame: FrameState): void {\r\n // Each pass owns device state; only clear the shared context field.\r\n frame.ctx.intermediateFramebuffer = null;\r\n}\r\n\r\nfunction releaseDepthFramebuffer(frame: FrameState): void {\r\n frame.depthFramebuffer = null;\r\n}\r\n\r\nfunction disposeRenderQueue(frame: FrameState): void {\r\n if (!frame.renderQueueDisposed) {\r\n frame.renderQueue.dispose();\r\n frame.renderQueueDisposed = true;\r\n }\r\n}\r\n\r\nfunction releaseClusteredLight(frame: FrameState): void {\r\n if (!frame.clusteredLightReleased && frame.ctx.clusteredLight) {\r\n freeClusteredLight(frame.ctx.clusteredLight);\r\n frame.ctx.clusteredLight = undefined;\r\n frame.clusteredLightReleased = true;\r\n }\r\n}\r\n\r\nfunction restoreSunLight(frame: FrameState): void {\r\n if (!frame.sunLightRestored && frame.sunLightColor && frame.ctx.sunLight) {\r\n frame.ctx.sunLight.color = frame.sunLightColor;\r\n frame.sunLightRestored = true;\r\n }\r\n}\r\n\r\nfunction cleanupFrame(frame: FrameState): void {\r\n const { ctx } = frame;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SCENE_STORE_ROUGHNESS;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n disposeRenderQueue(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n/** @internal */\r\nfunction renderSceneDepth(\r\n frame: FrameState,\r\n existingDepthFb: Nullable<FrameBuffer>,\r\n rgCtx: RGExecuteContext,\r\n depthTex?: Texture2D,\r\n motionVectorTex?: Nullable<Texture2D>,\r\n transmissionOverride?: boolean\r\n): FrameBuffer {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n const transmission = transmissionOverride ?? !!existingDepthFb;\r\n let depthFramebuffer = existingDepthFb;\r\n\r\n // Current callers must provide the graph-managed prepass framebuffer.\r\n console.assert(\r\n !!existingDepthFb,\r\n 'renderSceneDepth: called without an existing depth framebuffer; the ' +\r\n 'self-allocating fallback path is untested in the forward+ pipeline.'\r\n );\r\n\r\n if (!depthFramebuffer) {\r\n if (depthTex) {\r\n const colorAttachments = motionVectorTex ? [depthTex, motionVectorTex] : depthTex;\r\n const depthAttachment = ctx.finalFramebuffer?.getDepthAttachment();\r\n const depthTexOrFormat = depthAttachment?.isTexture2D() ? depthAttachment : ctx.depthFormat;\r\n\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: depthTex.width,\r\n height: depthTex.height,\r\n colorAttachments,\r\n depthAttachment: depthTexOrFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const format: TextureFormat =\r\n ctx.device.type === 'webgl'\r\n ? ctx.SSRCalcThickness\r\n ? 'rgba16f'\r\n : 'rgba8unorm'\r\n : ctx.SSRCalcThickness\r\n ? 'rg32f'\r\n : 'r32f';\r\n const mvFormat: TextureFormat = 'rgba16f';\r\n if (!ctx.finalFramebuffer) {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n const originDepth = ctx.finalFramebuffer?.getDepthAttachment();\r\n if (originDepth?.isTexture2D()) {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: originDepth.width,\r\n height: originDepth.height,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: originDepth,\r\n ignoreDepthStencil: false\r\n });\r\n } else {\r\n depthFramebuffer = rgCtx.createFramebuffer({\r\n width: ctx.renderWidth,\r\n height: ctx.renderHeight,\r\n colorAttachments: ctx.motionVectors ? [format, mvFormat] : format,\r\n depthAttachment: ctx.depthFormat,\r\n ignoreDepthStencil: false\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (!transmission) {\r\n frame.depthFramebuffer = depthFramebuffer!;\r\n }\r\n\r\n ctx.device.pushDeviceStates();\r\n try {\r\n ctx.device.setFramebuffer(depthFramebuffer!);\r\n _depthPass.encodeDepth = depthFramebuffer!.getColorAttachments()[0].format === 'rgba8unorm';\r\n _depthPass.clearColor = transmission\r\n ? null\r\n : _depthPass.encodeDepth\r\n ? new Vector4(0, 0, 0, 1)\r\n : new Vector4(1, 1, 1, 1);\r\n _depthPass.clearDepth = transmission ? null : DEPTH_CLEAR_VALUE;\r\n _depthPass.clearStencil = null;\r\n _depthPass.transmission = transmission;\r\n\r\n if (ctx.SSRCalcThickness && !transmission) {\r\n if (!_backDepthColorState) {\r\n _backDepthColorState = ctx.device.createColorState().setColorMask(false, true, false, false);\r\n }\r\n if (!_frontDepthColorState) {\r\n _frontDepthColorState = ctx.device.createColorState().setColorMask(true, false, false, false);\r\n }\r\n ctx.forceColorState = _backDepthColorState;\r\n ctx.forceCullMode = 'front';\r\n _depthPass.renderBackface = true;\r\n _depthPass.transmission = false;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n _depthPass.clearColor = null;\r\n _depthPass.renderBackface = false;\r\n ctx.forceColorState = _frontDepthColorState;\r\n ctx.forceCullMode = null;\r\n }\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.forceColorState = null;\r\n ctx.forceCullMode = null;\r\n _depthPass.renderBackface = false;\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n if (!transmission) {\r\n ctx.motionVectorTexture = ctx.motionVectors\r\n ? (depthFramebuffer!.getColorAttachments()[1] as Texture2D)\r\n : null;\r\n ctx.linearDepthTexture = depthFramebuffer!.getColorAttachments()[0] as Texture2D;\r\n ctx.depthTexture = depthFramebuffer!.getDepthAttachment() as Texture2D;\r\n ctx.depthPrepassAttachment = ctx.depthTexture;\r\n }\r\n return depthFramebuffer!;\r\n}\r\n\r\nlet _skyMVProgram: Nullable<GPUProgram> = null;\r\nlet _skyMVBindGroup: Nullable<BindGroup> = null;\r\nlet _skyMVBox: Nullable<Primitive> = null;\r\n\r\n/** @internal */\r\n/**\r\n * Fills in motion vectors for blended geometry that opted into them.\r\n *\r\n * @remarks\r\n * The transparent queue never reaches the ordinary prepass, so without this a\r\n * blended surface carries whatever velocity belongs to what is behind it. The\r\n * framebuffer here holds the motion vector attachment alone, so nothing touches\r\n * the linear depth the light pass and the screen-space effects read, and the\r\n * materials run with depth test on and depth write off, so the scene depth is\r\n * left as the opaque pass built it.\r\n *\r\n * Materials that have not opted in discard, which leaves the velocity beneath\r\n * them intact. See {@link MeshMaterial.transparentMotionVector} for why that is\r\n * the right default and where the approximation breaks.\r\n * @internal\r\n */\r\nfunction renderTransparentMotionVectors(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle: RGHandle\r\n): void {\r\n const ctx = frame.ctx;\r\n const renderQueue = frame.renderQueue;\r\n if (!ctx.motionVectors || !renderQueue.itemList?.transparent) {\r\n return;\r\n }\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(rgCtx.getFramebuffer(framebufferHandle));\r\n _depthPass.motionVectorOnly = true;\r\n _depthPass.encodeDepth = false;\r\n _depthPass.transmission = false;\r\n _depthPass.renderBackface = false;\r\n // Nothing is cleared: this pass only replaces the pixels its own geometry\r\n // covers, and everything else in the target is already correct.\r\n _depthPass.clearColor = null;\r\n _depthPass.clearDepth = null;\r\n _depthPass.clearStencil = null;\r\n _depthPass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n _depthPass.motionVectorOnly = false;\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\nfunction renderSkyMotionVectors(\r\n ctx: DrawContext,\r\n rgCtx: RGExecuteContext,\r\n framebufferHandle?: RGHandle\r\n): void {\r\n if (!ctx.motionVectorTexture) {\r\n return;\r\n }\r\n\r\n const device = ctx.device;\r\n const fb = framebufferHandle\r\n ? rgCtx.getFramebuffer(framebufferHandle)\r\n : rgCtx.createFramebuffer({\r\n colorAttachments: ctx.motionVectorTexture,\r\n depthAttachment: ctx.depthTexture\r\n });\r\n\r\n if (!_skyMVProgram) {\r\n _skyMVProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec3().attrib('position');\r\n this.VPMatrix = pb.mat4().uniform(0);\r\n this.prevVPMatrix = pb.mat4().uniform(0);\r\n this.cameraPos = pb.vec3().uniform(0);\r\n this.prevCameraPos = pb.vec3().uniform(0);\r\n pb.main(function () {\r\n this.$l.worldPos = pb.add(this.$inputs.pos, this.cameraPos);\r\n this.$l.prevWorldPos = pb.add(this.$inputs.pos, this.prevCameraPos);\r\n this.$l.clipPos = pb.mul(this.VPMatrix, pb.vec4(this.worldPos, 1));\r\n this.$l.prevClipPos = pb.mul(this.prevVPMatrix, pb.vec4(this.prevWorldPos, 1));\r\n this.clipPos.z = ShaderHelper.farthestClipZ(this, this.clipPos.w);\r\n this.$builtins.position = this.clipPos;\r\n this.$outputs.currentPos = this.clipPos;\r\n this.$outputs.prevPos = this.prevClipPos;\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.color = pb.vec4();\r\n pb.main(function () {\r\n this.$l.motionVector = pb.mul(\r\n pb.sub(\r\n pb.div(this.$inputs.currentPos.xy, this.$inputs.currentPos.w),\r\n pb.div(this.$inputs.prevPos.xy, this.$inputs.prevPos.w)\r\n ),\r\n 0.5\r\n );\r\n this.$outputs.color = pb.vec4(this.motionVector, 0, 1);\r\n });\r\n }\r\n })!;\r\n _skyMVProgram.name = '@TAA_SkyMotionVector';\r\n }\r\n\r\n if (!_skyMVBindGroup) {\r\n _skyMVBindGroup = device.createBindGroup(_skyMVProgram.bindGroupLayouts[0]);\r\n }\r\n\r\n if (!_skyMVBox) {\r\n _skyMVBox = new BoxShape({ size: 2, needNormal: false, needUV: false });\r\n }\r\n\r\n _skyMVBindGroup.setValue('VPMatrix', ctx.camera.viewProjectionMatrix);\r\n _skyMVBindGroup.setValue('prevVPMatrix', ctx.camera.prevVPMatrix!);\r\n _skyMVBindGroup.setValue('cameraPos', ctx.camera.getWorldPosition());\r\n _skyMVBindGroup.setValue('prevCameraPos', ctx.camera.prevPosition!);\r\n\r\n device.pushDeviceStates();\r\n device.setProgram(_skyMVProgram);\r\n device.setBindGroup(0, _skyMVBindGroup);\r\n device.setRenderStates(AbstractPostEffect.getDefaultRenderState(ctx, DEPTH_COMPARE_DEFAULT));\r\n device.setFramebuffer(fb);\r\n _skyMVBox.draw();\r\n device.popDeviceStates();\r\n}\r\n\r\nfunction blitToCurrentColorAttachment(ctx: DrawContext, source: Texture2D): void {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n const destination = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n new CopyBlitter().blit(source, destination, fetchSampler('clamp_nearest_nomip'));\r\n}\r\n\r\n/** Render the refraction background before LightPass. @internal */\r\nfunction renderSceneColorGrab(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n copyHandle: RGHandle,\r\n copyFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n const copyTex = rgCtx.getTexture<Texture2D>(copyHandle);\r\n const compositor = ctx.compositor;\r\n ctx.compositor = null;\r\n const isolateSceneColorDepth = frame.options.needsTransmissionDepthForSSR;\r\n const savedDepthPrepassAttachment = ctx.depthPrepassAttachment;\r\n const savedMaterialFlags = ctx.materialFlags;\r\n\r\n // The background copy has no surface MRT attachments.\r\n const sceneColorMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const sceneColorFramebuffer = copyFramebufferHandle\r\n ? rgCtx.getFramebuffer(copyFramebufferHandle)\r\n : rgCtx.createFramebuffer({\r\n width: copyTex.width,\r\n height: copyTex.height,\r\n colorAttachments: copyTex,\r\n depthAttachment: isolateSceneColorDepth ? ctx.depthFormat : depthTex,\r\n ignoreDepthStencil: false\r\n });\r\n let sceneColorStatePushed = false;\r\n try {\r\n device.pushDeviceStates();\r\n sceneColorStatePushed = true;\r\n device.setFramebuffer(sceneColorFramebuffer);\r\n _scenePass.transmission = false;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = undefined;\r\n _scenePass.clearDepth = DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = 0;\r\n } else {\r\n _scenePass.clearDepth = depthTex ? null : DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n }\r\n ctx.materialFlags = sceneColorMaterialFlags;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n if (isolateSceneColorDepth) {\r\n ctx.depthPrepassAttachment = savedDepthPrepassAttachment;\r\n }\r\n if (sceneColorStatePushed) {\r\n device.popDeviceStates();\r\n }\r\n ctx.compositor = compositor;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function renderOpaqueScenePass(\r\n frame: FrameState,\r\n sceneColorTex: Texture2D,\r\n sceneColorCopyTex: Nullable<Texture2D>,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SCENE_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SCENE_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n );\r\n\r\n if (ctx.SceneRoughnessTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SCENE_STORE_ROUGHNESS;\r\n }\r\n if (ctx.SceneNormalTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SCENE_STORE_NORMAL;\r\n }\r\n if (ctx.SSS) {\r\n if (ctx.SSSDiffuseTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n }\r\n if (ctx.SSSTransmissionTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n }\r\n }\r\n if (ctx.SkinSSSTexture) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SKIN_SSS_STORE;\r\n }\r\n\r\n // Prefer the graph framebuffer; final-target mode has no graph framebuffer.\r\n if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {\r\n ctx.intermediateFramebuffer = rgCtx.getFramebuffer(sceneColorFramebufferHandle);\r\n } else if (!sceneColorFramebufferHandle && depthTex === ctx.finalFramebuffer?.getDepthAttachment()) {\r\n ctx.intermediateFramebuffer = ctx.finalFramebuffer;\r\n } else {\r\n ctx.intermediateFramebuffer = rgCtx.createFramebuffer({\r\n width: sceneColorTex.width,\r\n height: sceneColorTex.height,\r\n colorAttachments: getLightPassColorAttachments(ctx, sceneColorTex),\r\n depthAttachment: depthTex\r\n });\r\n }\r\n\r\n // Graph passes do not communicate through leftover device state.\r\n ctx.device.pushDeviceStates();\r\n try {\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n ctx.device.setFramebuffer(ctx.intermediateFramebuffer);\r\n ctx.device.setViewport(null);\r\n ctx.device.setScissor(null);\r\n\r\n _scenePass.transmission = false;\r\n _scenePass.renderSky = false;\r\n _scenePass.clearDepth = depthTex ? null : DEPTH_CLEAR_VALUE;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n\r\n if (renderQueue.needSceneColor() && sceneColorCopyTex) {\r\n // Seed the main target with the refraction background.\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n blitToCurrentColorAttachment(ctx, ctx.sceneColorTexture);\r\n if (hasSurfaceMRT(ctx)) {\r\n // Re-render opaque lists to populate MRT data missing from the copy.\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n }\r\n _scenePass.transmission = true;\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n }\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderTransparent = false;\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n // Restore shared pass flags before the next graph pass.\r\n _scenePass.renderTransparent = true;\r\n _scenePass.renderSky = true;\r\n _scenePass.transmission = false;\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** Render sky and fog after opaque geometry. @internal */\r\nexport function renderSkyScenePass(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n sceneColorFramebufferHandle?: RGHandle,\r\n sceneColorNoFog?: Nullable<Texture2D>\r\n): void {\r\n const { ctx } = frame;\r\n const framebuffer = sceneColorFramebufferHandle\r\n ? rgCtx.getFramebuffer(sceneColorFramebufferHandle)\r\n : ctx.finalFramebuffer;\r\n const device = ctx.device;\r\n device.pushDeviceStates();\r\n try {\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n ctx.scene.env.sky.renderSky(ctx);\r\n // Not while submerged: the medium between the eye and the scene is water,\r\n // and the Underwater module composites it. The sky itself is still drawn -\r\n // that pass then extinguishes it along with everything else at the far\r\n // plane, which is what makes the horizon read as water rather than as air.\r\n if (ctx.scene.env.sky.fogPresents && !ctx.underwater) {\r\n // Snapshot between sky and fog. Sky belongs in the copy - a ray that hits\r\n // the sky should read the sky - while fog does not, because the fog a\r\n // screen-space pass would sample lies along the camera ray rather than the\r\n // path it integrates.\r\n if (sceneColorNoFog) {\r\n const source = framebuffer?.getColorAttachment<Texture2D>(0) ?? null;\r\n if (source) {\r\n new CopyBlitter().blit(source, sceneColorNoFog, fetchSampler('clamp_nearest_nomip'));\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n }\r\n }\r\n ctx.scene.env.sky.renderFog(ctx.camera);\r\n }\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** Render transmission, transparency, and OIT over the opaque result. @internal */\r\nexport function renderTransparentScenePass(\r\n frame: FrameState,\r\n rgCtx: RGExecuteContext,\r\n opaqueChainOutput: Nullable<RGHandle>,\r\n sceneColorFramebufferHandle?: RGHandle\r\n): void {\r\n const { ctx, renderQueue } = frame;\r\n const device = ctx.device;\r\n let framebuffer: Nullable<FrameBuffer>;\r\n if (opaqueChainOutput) {\r\n // Opaque effects redirect transparent rendering to their chain output.\r\n const chainTex = rgCtx.getTexture<Texture2D>(opaqueChainOutput);\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n framebuffer = rgCtx.createFramebuffer({\r\n width: chainTex.width,\r\n height: chainTex.height,\r\n colorAttachments: chainTex,\r\n depthAttachment: depthTex\r\n });\r\n // The chain output has no surface MRT attachments.\r\n ctx.materialFlags &= ~SURFACE_MRT_FLAGS;\r\n } else if (sceneColorFramebufferHandle) {\r\n // Continue in the light pass target when no opaque effect ran.\r\n framebuffer = rgCtx.getFramebuffer(sceneColorFramebufferHandle);\r\n } else {\r\n // Scene color already resides in the final framebuffer.\r\n framebuffer = ctx.finalFramebuffer;\r\n }\r\n device.pushDeviceStates();\r\n try {\r\n // setFramebuffer may no-op, so reset viewport and scissor explicitly.\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n // Derive transmission mode instead of inheriting shared pass state.\r\n _scenePass.transmission = renderQueue.needSceneColor();\r\n _scenePass.clearColor = null;\r\n _scenePass.clearDepth = null;\r\n _scenePass.clearStencil = null;\r\n _scenePass.renderOpaque = false;\r\n _scenePass.renderTransparent = true;\r\n _scenePass.renderSky = false;\r\n try {\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n _scenePass.renderOpaque = true;\r\n _scenePass.renderSky = true;\r\n }\r\n } finally {\r\n device.popDeviceStates();\r\n }\r\n}\r\n\r\n/** @internal */\r\nfunction renderTransmissionDepthPass(frame: FrameState, rgCtx: RGExecuteContext): void {\r\n renderSceneDepth(frame, frame.depthFramebuffer, rgCtx);\r\n}\r\n\r\n/** Build and execute the Forward+ graph for one frame. @public */\r\nexport function executeForwardPlusGraph(ctx: DrawContext): void {\r\n const device = ctx.device;\r\n const graph = new RenderGraph();\r\n let renderQueue: RenderQueue | null = null;\r\n let frame: FrameState | null = null;\r\n let executor: RenderGraphExecutor<Texture2D> | null = null;\r\n let historyManager: HistoryResourceManager<Texture2D> | null = null;\r\n let historyFrameStarted = false;\r\n let motionVectorFramePrepared = false;\r\n let motionVectorFrameCommitted = false;\r\n\r\n try {\r\n renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n // Before the options are derived, because being submerged changes them: the\r\n // atmosphere is not the medium the camera is looking through, so its fog is\r\n // suppressed for the frame.\r\n ctx.underwater = selectUnderwaterSource(ctx);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n options.ssgi &&= supportsSSGIRenderTargets(ctx);\r\n // Atmospheric fog describes a column of air, which is not what a submerged\r\n // camera is looking through. The Underwater module owns the medium instead.\r\n // Clearing the flag here also stops SkyPass reserving a fog-free snapshot\r\n // for a frame that composites no fog.\r\n options.fogPresents &&= !ctx.underwater;\r\n ctx.SSS = options.sss;\r\n\r\n historyManager = ctx.camera.getHistoryResourceManager();\r\n if (!historyManager) {\r\n historyManager = new HistoryResourceManager<Texture2D>(_devicePoolAllocator);\r\n ctx.camera.setHistoryResourceManager(historyManager);\r\n }\r\n if (!options.ssgi) {\r\n historyManager.invalidate(RGHistoryResources.SSGI_SCENE_COLOR);\r\n historyManager.invalidate(RGHistoryResources.SSGI_IRRADIANCE);\r\n historyManager.invalidate(RGHistoryResources.SSGI_SURFACE);\r\n historyManager.invalidate(RGHistoryResources.SSGI_MOMENTS);\r\n }\r\n historyManager.beginFrame();\r\n historyFrameStarted = true;\r\n\r\n const buildResult = buildForwardPlusGraphInternal(graph, ctx, renderQueue, options);\r\n frame = buildResult.frame;\r\n\r\n if (options.motionVectors) {\r\n ctx.camera.prepareMotionVectorFrame(ctx.camera.TAA, ctx.renderWidth, ctx.renderHeight);\r\n motionVectorFramePrepared = true;\r\n } else {\r\n ctx.camera.clearMotionVectorFrame();\r\n }\r\n\r\n const compiled = graph.compile([buildResult.backbuffer]);\r\n\r\n executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight, {\r\n textureAffinityCache: getTextureAffinityCache(ctx.camera, device)\r\n });\r\n\r\n if (ctx.finalFramebuffer) {\r\n const backbufferTex = ctx.finalFramebuffer.getColorAttachments()[0] as Texture2D;\r\n executor.setImportedTexture(buildResult.backbuffer, backbufferTex);\r\n }\r\n if (buildResult.externalDepthImport) {\r\n executor.setImportedTexture(\r\n buildResult.externalDepthImport.handle,\r\n buildResult.externalDepthImport.texture\r\n );\r\n }\r\n historyManager.bindImportedTextures(executor);\r\n\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\r\n historyFrameStarted = false;\r\n if (motionVectorFramePrepared) {\r\n ctx.camera.commitMotionVectorFrame();\r\n motionVectorFrameCommitted = true;\r\n }\r\n } finally {\r\n if (historyFrameStarted) {\r\n historyManager?.discardFrame();\r\n }\r\n if (frame) {\r\n cleanupFrame(frame);\r\n } else {\r\n renderQueue?.dispose();\r\n }\r\n executor?.reset();\r\n if (motionVectorFramePrepared && !motionVectorFrameCommitted) {\r\n ctx.camera.clearMotionVectorFrame();\r\n }\r\n }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_shadowMaskRenderer","ShadowMaskRenderer","_waterCausticsRenderer","WaterCausticsRenderer","_underwaterRenderer","UnderwaterRenderer","_devicePoolAllocator","DevicePoolAllocator","_textureAffinityCaches","WeakMap","getTextureAffinityCache","camera","device","current","get","cache","RGTextureAffinityCache","set","_backDepthColorState","_frontDepthColorState","SURFACE_MRT_FLAGS","MaterialVaryingFlags","SCENE_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SCENE_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","getClusteredLight","length","pop","ClusteredLight","freeClusteredLight","cl","push","getCoreMaterial","material","coreMaterial","hasSSSMaterialCore","subsurfaceProfile","hasSkinSSSMaterialCore","skinSSS","renderQueueHasActiveSSS","renderQueue","itemList","lists","opaque","lit","unlit","list","materialList","renderQueueHasActiveSkinSSS","filterActualSSSItemList","items","filter","item","drawable","getMaterial","filterActualSSSMaterialList","filtered","Set","forEach","mat","add","cloneActualSSSListInfo","source","_targetQueue","skinItemList","morphItemList","skinAndMorphItemList","instanceItemList","instanceList","cloneActualSSSBundle","targetQueue","map","info","hasAnyActualSSSItems","renderItems","some","createActualSSSRenderQueue","queue","RenderQueue","sssOpaque","dispose","emptyBundle","target","_itemList","transmission","transparent","transmission_trans","_shadowedLightList","shadowedLights","_unshadowedLightList","unshadowedLights","_sunLight","sunLight","_primaryDirectionalLight","primaryDirectionalLight","_primaryTransmissionLight","primaryTransmissionLight","_needSceneColor","_needSceneDepth","_needSceneColorWithDepth","_drawTransparent","getSurfaceTextureFormat","ctx","caps","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getTextureFormatBytes","format","getTextureFormatInfo","size","supportsSSGIRenderTargets","rgba16fBytes","framebufferCaps","maxDrawBuffers","maxColorAttachmentBytesPerSample","shouldStoreSSSDiffuse","sssStrength","sssBlurScale","shouldStoreSSSTransmission","sssTransmissionStrength","getSSSLightingTextureFormat","attachmentCount","surfaceAttachmentCount","colorFormat","surfaceFormat","colorBytes","fullPrecisionBytes","getFullMipLevelCount","width","height","Math","max","floor","log2","getSceneColorMipLevelCount","min","REFRACT_BLUR_MAX_LOD","hasSurfaceMRT","materialFlags","getLightPassColorAttachments","colorAttachment","attachments","SceneRoughnessTexture","SceneNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","deriveForwardPlusOptions","scene","deviceType","ssr","SSR","env","light","envLight","hasRadiance","ssgi","SSGI","HDR","ssgiIntensity","type","hasIrradiance","sss","SSS","needSceneColor","needSceneColorWithDepth","needHiZNearest","HiZNearest","depthPrepass","motionVectors","hiZ","hiZNearest","sceneNormal","sceneRoughness","shadowMask","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needsTransmissionDepthForSSR","fogPresents","sky","resolveFrameResourceRequirements","options","requirements","motionVector","Error","Number","MAX_SAFE_INTEGER","bytesPerSample","HiZ","screenSpaceShadowMask","validateProducedFrameResources","blackboard","required","FrameResources","MotionVector","SceneNormal","SceneRoughness","ShadowMask","needed","resource","has","requireBuildState","fg","key","producerType","consumerType","value","state","String","SkyUpdateModule","prepare","enabled","setup","graph","frame","ordering","addPass","builder","emit","sideEffect","setExecute","sunLightColor","update","ClusterLightsModule","chainInto","clusteredLight","calculateLightIndex","ShaderHelper","getPreExposure","GPUPickingModule","pickResolveFunc","renderObjectColors","ShadowMapsModule","renderShadowMaps","selectWaterCausticSource","waters","candidate","castShadow","indexOf","water","canRender","sort","a","b","ra","region","rb","areaA","z","x","w","y","areaB","slice","MAX_CAUSTIC_WATERS","WaterCausticsModule","writes","WaterCaustics","causticsResolution","getMapFormat","history","temporal","causticsTemporalStrength","mapDesc","sizeMode","mapSize","previousHandle","importPreviousIfCompatible","RGHistoryResources","WATER_CAUSTICS","result","mapHandle","createTexture","label","allocationKey","scratchHandle","heightHandle","getHeightMapFormat","read","rgCtx","getTexture","scratch","heights","previous","resolved","render","texture","createFramebuffer","colorAttachments","depthAttachment","queueRetainedCommit","waterCaustics","waterCausticLight","waterCausticTexture","waterCausticHeightTexture","waterCausticUniforms","uniforms","DepthPrepassModule","LinearDepth","SceneDepthAttachment","SSRCalcThickness","mvFormat","depthHandle","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","externalDepthAttachmentHandle","importTexture","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","renderWidth","renderHeight","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","depthFramebuffer","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","renderTransparentMotionVectors","depth","renderDepthAttachment","opaqueLayerHasEffects","compositor","layerHasEnabledEffect","PostEffectLayer","useFinalFramebufferAsIntermediate","ShadowMaskModule","depthPassResult","numShadowLights","numLayers","getLayerCount","maskPassResult","maskDepthHandle","expect","maskHandle","arrayLayers","depthTex","maskTex","layer","attachmentLayer","TransmissionDepthForSSRModule","transmissionDepthResult","currentDepth","depthOut","write","done","createToken","renderTransmissionDepthPass","preLightTransmissionDepthToken","HiZModule","hiZHandle","getHiZFormat","mipLevels","hiZFramebufferHandle","passCtx","depthFb","hiZTex","HiZFrameBuffer","buildHiZ","HiZTexture","SSSProfileModule","shadowMaskHandle","waterCausticsHandle","sssProfileResult","profileHandle","paramHandle","framebufferHandle","shadowMaskTexture","renderForwardSSSProfile","SSSProfile","SSSParam","SceneColorGrabModule","grabResult","copyHandle","copyFramebufferHandle","renderSceneColorGrab","SceneColorCopy","LightPassModule","SceneColor","SSSDiffuse","SSSTransmission","SkinSSS","backbuffer","sssProfileHandle","sssParamHandle","sceneColorCopyHandle","historyManager","lightHistoryReadBindings","historySize","ssrTemporal","reflectHistoryHandle","SSR_REFLECT","motionVectorHistoryHandle","SSR_MOTION_VECTOR","name","handle","ssgiHistorySize","irradianceHistoryHandle","SSGI_IRRADIANCE","surfaceHistoryHandle","SSGI_SURFACE","opaquePassResult","binding","sceneColorHandle","sceneRoughnessHandle","sceneNormalHandle","writeSSSDiffuse","writeSSSTransmission","writeSkinSSS","sssLightingAttachmentCount","sssLightingFormat","sssDiffuseHandle","sssTransmissionHandle","skinSSSHandle","sceneColorFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderLightPass","renderOpaqueScenePass","ssgiIrradianceBinding","find","ssgiSurfaceBinding","SSGIIrradianceHistoryTexture","SSGISurfaceHistoryTexture","beginReadScope","endReadScope","lightPassResult","lightPass","SkyPassModule","reads","version","SceneColorNoFog","captureNoFog","skyPassResult","noFog","out","renderSkyScenePass","color","UnderwaterModule","underwater","underwaterColorHandle","colorTexture","depthTexture","colorFramebuffer","CompositeTailModule","PresentedColor","opaqueChainInput","opaqueChainDeps","opaqueChainResult","buildLayer","input","finalOutput","sceneDepthAttachment","dependencies","historyReads","wroteFinal","opaqueChainRan","renderTransparentScenePass","chainInput","backbufferResidentHandle","chainDependencies","isScreen","endLayerHasEffects","end","transparentChainResult","inputResidesInFinalTarget","transmissionDepthToken","endChainDependencies","chainResult","finalWroteFinal","presentedBackbuffer","dep","outputBackbuffer","needsBlit","sourceTex","blitter","CopyBlitter","srgbOut","blit","fetchSampler","ForwardPlusModules","SkyUpdate","ClusterLights","GPUPicking","ShadowMaps","DepthPrepass","TransmissionDepthForSSR","SceneColorGrab","SkyPass","Underwater","CompositeTail","DEFAULT_FORWARD_PLUS_MODULES","_defaultForwardPlusPipeline","createForwardPlusPipeline","RenderPipeline","getDefaultForwardPlusPipeline","buildForwardPlusGraph","buildForwardPlusGraphInternal","RGBlackboard","renderQueueDisposed","clusteredLightReleased","sunLightRestored","OrderingScope","getHistoryResourceManager","pipeline","renderPipeline","collectRequirements","mergeFrameResourceRequirements","build","presented","externalDepthImport","lights","renderPass","pushDeviceStates","shadow","popDeviceStates","profileFramebuffer","profileTexture","paramTexture","normalTexture","sssRenderQueue","savedMaterialFlags","savedCompositor","savedTransmission","savedRenderOpaque","renderOpaque","savedRenderTransparent","renderTransparent","savedClearColor","clearColor","savedClearDepth","clearDepth","savedClearStencil","clearStencil","savedCommandBufferReuse","commandBufferReuse","savedProfileTexture","savedParamTexture","savedNormalTexture","profileFlags","setFramebuffer","Vector4","zero","releaseIntermediateFramebuffer","intermediateFramebuffer","releaseDepthFramebuffer","disposeRenderQueue","releaseClusteredLight","restoreSunLight","cleanupFrame","existingDepthFb","motionVectorTex","transmissionOverride","console","assert","originDepth","encodeDepth","getColorAttachments","DEPTH_CLEAR_VALUE","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthPrepassAttachment","_skyMVProgram","_skyMVBindGroup","_skyMVBox","motionVectorOnly","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","prevWorldPos","clipPos","mul","vec4","prevClipPos","farthestClipZ","$builtins","position","$outputs","currentPos","prevPos","fragment","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","DEPTH_COMPARE_DEFAULT","draw","blitToCurrentColorAttachment","framebuffer","destination","getColorAttachment","copyTex","isolateSceneColorDepth","savedDepthPrepassAttachment","sceneColorMaterialFlags","sceneColorFramebuffer","sceneColorStatePushed","setViewport","setScissor","renderSky","sceneColorTexture","sceneColorNoFog","renderFog","opaqueChainOutput","chainTex","executeForwardPlusGraph","RenderGraph","executor","historyFrameStarted","motionVectorFramePrepared","motionVectorFrameCommitted","cullScene","selectUnderwaterSource","HistoryResourceManager","setHistoryResourceManager","invalidate","SSGI_SCENE_COLOR","SSGI_MOMENTS","beginFrame","buildResult","prepareMotionVectorFrame","TAA","clearMotionVectorFrame","compiled","compile","RenderGraphExecutor","textureAffinityCache","backbufferTex","setImportedTexture","bindImportedTextures","execute","commitFrame","commitMotionVectorFrame","discardFrame","reset"],"mappings":"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"}
|