@zephyr3d/scene 0.9.22 → 0.9.24

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.
Files changed (234) hide show
  1. package/dist/animation/joint_dynamics/collision.js +1 -7
  2. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  3. package/dist/animation/joint_dynamics/constraints.js +2 -17
  4. package/dist/animation/joint_dynamics/constraints.js.map +1 -1
  5. package/dist/animation/joint_dynamics/controller.js +2 -20
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/joint_dynamics_system.js +1 -3
  8. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  9. package/dist/animation/joint_dynamics/solver.js +14 -60
  10. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  11. package/dist/animation/joint_dynamics/types.js +3 -3
  12. package/dist/animation/joint_dynamics/types.js.map +1 -1
  13. package/dist/app/app.js +23 -0
  14. package/dist/app/app.js.map +1 -1
  15. package/dist/app/scriptregistry.js +16 -53
  16. package/dist/app/scriptregistry.js.map +1 -1
  17. package/dist/asset/assetmanager.js +2 -0
  18. package/dist/asset/assetmanager.js.map +1 -1
  19. package/dist/asset/model.js +22 -0
  20. package/dist/asset/model.js.map +1 -1
  21. package/dist/blitter/bilateralblur.js +3 -1
  22. package/dist/blitter/bilateralblur.js.map +1 -1
  23. package/dist/blitter/blitter.js +3 -3
  24. package/dist/blitter/blitter.js.map +1 -1
  25. package/dist/camera/camera.js +398 -45
  26. package/dist/camera/camera.js.map +1 -1
  27. package/dist/camera/perspectivecamera.js +69 -2
  28. package/dist/camera/perspectivecamera.js.map +1 -1
  29. package/dist/index.d.ts +9113 -8740
  30. package/dist/index.js +10 -2
  31. package/dist/index.js.map +1 -1
  32. package/dist/material/blinn.js +1 -1
  33. package/dist/material/blinn.js.map +1 -1
  34. package/dist/material/lambert.js +3 -3
  35. package/dist/material/lambert.js.map +1 -1
  36. package/dist/material/material.js +8 -5
  37. package/dist/material/material.js.map +1 -1
  38. package/dist/material/meshmaterial.js +17 -10
  39. package/dist/material/meshmaterial.js.map +1 -1
  40. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  41. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  42. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  43. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  44. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +21 -6
  45. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  46. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +1 -1
  47. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  48. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +1 -1
  49. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  50. package/dist/material/mixins/lit.js +33 -11
  51. package/dist/material/mixins/lit.js.map +1 -1
  52. package/dist/material/mixins/pbr/brdf.js +44 -12
  53. package/dist/material/mixins/pbr/brdf.js.map +1 -1
  54. package/dist/material/mixins/pbr/common.js +149 -14
  55. package/dist/material/mixins/pbr/common.js.map +1 -1
  56. package/dist/material/mtoon.js +7 -4
  57. package/dist/material/mtoon.js.map +1 -1
  58. package/dist/material/pbrblueprint.js +5 -1
  59. package/dist/material/pbrblueprint.js.map +1 -1
  60. package/dist/material/pbrmr.js +1 -1
  61. package/dist/material/pbrmr.js.map +1 -1
  62. package/dist/material/pbrsg.js +1 -1
  63. package/dist/material/pbrsg.js.map +1 -1
  64. package/dist/material/shader/helper.js +512 -334
  65. package/dist/material/shader/helper.js.map +1 -1
  66. package/dist/material/skin.js +2 -2
  67. package/dist/material/skin.js.map +1 -1
  68. package/dist/material/terrain-cm.js +5 -5
  69. package/dist/material/terrain-cm.js.map +1 -1
  70. package/dist/material/water.js +6 -4
  71. package/dist/material/water.js.map +1 -1
  72. package/dist/posteffect/bloom.js +54 -4
  73. package/dist/posteffect/bloom.js.map +1 -1
  74. package/dist/posteffect/compositor.js +41 -0
  75. package/dist/posteffect/compositor.js.map +1 -1
  76. package/dist/posteffect/posteffect.js +35 -0
  77. package/dist/posteffect/posteffect.js.map +1 -1
  78. package/dist/posteffect/sao.js +7 -6
  79. package/dist/posteffect/sao.js.map +1 -1
  80. package/dist/posteffect/skinsss.js +3 -3
  81. package/dist/posteffect/skinsss.js.map +1 -1
  82. package/dist/posteffect/ssgi.js +988 -436
  83. package/dist/posteffect/ssgi.js.map +1 -1
  84. package/dist/posteffect/ssr.js +83 -45
  85. package/dist/posteffect/ssr.js.map +1 -1
  86. package/dist/posteffect/sss.js +18 -15
  87. package/dist/posteffect/sss.js.map +1 -1
  88. package/dist/posteffect/taa.js +5 -4
  89. package/dist/posteffect/taa.js.map +1 -1
  90. package/dist/posteffect/tonemap.js +15 -3
  91. package/dist/posteffect/tonemap.js.map +1 -1
  92. package/dist/render/abuffer_oit.js +2 -2
  93. package/dist/render/abuffer_oit.js.map +1 -1
  94. package/dist/render/cluster_light.js +22 -16
  95. package/dist/render/cluster_light.js.map +1 -1
  96. package/dist/render/drawable_mixin.js +8 -5
  97. package/dist/render/drawable_mixin.js.map +1 -1
  98. package/dist/render/dualdepthpeeling_oit.js +10 -5
  99. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  100. package/dist/render/envlight.js +298 -5
  101. package/dist/render/envlight.js.map +1 -1
  102. package/dist/render/gpu_picking.js +7 -5
  103. package/dist/render/gpu_picking.js.map +1 -1
  104. package/dist/render/hzb.js +28 -19
  105. package/dist/render/hzb.js.map +1 -1
  106. package/dist/render/lightpass.js +18 -4
  107. package/dist/render/lightpass.js.map +1 -1
  108. package/dist/render/render_queue.js +37 -4
  109. package/dist/render/render_queue.js.map +1 -1
  110. package/dist/render/renderer.js +8 -3
  111. package/dist/render/renderer.js.map +1 -1
  112. package/dist/render/rendergraph/blackboard.js +20 -48
  113. package/dist/render/rendergraph/blackboard.js.map +1 -1
  114. package/dist/render/rendergraph/device_pool_allocator.js +18 -58
  115. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  116. package/dist/render/rendergraph/executor.js +89 -115
  117. package/dist/render/rendergraph/executor.js.map +1 -1
  118. package/dist/render/rendergraph/forward_plus_builder.js +1003 -715
  119. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  120. package/dist/render/rendergraph/frame_graph_context.js +1 -1
  121. package/dist/render/rendergraph/frame_graph_context.js.map +1 -1
  122. package/dist/render/rendergraph/frame_resource_requirements.js +14 -0
  123. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -0
  124. package/dist/render/rendergraph/history_resource_manager.js +74 -140
  125. package/dist/render/rendergraph/history_resource_manager.js.map +1 -1
  126. package/dist/render/rendergraph/history_resources.js +7 -5
  127. package/dist/render/rendergraph/history_resources.js.map +1 -1
  128. package/dist/render/rendergraph/render_context.js +19 -0
  129. package/dist/render/rendergraph/render_context.js.map +1 -0
  130. package/dist/render/rendergraph/render_pipeline.js +315 -0
  131. package/dist/render/rendergraph/render_pipeline.js.map +1 -0
  132. package/dist/render/rendergraph/rendergraph.js +158 -141
  133. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  134. package/dist/render/rendergraph/scene_render_context.js +267 -0
  135. package/dist/render/rendergraph/scene_render_context.js.map +1 -0
  136. package/dist/render/rendergraph/texture_affinity_cache.js +19 -0
  137. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -0
  138. package/dist/render/rendergraph/types.js +19 -31
  139. package/dist/render/rendergraph/types.js.map +1 -1
  140. package/dist/render/renderpass.js +3 -3
  141. package/dist/render/renderpass.js.map +1 -1
  142. package/dist/render/shadow_mask_pass.js +7 -6
  143. package/dist/render/shadow_mask_pass.js.map +1 -1
  144. package/dist/render/sky.js +257 -95
  145. package/dist/render/sky.js.map +1 -1
  146. package/dist/render/weightedblended_oit.js +4 -3
  147. package/dist/render/weightedblended_oit.js.map +1 -1
  148. package/dist/scene/basesprite.js +2 -0
  149. package/dist/scene/basesprite.js.map +1 -1
  150. package/dist/scene/batchgroup.js +10 -0
  151. package/dist/scene/batchgroup.js.map +1 -1
  152. package/dist/scene/environment.js +61 -2
  153. package/dist/scene/environment.js.map +1 -1
  154. package/dist/scene/light.js +178 -10
  155. package/dist/scene/light.js.map +1 -1
  156. package/dist/scene/meshdrawable.js +89 -2
  157. package/dist/scene/meshdrawable.js.map +1 -1
  158. package/dist/scene/msdftext.js +2 -0
  159. package/dist/scene/msdftext.js.map +1 -1
  160. package/dist/scene/msdftextsprite.js +2 -0
  161. package/dist/scene/msdftextsprite.js.map +1 -1
  162. package/dist/scene/particlesys.js +2 -0
  163. package/dist/scene/particlesys.js.map +1 -1
  164. package/dist/scene/scene.js +34 -1
  165. package/dist/scene/scene.js.map +1 -1
  166. package/dist/scene/terrain-cm/grass.js +2 -1
  167. package/dist/scene/terrain-cm/grass.js.map +1 -1
  168. package/dist/scene/terrain-cm/terrain-cm.js +2 -0
  169. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  170. package/dist/scene/water.js +2 -0
  171. package/dist/scene/water.js.map +1 -1
  172. package/dist/shaders/atmosphere.js +5 -4
  173. package/dist/shaders/atmosphere.js.map +1 -1
  174. package/dist/shaders/fog.js +10 -3
  175. package/dist/shaders/fog.js.map +1 -1
  176. package/dist/shaders/shadow.js +149 -40
  177. package/dist/shaders/shadow.js.map +1 -1
  178. package/dist/shaders/ssgi_reprojection.js +118 -0
  179. package/dist/shaders/ssgi_reprojection.js.map +1 -0
  180. package/dist/shaders/ssr.js +322 -154
  181. package/dist/shaders/ssr.js.map +1 -1
  182. package/dist/shadow/esm.js +10 -7
  183. package/dist/shadow/esm.js.map +1 -1
  184. package/dist/shadow/pcf_opt.js +12 -12
  185. package/dist/shadow/pcf_opt.js.map +1 -1
  186. package/dist/shadow/pcf_pd.js +12 -12
  187. package/dist/shadow/pcf_pd.js.map +1 -1
  188. package/dist/shadow/pcss.js +16 -11
  189. package/dist/shadow/pcss.js.map +1 -1
  190. package/dist/shadow/shadow_impl.js +29 -3
  191. package/dist/shadow/shadow_impl.js.map +1 -1
  192. package/dist/shadow/shadowmapper.js +5 -2
  193. package/dist/shadow/shadowmapper.js.map +1 -1
  194. package/dist/shadow/ssm.js +13 -13
  195. package/dist/shadow/ssm.js.map +1 -1
  196. package/dist/shadow/vsm.js +7 -7
  197. package/dist/shadow/vsm.js.map +1 -1
  198. package/dist/utility/physical.js +74 -0
  199. package/dist/utility/physical.js.map +1 -0
  200. package/dist/utility/rendermipmap.js +2 -2
  201. package/dist/utility/rendermipmap.js.map +1 -1
  202. package/dist/utility/serialization/manager.js +3 -1
  203. package/dist/utility/serialization/manager.js.map +1 -1
  204. package/dist/utility/serialization/scene/animation.js +3 -1
  205. package/dist/utility/serialization/scene/animation.js.map +1 -1
  206. package/dist/utility/serialization/scene/batch.js +3 -1
  207. package/dist/utility/serialization/scene/batch.js.map +1 -1
  208. package/dist/utility/serialization/scene/camera.js +598 -2
  209. package/dist/utility/serialization/scene/camera.js.map +1 -1
  210. package/dist/utility/serialization/scene/light.js +180 -9
  211. package/dist/utility/serialization/scene/light.js.map +1 -1
  212. package/dist/utility/serialization/scene/material.js +43 -3
  213. package/dist/utility/serialization/scene/material.js.map +1 -1
  214. package/dist/utility/serialization/scene/mesh.js +3 -1
  215. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  216. package/dist/utility/serialization/scene/node.js +3 -1
  217. package/dist/utility/serialization/scene/node.js.map +1 -1
  218. package/dist/utility/serialization/scene/particle.js +3 -1
  219. package/dist/utility/serialization/scene/particle.js.map +1 -1
  220. package/dist/utility/serialization/scene/primitive.js +2 -0
  221. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  222. package/dist/utility/serialization/scene/scene.js +70 -0
  223. package/dist/utility/serialization/scene/scene.js.map +1 -1
  224. package/dist/utility/serialization/scene/sprite.js +3 -1
  225. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  226. package/dist/utility/serialization/scene/terrain.js +3 -1
  227. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  228. package/dist/utility/serialization/scene/text.js +3 -0
  229. package/dist/utility/serialization/scene/text.js.map +1 -1
  230. package/dist/utility/serialization/scene/water.js +3 -1
  231. package/dist/utility/serialization/scene/water.js.map +1 -1
  232. package/dist/values.js +59 -65
  233. package/dist/values.js.map +1 -1
  234. package/package.json +3 -3
@@ -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 { Vector4 } from '@zephyr3d/base';\r\nimport type {\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 { AbstractPostEffect, PostEffectLayer } from '../../posteffect/posteffect';\r\nimport { RenderGraph } from './rendergraph';\r\nimport { RenderGraphExecutor } from './executor';\r\nimport { DevicePoolAllocator } from './device_pool_allocator';\r\nimport { HistoryResourceManager } from './history_resource_manager';\r\nimport { RGHistoryResources } from './history_resources';\r\nimport { RGBlackboard, FrameResources } from './blackboard';\r\nimport type { RGExecuteContext, RGHandle } from './types';\r\nimport { renderObjectColors } from '../gpu_picking';\r\nimport type { Primitive } from '../primitive';\r\nimport { BoxShape } from '../../shapes';\r\n\r\n// ─── Shared Pass Instances ──────────────────────────────────────────\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\nlet _backDepthColorState: Nullable<ColorState> = null;\r\nlet _frontDepthColorState: Nullable<ColorState> = null;\r\nconst SURFACE_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_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 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 includeSSRSurfaceMRT: boolean\r\n): TextureFormat {\r\n const colorFormat = ctx.colorFormat!;\r\n if (!includeSSRSurfaceMRT || attachmentCount === 0) {\r\n return colorFormat;\r\n }\r\n const caps = ctx.device.getDeviceCaps();\r\n // The SSR roughness/normal MRT textures use the glossy surface format; they\r\n // are graph textures now, so derive the format directly instead of reading\r\n // the (not yet resolved) DrawContext fields.\r\n const surfaceFormat = getSurfaceTextureFormat(ctx);\r\n const colorBytes =\r\n getTextureFormatBytes(ctx, colorFormat) +\r\n getTextureFormatBytes(ctx, surfaceFormat) +\r\n getTextureFormatBytes(ctx, surfaceFormat);\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.SSR_STORE_ROUGHNESS) {\r\n attachments.push(ctx.SSRRoughnessTexture!, ctx.SSRNormalTexture!);\r\n } else if (ctx.materialFlags & MaterialVaryingFlags.SSS_STORE_NORMAL) {\r\n attachments.push(ctx.SSRNormalTexture!);\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// ─── Pipeline Options ───────────────────────────────────────────────\r\n\r\n/**\r\n * Options controlling which features are enabled in the forward+ pipeline.\r\n *\r\n * Derived from camera settings and device capabilities each frame.\r\n *\r\n * @public\r\n */\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 /** Enable screen-space reflections. */\r\n ssr: 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}\r\n\r\n/**\r\n * Derive pipeline options from the current scene/camera state.\r\n * @internal\r\n */\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 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:\r\n deviceType !== 'webgl' && (camera.TAA || camera.motionBlur || (!!ssr && camera.ssrTemporal)),\r\n hiZ: camera.HiZ && deviceType !== 'webgl',\r\n ssr: !!ssr,\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 };\r\n}\r\n\r\n// ─── Shared Frame State ─────────────────────────────────────────────\r\n\r\n/**\r\n * Mutable state shared between pass execute callbacks within a single frame.\r\n *\r\n * This replaces the monolithic DrawContext mutation pattern with an explicit\r\n * object that graph passes can read from and write to.\r\n *\r\n * @internal\r\n */\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}\r\n\r\ninterface HistoryReadBinding {\r\n name: string;\r\n handle: RGHandle;\r\n}\r\n\r\ninterface SSSProfilePassResult {\r\n profileHandle: RGHandle;\r\n paramHandle: RGHandle;\r\n normalHandle?: RGHandle;\r\n framebufferHandle: RGHandle;\r\n}\r\n\r\n// ─── Forward+ Graph Builder ─────────────────────────────────────────\r\n\r\n/**\r\n * Constructs a render graph representing the forward+ pipeline.\r\n *\r\n * Each step in the existing `SceneRenderer._renderScene` becomes a graph pass.\r\n * Execute callbacks delegate to the existing rendering code, sharing a mutable\r\n * `FrameState`.\r\n *\r\n * @param graph - The render graph to populate.\r\n * @param ctx - The draw context for this frame.\r\n * @param renderQueue - The culled render queue.\r\n * @param options - Pipeline feature toggles.\r\n * @returns The backbuffer handle (graph output).\r\n *\r\n * @public\r\n */\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 ctx.SSS = !!options.sss;\r\n ctx.SkinSSSTexture = null;\r\n\r\n // Named registry of shared frame resources (consumed by post effect setup)\r\n const blackboard = new RGBlackboard();\r\n\r\n // Shared mutable frame state\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 // ── 1. Sky Update ─────────────────────────────────────────────────\r\n let orderToken = graph.addPass('SkyUpdate', (builder) => {\r\n const done = builder.createToken('SkyUpdateDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n frame.sunLightColor = ctx.scene.env.sky.update(ctx);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 2. Clustered Light Setup ──────────────────────────────────────\r\n orderToken = graph.addPass('ClusterLights', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ClusterLightsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n ctx.clusteredLight = getClusteredLight();\r\n ctx.clusteredLight.calculateLightIndex(ctx.camera, renderQueue);\r\n });\r\n return done;\r\n });\r\n\r\n // ── 3. GPU Picking (optional, sideEffect) ─────────────────────────\r\n if (options.gpuPicking) {\r\n orderToken = graph.addPass('GPUPicking', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('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 return done;\r\n });\r\n }\r\n\r\n // ── 4. Shadow Maps ────────────────────────────────────────────────\r\n // Shadow maps are managed internally by lights, mark as side effect\r\n if (renderQueue.shadowedLights.length > 0) {\r\n orderToken = graph.addPass('ShadowMaps', (builder) => {\r\n builder.read(orderToken);\r\n const done = builder.createToken('ShadowMapsDone');\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n renderShadowMaps(ctx, renderQueue.shadowedLights);\r\n });\r\n return done;\r\n });\r\n }\r\n\r\n // ── 5. Depth Prepass ──────────────────────────────────────────────\r\n // Declare transient depth and motion vector textures\r\n const depthPassResult = graph.addPass('DepthPrepass', (builder) => {\r\n builder.read(orderToken);\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({ format, label: 'linearDepth' });\r\n const motionVectorHandle = options.motionVectors\r\n ? builder.createTexture({ format: mvFormat, label: 'motionVector' })\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 graphDepthAttachmentHandle = externalDepthAttachment\r\n ? undefined\r\n : builder.createTexture({ format: ctx.depthFormat, label: 'sceneDepth' });\r\n const depthAttachmentOrFormat = externalDepthAttachment ?? 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<FrameBuffer>(depthFramebufferHandle);\r\n frame.depthFramebuffer = renderSceneDepth(frame, depthFramebuffer, rgCtx, undefined, undefined, false);\r\n });\r\n if (skyMotionVectorFramebufferHandle) {\r\n builder.addSubpass('SkyMotionVectors', (rgCtx) => {\r\n renderSkyMotionVectors(ctx, rgCtx, skyMotionVectorFramebufferHandle);\r\n });\r\n }\r\n\r\n return {\r\n depthHandle,\r\n motionVectorHandle,\r\n graphDepthAttachmentHandle,\r\n externalDepthAttachment,\r\n depthFramebufferHandle\r\n };\r\n });\r\n\r\n let depthHandle = depthPassResult.depthHandle;\r\n const motionVectorHandle = depthPassResult.motionVectorHandle;\r\n blackboard.set(FrameResources.LinearDepth, depthHandle);\r\n if (motionVectorHandle) {\r\n blackboard.set(FrameResources.MotionVector, motionVectorHandle);\r\n }\r\n if (depthPassResult.graphDepthAttachmentHandle) {\r\n blackboard.set(FrameResources.SceneDepthAttachment, depthPassResult.graphDepthAttachmentHandle);\r\n }\r\n\r\n // ── Screen-space shadow mask ────────────────────────────────────────────\r\n // When active, render each shadow-casting light's visibility into an RGBA8\r\n // texture array (4 lights per layer). The clustered LightPass samples this\r\n // mask instead of each shadowed light running its own additive pass. The\r\n // layer/channel order is locked to ClusteredLight.getVisibleLights: shadow\r\n // lights fill clustered buffer indices 1..N in renderQueue.shadowedLights\r\n // order, and ordinal s = index-1 maps to layer s>>2, channel s&3.\r\n let shadowMaskHandle: RGHandle | null = null;\r\n // Reset any mask carried over from a previous frame; the pass below re-sets it\r\n // during execution only when the mask is actually produced.\r\n ctx.shadowMaskTexture = null;\r\n // Gate on build-time state only: renderQueue.shadowedLights is available now,\r\n // whereas ctx.shadowMapInfo is populated later by the ShadowMaps pass execute\r\n // (which runs before this pass thanks to the orderToken chain), so it must not\r\n // be part of the pass-creation condition.\r\n const useShadowMask = ctx.screenSpaceShadowMask && renderQueue.shadowedLights.length > 0;\r\n if (useShadowMask) {\r\n const numShadowLights = renderQueue.shadowedLights.length;\r\n const numLayers = ShadowMaskRenderer.getLayerCount(numShadowLights);\r\n const maskPassResult = graph.addPass('ShadowMaskPass', (builder) => {\r\n // Freeze the current linear-depth handle at build time. `depthHandle` is a\r\n // mutable `let` that a later TransmissionDepth pass reassigns to a new\r\n // version ('linearDepth@TransmissionDepth'); if the execute closure below\r\n // captured it by reference it would read a handle this pass never declared,\r\n // tripping RenderGraphExecutor's access assertion. The shadow mask is built\r\n // from the opaque prepass depth, so the pre-transmission version is correct.\r\n const maskDepthHandle = depthHandle;\r\n builder.read(maskDepthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // createTexture already registers this pass as the resource producer, so\r\n // downstream passes read this handle directly (same pattern as HiZ). The\r\n // per-layer framebuffers are created inside execute (rgCtx.createFramebuffer),\r\n // which the graph cannot see; the createTexture producer edge is what keeps\r\n // the resource alive and ordered before the LightPass reader.\r\n const maskHandle = builder.createTexture({\r\n format: 'rgba8unorm',\r\n label: 'shadowMask',\r\n arrayLayers: numLayers\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<FrameBuffer>({\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 ctx.shadowMaskTexture = maskTex;\r\n });\r\n return { maskHandle };\r\n });\r\n shadowMaskHandle = maskPassResult.maskHandle;\r\n blackboard.set(FrameResources.ShadowMask, shadowMaskHandle);\r\n }\r\n const renderDepthAttachment =\r\n depthPassResult.graphDepthAttachmentHandle ?? depthPassResult.externalDepthAttachment ?? null;\r\n // Rendering the scene directly into the final framebuffer is only possible\r\n // when no opaque-layer effect is enabled: those effects must sample the\r\n // opaque scene color as a texture and may require surface MRT attachments\r\n // (SSR roughness / SSS / SkinSSS), which the single-color final framebuffer\r\n // cannot carry. The legacy compositor.begin() used to redirect rendering to\r\n // a temporal MRT framebuffer in that case; the graph path uses the regular\r\n // scene color texture pipeline instead.\r\n const opaqueLayerHasEffects = !!ctx.compositor?.layerHasEnabledEffect(PostEffectLayer.opaque);\r\n const useFinalFramebufferAsIntermediate =\r\n !!depthPassResult.externalDepthAttachment &&\r\n depthPassResult.externalDepthAttachment === ctx.finalFramebuffer?.getDepthAttachment() &&\r\n !opaqueLayerHasEffects;\r\n\r\n let preLightTransmissionDepthToken: RGHandle | undefined;\r\n if (options.needsTransmissionDepthForSSR) {\r\n const transmissionDepthResult = graph.addPass('TransmissionDepthForSSR', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n // This pass renders transmission geometry into the prepass linear-depth\r\n // texture: model the mutation as a write so later readers order against\r\n // it through data flow instead of relying on the token alone.\r\n const depthOut = builder.write(depthHandle);\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 preLightTransmissionDepthToken = transmissionDepthResult.done;\r\n depthHandle = transmissionDepthResult.depthOut;\r\n // Re-register so blackboard consumers read the post-transmission version.\r\n blackboard.set(FrameResources.LinearDepth, depthHandle);\r\n }\r\n\r\n // ── 6. Hi-Z (optional) ───────────────────────────────────────────\r\n let hiZHandle: RGHandle | undefined;\r\n if (options.hiZ) {\r\n graph.addPass('HiZ', (builder) => {\r\n builder.read(depthHandle!);\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: 'rg32f',\r\n label: 'hiZ',\r\n mipLevels: getFullMipLevelCount(ctx.renderWidth, ctx.renderHeight)\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 ctx = frame.ctx;\r\n // Use the depth texture from the framebuffer (which contains the RenderGraph texture)\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n if (depthTex) {\r\n // Get the HiZ texture allocated by the executor\r\n const hiZTex = rgCtx.getTexture<Texture2D>(hiZHandle!);\r\n const HiZFrameBuffer = rgCtx.getFramebuffer<FrameBuffer>(hiZFramebufferHandle);\r\n buildHiZ(depthTex, HiZFrameBuffer);\r\n ctx.HiZTexture = hiZTex;\r\n }\r\n });\r\n });\r\n if (hiZHandle) {\r\n blackboard.set(FrameResources.HiZ, hiZHandle);\r\n }\r\n }\r\n\r\n // ── 7. Main Light Pass ────────────────────────────────────────────\r\n const historyManager = ctx.camera?.getHistoryResourceManager?.() ?? null;\r\n const lightHistoryReadBindings: HistoryReadBinding[] = [];\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 // Note: TAA history import/commit is handled by TAA.setup() (self-describing).\r\n\r\n let sssProfileResult: SSSProfilePassResult | undefined;\r\n if (options.sss) {\r\n sssProfileResult = graph.addPass('SSSProfile', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n const profileHandle = builder.createTexture({ format: 'rgba16f', label: 'sssProfile' });\r\n const paramHandle = builder.createTexture({ format: 'rgba8unorm', label: 'sssParam' });\r\n const normalHandle = options.ssr\r\n ? undefined\r\n : builder.createTexture({ format: getSurfaceTextureFormat(ctx), label: 'sssNormal' });\r\n const colorAttachments = normalHandle\r\n ? [ctx.colorFormat!, normalHandle, profileHandle, paramHandle]\r\n : [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 renderForwardSSSProfile(\r\n frame,\r\n rgCtx.getFramebuffer<FrameBuffer>(framebufferHandle),\r\n rgCtx.getTexture<Texture2D>(profileHandle),\r\n rgCtx.getTexture<Texture2D>(paramHandle),\r\n normalHandle ? rgCtx.getTexture<Texture2D>(normalHandle) : null\r\n );\r\n });\r\n\r\n return {\r\n profileHandle,\r\n paramHandle,\r\n normalHandle,\r\n framebufferHandle\r\n };\r\n });\r\n }\r\n\r\n // 7b. Scene color grab: renders the full scene (no transmission) into a copy\r\n // texture that transmission/refraction materials sample as background.\r\n // Extracted from the former monolithic light pass.\r\n let grabResult: { copyHandle: RGHandle; copyFramebufferHandle?: RGHandle } | undefined;\r\n if (options.needSceneColor) {\r\n grabResult = graph.addPass('SceneColorGrab', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (preLightTransmissionDepthToken) {\r\n builder.read(preLightTransmissionDepthToken);\r\n }\r\n const copyHandle = builder.createTexture({\r\n format: ctx.colorFormat!,\r\n label: 'sceneColorCopy'\r\n });\r\n // SSR may pre-insert transmission depth before LightPass for Hi-Z. In that\r\n // case the refraction scene-color copy needs an isolated depth buffer so\r\n // transmission surfaces do not occlude the background they sample.\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 renderSceneColorGrab(frame, rgCtx, copyHandle, copyFramebufferHandle);\r\n });\r\n return { copyHandle, copyFramebufferHandle };\r\n });\r\n }\r\n\r\n const lightPassResult = graph.addPass('LightPass', (builder) => {\r\n builder.read(depthHandle);\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 // Scene color: in final-framebuffer-as-intermediate mode the scene is\r\n // physically rendered into the final framebuffer, so declare the\r\n // backbuffer write — the graph sees the real data flow and no keep-alive\r\n // reads are needed downstream. Otherwise render into a graph 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 });\r\n\r\n // Transmission/refraction background produced by the SceneColorGrab pass\r\n const sceneColorCopyHandle = grabResult?.copyHandle;\r\n if (sceneColorCopyHandle) {\r\n builder.read(sceneColorCopyHandle);\r\n }\r\n if (sssProfileResult) {\r\n builder.read(sssProfileResult.profileHandle);\r\n builder.read(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n builder.read(sssProfileResult.normalHandle);\r\n }\r\n }\r\n const includeSSRSurfaceMRT = !!options.ssr;\r\n // SSR glossy-surface MRT outputs (roughness + world normal) are graph\r\n // textures owned by this pass; effects reach them through the blackboard\r\n // handles (or the ctx fields resolved below during execution).\r\n const ssrRoughnessHandle = includeSSRSurfaceMRT\r\n ? builder.createTexture({ format: getSurfaceTextureFormat(ctx), label: 'ssrRoughness' })\r\n : undefined;\r\n const ssrNormalHandle = includeSSRSurfaceMRT\r\n ? builder.createTexture({ format: getSurfaceTextureFormat(ctx), label: 'ssrNormal' })\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 includeSSRSurfaceMRT &&\r\n getSSSLightingTextureFormat(ctx, 2, includeSSRSurfaceMRT) !== 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 includeSSRSurfaceMRT\r\n );\r\n const sssDiffuseHandle = writeSSSDiffuse\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssDiffuse' })\r\n : undefined;\r\n const sssTransmissionHandle = writeSSSTransmission\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'sssTransmission' })\r\n : undefined;\r\n const skinSSSHandle = writeSkinSSS\r\n ? builder.createTexture({ format: sssLightingFormat, label: 'skinSSS' })\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 // Resolve MRT products into the DrawContext bridge fields that scene\r\n // rendering and apply()-based effects still read.\r\n ctx.SSRRoughnessTexture = ssrRoughnessHandle ? rgCtx.getTexture<Texture2D>(ssrRoughnessHandle) : null;\r\n ctx.SSRNormalTexture = ssrNormalHandle ? rgCtx.getTexture<Texture2D>(ssrNormalHandle) : null;\r\n if (sssProfileResult) {\r\n ctx.SSSProfileTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.profileHandle);\r\n ctx.SSSParamTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n ctx.SSRNormalTexture = rgCtx.getTexture<Texture2D>(sssProfileResult.normalHandle);\r\n }\r\n }\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 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 }\r\n } else {\r\n renderLightPass();\r\n }\r\n });\r\n\r\n return {\r\n sceneColorHandle,\r\n sceneColorCopyHandle,\r\n sceneColorFramebufferHandle,\r\n ssrRoughnessHandle,\r\n ssrNormalHandle,\r\n sssDiffuseHandle,\r\n sssTransmissionHandle,\r\n skinSSSHandle\r\n };\r\n });\r\n // Register the LightPass MRT products so effects can look them up by name.\r\n if (lightPassResult.ssrRoughnessHandle) {\r\n blackboard.set(FrameResources.SSRRoughness, lightPassResult.ssrRoughnessHandle);\r\n }\r\n if (lightPassResult.ssrNormalHandle) {\r\n blackboard.set(FrameResources.SSRNormal, lightPassResult.ssrNormalHandle);\r\n } else if (sssProfileResult?.normalHandle) {\r\n blackboard.set(FrameResources.SSRNormal, sssProfileResult.normalHandle);\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 // 7d. Opaque-layer post effects (SAO/SSR/SSS/SkinSSS). They read the opaque\r\n // scene color and must complete before transparent geometry renders on top\r\n // of their output. Never direct-write: the chain output becomes the\r\n // transparent pass's render target. In final-framebuffer-as-intermediate\r\n // mode the scene color handle is the LightPass's backbuffer write version,\r\n // so the data flow is real either way — no keep-alive reads needed.\r\n const opaqueChainInput = lightPassResult.sceneColorHandle;\r\n // Data dependencies for every effect pass: frame textures the effects sample\r\n // through DrawContext fields (linear depth, HiZ, scene color copy, SSS MRT\r\n // outputs) rather than through declared require* hooks.\r\n const opaqueChainDeps: RGHandle[] = [depthHandle];\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 (grabResult) {\r\n opaqueChainDeps.push(grabResult.copyHandle);\r\n }\r\n if (sssProfileResult) {\r\n opaqueChainDeps.push(sssProfileResult.profileHandle, sssProfileResult.paramHandle);\r\n if (sssProfileResult.normalHandle) {\r\n opaqueChainDeps.push(sssProfileResult.normalHandle);\r\n }\r\n }\r\n for (const handle of [\r\n lightPassResult.ssrRoughnessHandle,\r\n lightPassResult.ssrNormalHandle,\r\n lightPassResult.sssDiffuseHandle,\r\n lightPassResult.sssTransmissionHandle,\r\n lightPassResult.skinSSSHandle\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 // 7e. Transparent scene geometry (transmission/transparent lists + OIT).\r\n // Renders on top of the opaque-chain output; graph-wise an in-place write\r\n // producing a new version of the current scene color.\r\n const sceneColorHandle = graph.addPass('TransparentPass', (builder) => {\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n if (hiZHandle) {\r\n // Transparent-phase materials may ray-march HiZ (e.g. water SSR)\r\n builder.read(hiZHandle);\r\n }\r\n if (lightPassResult.sceneColorFramebufferHandle) {\r\n builder.read(lightPassResult.sceneColorFramebufferHandle);\r\n }\r\n if (lightPassResult.sceneColorCopyHandle) {\r\n builder.read(lightPassResult.sceneColorCopyHandle);\r\n }\r\n builder.read(opaqueChainResult.color);\r\n const out = builder.write(opaqueChainResult.color);\r\n builder.setExecute((rgCtx) => {\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 if (lightPassResult.sceneColorCopyHandle) {\r\n blackboard.set(FrameResources.SceneColorCopy, lightPassResult.sceneColorCopyHandle);\r\n }\r\n if (sssProfileResult) {\r\n blackboard.set(FrameResources.SSSProfile, sssProfileResult.profileHandle);\r\n blackboard.set(FrameResources.SSSParam, sssProfileResult.paramHandle);\r\n }\r\n\r\n // 8. Post effect chains + transmission depth.\r\n //\r\n // Chain input: the TransparentPass output version — the authoritative scene\r\n // color regardless of whether it physically lives in a texture or in the\r\n // backbuffer (final framebuffer used as intermediate, no opaque effects).\r\n const chainInput = sceneColorHandle;\r\n // When the scene color still physically resides in the final framebuffer,\r\n // the Present blit must be skipped if no effect moved it to a texture.\r\n // (Opaque-layer effects disable final-as-intermediate mode, so the scene\r\n // color is backbuffer-resident whenever that mode is active.)\r\n const backbufferResidentHandle = useFinalFramebufferAsIntermediate ? sceneColorHandle : null;\r\n // No extra chain dependencies: the effect chains link to the scene color\r\n // through their inputs, and per-effect texture needs are declared via the\r\n // require* hooks in AbstractPostEffect.setup().\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 // 8a. Transparent-layer effects (bloom, tonemap, FXAA, ...). They run right\r\n // after the light pass and must sample the pre-transmission linear depth, so\r\n // they carry no transmissionDepthToken dependency; TransmissionDepth is\r\n // instead ordered after this chain (see 8b).\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 // 8b. Transmission depth pass (optional). Mutates the linear depth texture;\r\n // the mutation is modeled as a graph write: the WAR hazard orders this pass\r\n // after every pre-transmission depth reader (the transparent-layer chain),\r\n // and re-registering the post-write version in the blackboard gives\r\n // end-layer effects (TAA) a real data dependency on the transmission depth.\r\n let transmissionDepthToken: RGHandle | undefined;\r\n if (options.needSceneColor && !options.needsTransmissionDepthForSSR) {\r\n const transmissionDepthResult = graph.addPass('TransmissionDepth', (builder) => {\r\n builder.read(sceneColorHandle);\r\n if (transparentChainResult.color !== sceneColorHandle) {\r\n builder.read(transparentChainResult.color);\r\n }\r\n builder.read(depthHandle);\r\n builder.read(depthPassResult.depthFramebufferHandle);\r\n const depthOut = builder.write(depthHandle);\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 depthHandle = transmissionDepthResult.depthOut;\r\n // The transparent-layer chain above read the pre-transmission version;\r\n // everything built from here on (end-layer chain) reads this one.\r\n blackboard.set(FrameResources.LinearDepth, depthHandle);\r\n }\r\n\r\n // 9. End-layer effects (TAA). Ordered after TransmissionDepth.\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 // Still backbuffer-resident if the transparent-layer chain ran no effect\r\n inputResidesInFinalTarget: !!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 // 10. Present + frame cleanup.\r\n let presentedBackbuffer: RGHandle;\r\n if (finalWroteFinal) {\r\n // The last effect wrote the final target directly; only cleanup remains.\r\n presentedBackbuffer = chainResult.color;\r\n graph.addPass('FrameCleanup', (builder) => {\r\n builder.read(presentedBackbuffer);\r\n for (const dep of endChainDependencies) {\r\n builder.read(dep);\r\n }\r\n builder.sideEffect();\r\n builder.setExecute(() => {\r\n finishFrame(frame);\r\n });\r\n });\r\n } else {\r\n presentedBackbuffer = graph.addPass('Present', (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 the blit when the chain output already lives in the final target\r\n // (final framebuffer used as intermediate and no end-layer effect ran).\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 finishFrame(frame);\r\n });\r\n return outputBackbuffer;\r\n });\r\n }\r\n\r\n return { backbuffer: presentedBackbuffer, frame };\r\n}\r\n\r\n// ─── Pass Implementation Helpers ────────────────────────────────────\r\n// These wrap the existing SceneRenderer static methods, adapted to work\r\n// with the FrameState pattern. They contain the same logic as the\r\n// original methods but read/write through FrameState.\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.SSRNormalTexture;\r\n\r\n let profileFlags = MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n if (normalTexture) {\r\n profileFlags |= MaterialVaryingFlags.SSS_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.SSRNormalTexture = 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.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_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.SSRNormalTexture = savedNormalTexture;\r\n device.popDeviceStates();\r\n sssRenderQueue.dispose();\r\n }\r\n}\r\n\r\nfunction releaseIntermediateFramebuffer(frame: FrameState): void {\r\n // Device state is contained within each pass now (LightPass/TransparentPass\r\n // push/pop their own framebuffer bindings); only the context field remains.\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 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 if (!depthFramebuffer) {\r\n // Use RenderGraph-allocated textures if provided\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<FrameBuffer>({\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 // Allocate through RenderGraph so framebuffer lifetime is owned by the executor.\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<FrameBuffer>({\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<FrameBuffer>({\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<FrameBuffer>({\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 : 1;\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 // HiZ is now built in the dedicated HiZ pass\r\n }\r\n return depthFramebuffer!;\r\n}\r\n\r\n// ─── Sky Motion Vector State ────────────────────────────────────────\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\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<FrameBuffer>(framebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\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 = 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, 'le'));\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/**\r\n * Renders the full scene (no transmission) into the scene-color copy texture\r\n * used as refraction background. Runs as its own graph pass before LightPass.\r\n * @internal\r\n */\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 // MRT store flags never apply to the background copy\r\n const sceneColorMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const sceneColorFramebuffer = copyFramebufferHandle\r\n ? rgCtx.getFramebuffer<FrameBuffer>(copyFramebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\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 = 1;\r\n _scenePass.clearStencil = 0;\r\n } else {\r\n _scenePass.clearDepth = depthTex ? null : 1;\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\nfunction 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 // Use RenderGraph-allocated scene color texture\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n\r\n ctx.materialFlags &= ~(\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL |\r\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\r\n MaterialVaryingFlags.SKIN_SSS_STORE\r\n );\r\n\r\n if (ctx.SSR) {\r\n ctx.materialFlags |= MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\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 // The graph scene color framebuffer takes priority: it is absent only when\r\n // the graph was built in final-framebuffer-as-intermediate mode (external\r\n // depth shared with the final framebuffer AND no opaque-layer effects).\r\n // Checking the shared depth first would wrongly route the MRT/opaque-effect\r\n // case into the single-color final framebuffer.\r\n if (sceneColorFramebufferHandle && !hasSurfaceMRT(ctx)) {\r\n ctx.intermediateFramebuffer = rgCtx.getFramebuffer<FrameBuffer>(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<FrameBuffer>({\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 // The scene target is bound explicitly and the device state is restored at\r\n // the end of this pass: graph passes never communicate through leftover\r\n // device state. TransparentPass re-binds the same target (or the opaque\r\n // chain output) explicitly.\r\n ctx.device.pushDeviceStates();\r\n try {\r\n // setFramebuffer() no-ops when the target is unchanged, so reset the\r\n // viewport/scissor explicitly to cover that case.\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.clearDepth = depthTex ? null : 1;\r\n _scenePass.clearStencil = depthTex ? null : 0;\r\n\r\n if (renderQueue.needSceneColor() && sceneColorCopyTex) {\r\n // Background copy was produced by the SceneColorGrab pass; seed the main\r\n // color attachment with it and render only transmission/transparent on top.\r\n ctx.sceneColorTexture = sceneColorCopyTex;\r\n blitToCurrentColorAttachment(ctx, ctx.sceneColorTexture);\r\n if (hasSurfaceMRT(ctx)) {\r\n // The background copy carries no surface MRT attachments, so opaque\r\n // geometry exists only there without roughness/normal (and SSS\r\n // lighting) data. Re-render the opaque lists into the MRT scene\r\n // target: early-z against the prepass depth keeps this cheap, and the\r\n // color output matches the blitted copy on opaque pixels while the\r\n // MRT attachments receive the surface data SSR/SSS require.\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 the shared _scenePass flags so no state leaks to the next pass:\r\n // the transparent pass sets transmission/renderOpaque/renderTransparent\r\n // itself rather than inheriting whatever this pass happened to leave.\r\n _scenePass.renderTransparent = true;\r\n _scenePass.transmission = false;\r\n ctx.device.popDeviceStates();\r\n }\r\n}\r\n\r\n/**\r\n * Renders the transmission/transparent geometry lists (including OIT) on top\r\n * of the opaque result. The target framebuffer is always bound explicitly:\r\n * the opaque chain output when opaque-layer effects ran, otherwise the same\r\n * scene target the light pass rendered into. OIT implementations composite\r\n * into the currently bound framebuffer, which this pass guarantees.\r\n * @internal\r\n */\r\nfunction 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-layer effects redirected the scene color into their chain output;\r\n // transparent geometry renders on top of it with the scene depth attached.\r\n const chainTex = rgCtx.getTexture<Texture2D>(opaqueChainOutput);\r\n const depthTex = frame.depthFramebuffer?.getDepthAttachment() as Texture2D;\r\n framebuffer = rgCtx.createFramebuffer<FrameBuffer>({\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 is single-color: surface MRT stores no longer apply.\r\n ctx.materialFlags &= ~SURFACE_MRT_FLAGS;\r\n } else if (sceneColorFramebufferHandle) {\r\n // No opaque-layer effect ran (thus no surface MRT either): continue in the\r\n // graph scene color framebuffer the light pass rendered into.\r\n framebuffer = rgCtx.getFramebuffer<FrameBuffer>(sceneColorFramebufferHandle);\r\n } else {\r\n // Final framebuffer used as scene intermediate.\r\n framebuffer = ctx.finalFramebuffer;\r\n }\r\n device.pushDeviceStates();\r\n try {\r\n // setFramebuffer() no-ops when the target is unchanged, so reset the\r\n // viewport/scissor explicitly to cover that case.\r\n device.setFramebuffer(framebuffer);\r\n device.setViewport(null);\r\n device.setScissor(null);\r\n // Derive transmission mode from the same single source of truth the opaque\r\n // pass used (renderQueue.needSceneColor()) instead of inheriting leftover\r\n // _scenePass state. When scene color is needed the opaque pass seeded the\r\n // refraction background and drew the transmission-opaque list, so here we\r\n // draw transmission_trans + transparent; otherwise just the transparent\r\n // list. Never clear: the opaque result is already in the target.\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 try {\r\n _scenePass.render(ctx, null, null, renderQueue);\r\n } finally {\r\n _scenePass.renderOpaque = 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/**\r\n * Frame-tail housekeeping shared by the Present and FrameCleanup passes.\r\n *\r\n * The end-layer post effect chain and the final blit are graph passes now\r\n * (see buildForwardPlusGraphInternal step 9/10); this only releases per-frame\r\n * state. The compositor's scene ping-pong is flushed back to the intermediate\r\n * framebuffer by compositor.end() at the tail of the light pass.\r\n *\r\n * @internal\r\n */\r\nfunction finishFrame(frame: FrameState): void {\r\n const { ctx } = frame;\r\n\r\n disposeRenderQueue(frame);\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSR_STORE_ROUGHNESS;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_PROFILE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_DIFFUSE;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SSS_STORE_TRANSMISSION;\r\n ctx.materialFlags &= ~MaterialVaryingFlags.SKIN_SSS_STORE;\r\n\r\n releaseIntermediateFramebuffer(frame);\r\n releaseDepthFramebuffer(frame);\r\n releaseClusteredLight(frame);\r\n restoreSunLight(frame);\r\n}\r\n\r\n// ─── Convenience: Execute Full Pipeline ─────────────────────────────\r\n\r\n/**\r\n * Build, compile, and execute the forward+ pipeline as a render graph.\r\n *\r\n * This is the drop-in replacement for `SceneRenderer._renderScene`.\r\n *\r\n * @param ctx - The draw context for this frame.\r\n * @public\r\n */\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, FrameBuffer> | null = null;\r\n let historyManager: HistoryResourceManager<Texture2D> | null = null;\r\n let historyFrameStarted = false;\r\n\r\n try {\r\n // Cull scene first (needed to derive options)\r\n renderQueue = _scenePass.cullScene(ctx, ctx.camera);\r\n\r\n const options = deriveForwardPlusOptions(ctx.scene, ctx.camera, device.type, renderQueue);\r\n ctx.SSS = options.sss;\r\n\r\n // Ensure the camera has a history resource manager for temporal effects (TAA, motion blur)\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 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 const compiled = graph.compile([buildResult.backbuffer]);\r\n\r\n // Use RenderGraphExecutor for automatic resource management\r\n executor = new RenderGraphExecutor(_devicePoolAllocator, ctx.renderWidth, ctx.renderHeight);\r\n\r\n // Register imported backbuffer (if using finalFramebuffer)\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 historyManager.bindImportedTextures(executor);\r\n\r\n executor.execute(compiled);\r\n historyManager.commitFrame();\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 }\r\n}\r\n"],"names":["_scenePass","LightPass","_depthPass","DepthPass","_shadowMapPass","ShadowMapPass","_clusters","_shadowMaskRenderer","ShadowMaskRenderer","_devicePoolAllocator","DevicePoolAllocator","_backDepthColorState","_frontDepthColorState","SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_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","device","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","getTextureFormatBytes","format","getTextureFormatInfo","size","shouldStoreSSSDiffuse","camera","sssStrength","sssBlurScale","shouldStoreSSSTransmission","sssTransmissionStrength","getSSSLightingTextureFormat","attachmentCount","includeSSRSurfaceMRT","colorFormat","surfaceFormat","colorBytes","fullPrecisionBytes","framebufferCaps","maxColorAttachmentBytesPerSample","getFullMipLevelCount","width","height","Math","max","floor","log2","hasSurfaceMRT","materialFlags","getLightPassColorAttachments","colorAttachment","attachments","SSRRoughnessTexture","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","deriveForwardPlusOptions","scene","deviceType","ssr","SSR","env","light","envLight","hasRadiance","sss","SSS","needSceneColor","needSceneColorWithDepth","depthPrepass","motionVectors","TAA","motionBlur","ssrTemporal","hiZ","HiZ","ssrCalcThickness","gpuPicking","getPickResultResolveFunc","needsTransmissionDepthForSSR","buildForwardPlusGraph","graph","options","buildForwardPlusGraphInternal","backbuffer","importTexture","blackboard","RGBlackboard","frame","depthFramebuffer","sunLightColor","renderQueueDisposed","clusteredLightReleased","sunLightRestored","orderToken","addPass","builder","done","createToken","sideEffect","setExecute","sky","update","read","clusteredLight","calculateLightIndex","pickResolveFunc","renderObjectColors","renderShadowMaps","depthPassResult","type","SSRCalcThickness","mvFormat","depthHandle","createTexture","label","motionVectorHandle","undefined","finalDepthAttachment","finalFramebuffer","getDepthAttachment","externalDepthAttachment","isTexture2D","graphDepthAttachmentHandle","depthFormat","depthAttachmentOrFormat","depthFramebufferHandle","createFramebuffer","renderWidth","renderHeight","colorAttachments","depthAttachment","ignoreDepthStencil","skyMotionVectorFramebufferHandle","addSubpass","rgCtx","getFramebuffer","renderSceneDepth","renderSkyMotionVectors","set","FrameResources","LinearDepth","MotionVector","SceneDepthAttachment","shadowMaskHandle","shadowMaskTexture","useShadowMask","screenSpaceShadowMask","numShadowLights","numLayers","getLayerCount","maskPassResult","maskDepthHandle","maskHandle","arrayLayers","depthTex","getTexture","maskTex","render","layer","attachmentLayer","ShadowMask","renderDepthAttachment","opaqueLayerHasEffects","compositor","layerHasEnabledEffect","PostEffectLayer","useFinalFramebufferAsIntermediate","preLightTransmissionDepthToken","transmissionDepthResult","depthOut","write","renderTransmissionDepthPass","hiZHandle","mipLevels","hiZFramebufferHandle","hiZTex","HiZFrameBuffer","buildHiZ","HiZTexture","historyManager","getHistoryResourceManager","lightHistoryReadBindings","historySize","reflectHistoryHandle","importPreviousIfCompatible","RGHistoryResources","SSR_REFLECT","sizeMode","motionVectorHistoryHandle","SSR_MOTION_VECTOR","name","handle","sssProfileResult","profileHandle","paramHandle","normalHandle","framebufferHandle","renderForwardSSSProfile","grabResult","copyHandle","copyFramebufferHandle","renderSceneColorGrab","lightPassResult","binding","sceneColorHandle","sceneColorCopyHandle","ssrRoughnessHandle","ssrNormalHandle","writeSSSDiffuse","writeSSSTransmission","writeSkinSSS","sssLightingAttachmentCount","sssLightingFormat","sssDiffuseHandle","sssTransmissionHandle","skinSSSHandle","sceneColorFramebufferHandle","sceneColorTex","sceneColorCopyTex","renderLightPass","renderOpaqueScenePass","beginReadScope","texture","endReadScope","SSRRoughness","SSRNormal","SSSDiffuse","SSSTransmission","SkinSSS","opaqueChainInput","opaqueChainDeps","opaqueChainResult","buildLayer","input","finalOutput","sceneDepthAttachment","dependencies","historyReads","history","color","wroteFinal","opaqueChainRan","out","renderTransparentScenePass","SceneColor","SceneColorCopy","SSSProfile","SSSParam","chainInput","backbufferResidentHandle","chainDependencies","isScreen","endLayerHasEffects","end","transparentChainResult","inputResidesInFinalTarget","transmissionDepthToken","endChainDependencies","chainResult","finalWroteFinal","presentedBackbuffer","dep","finishFrame","outputBackbuffer","needsBlit","sourceTex","blitter","CopyBlitter","srgbOut","blit","fetchSampler","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","originDepth","encodeDepth","getColorAttachments","createColorState","setColorMask","forceColorState","forceCullMode","renderBackface","motionVectorTexture","linearDepthTexture","depthPrepassAttachment","_skyMVProgram","_skyMVBindGroup","_skyMVBox","fb","buildRenderProgram","vertex","pb","$inputs","pos","vec3","attrib","VPMatrix","mat4","uniform","prevVPMatrix","cameraPos","prevCameraPos","main","$l","worldPos","prevWorldPos","clipPos","mul","vec4","prevClipPos","z","w","$builtins","position","$outputs","currentPos","prevPos","fragment","motionVector","sub","div","xy","createBindGroup","bindGroupLayouts","BoxShape","needNormal","needUV","setValue","viewProjectionMatrix","getWorldPosition","prevPosition","setProgram","setBindGroup","setRenderStates","AbstractPostEffect","getDefaultRenderState","draw","blitToCurrentColorAttachment","framebuffer","destination","getColorAttachment","copyTex","isolateSceneColorDepth","savedDepthPrepassAttachment","sceneColorMaterialFlags","sceneColorFramebuffer","sceneColorStatePushed","setViewport","setScissor","sceneColorTexture","opaqueChainOutput","chainTex","executeForwardPlusGraph","RenderGraph","executor","historyFrameStarted","cullScene","HistoryResourceManager","setHistoryResourceManager","beginFrame","buildResult","compiled","compile","RenderGraphExecutor","backbufferTex","setImportedTexture","bindImportedTextures","execute","commitFrame","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, 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 } 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: RGHandle | Texture2D | null;\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<FrameBuffer>(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 }\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<FrameBuffer>({\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: RGHandle | 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<FrameBuffer>(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<FrameBuffer>(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<FrameBuffer>(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 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 builder.read(opaqueChainResult.color);\r\n const out = builder.write(opaqueChainResult.color);\r\n builder.setExecute((rgCtx) => {\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<FrameBuffer>({\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<FrameBuffer>({\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<FrameBuffer>({\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<FrameBuffer>({\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\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<FrameBuffer>(framebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\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<FrameBuffer>(copyFramebufferHandle)\r\n : rgCtx.createFramebuffer<FrameBuffer>({\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<FrameBuffer>(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<FrameBuffer>({\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<FrameBuffer>(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<FrameBuffer>({\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<FrameBuffer>(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, FrameBuffer> | 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","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","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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"}