@zephyr3d/scene 0.9.19 → 0.9.20

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 (95) hide show
  1. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  2. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  3. package/dist/asset/assetmanager.js +1 -0
  4. package/dist/asset/assetmanager.js.map +1 -1
  5. package/dist/camera/camera.js +240 -201
  6. package/dist/camera/camera.js.map +1 -1
  7. package/dist/index.d.ts +190 -4
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/material/meshmaterial.js +2 -2
  11. package/dist/material/meshmaterial.js.map +1 -1
  12. package/dist/material/mixins/lit.js +10 -0
  13. package/dist/material/mixins/lit.js.map +1 -1
  14. package/dist/material/shader/helper.js +117 -2
  15. package/dist/material/shader/helper.js.map +1 -1
  16. package/dist/posteffect/skinsss.js +10 -10
  17. package/dist/posteffect/skinsss.js.map +1 -1
  18. package/dist/posteffect/ssr.js +13 -13
  19. package/dist/posteffect/ssr.js.map +1 -1
  20. package/dist/posteffect/sss.js +16 -15
  21. package/dist/posteffect/sss.js.map +1 -1
  22. package/dist/posteffect/tonemap.js +5 -5
  23. package/dist/posteffect/tonemap.js.map +1 -1
  24. package/dist/render/abuffer_oit.js +5 -0
  25. package/dist/render/abuffer_oit.js.map +1 -1
  26. package/dist/render/cluster_light.js +52 -8
  27. package/dist/render/cluster_light.js.map +1 -1
  28. package/dist/render/dualdepthpeeling_oit.js +331 -0
  29. package/dist/render/dualdepthpeeling_oit.js.map +1 -0
  30. package/dist/render/lightpass.js +24 -7
  31. package/dist/render/lightpass.js.map +1 -1
  32. package/dist/render/renderer.js +3 -0
  33. package/dist/render/renderer.js.map +1 -1
  34. package/dist/render/rendergraph/blackboard.js +40 -39
  35. package/dist/render/rendergraph/blackboard.js.map +1 -1
  36. package/dist/render/rendergraph/device_pool_allocator.js +10 -1
  37. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  38. package/dist/render/rendergraph/forward_plus_builder.js +56 -0
  39. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  40. package/dist/render/rendergraph/types.js.map +1 -1
  41. package/dist/render/renderpass.js +12 -2
  42. package/dist/render/renderpass.js.map +1 -1
  43. package/dist/render/shadow_mask_pass.js +297 -0
  44. package/dist/render/shadow_mask_pass.js.map +1 -0
  45. package/dist/render/weightedblended_oit.js +5 -0
  46. package/dist/render/weightedblended_oit.js.map +1 -1
  47. package/dist/scene/basesprite.js +1 -0
  48. package/dist/scene/basesprite.js.map +1 -1
  49. package/dist/scene/batchgroup.js +1 -0
  50. package/dist/scene/batchgroup.js.map +1 -1
  51. package/dist/scene/environment.js +1 -0
  52. package/dist/scene/environment.js.map +1 -1
  53. package/dist/scene/msdftext.js +1 -0
  54. package/dist/scene/msdftext.js.map +1 -1
  55. package/dist/scene/msdftextsprite.js +1 -0
  56. package/dist/scene/msdftextsprite.js.map +1 -1
  57. package/dist/scene/particlesys.js +1 -0
  58. package/dist/scene/particlesys.js.map +1 -1
  59. package/dist/scene/scene.js +1 -0
  60. package/dist/scene/scene.js.map +1 -1
  61. package/dist/scene/terrain-cm/grass.js +1 -0
  62. package/dist/scene/terrain-cm/grass.js.map +1 -1
  63. package/dist/scene/terrain-cm/terrain-cm.js +1 -0
  64. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  65. package/dist/scene/water.js +1 -0
  66. package/dist/scene/water.js.map +1 -1
  67. package/dist/utility/serialization/manager.js +1 -0
  68. package/dist/utility/serialization/manager.js.map +1 -1
  69. package/dist/utility/serialization/scene/animation.js +1 -0
  70. package/dist/utility/serialization/scene/animation.js.map +1 -1
  71. package/dist/utility/serialization/scene/batch.js +1 -0
  72. package/dist/utility/serialization/scene/batch.js.map +1 -1
  73. package/dist/utility/serialization/scene/camera.js +35 -2
  74. package/dist/utility/serialization/scene/camera.js.map +1 -1
  75. package/dist/utility/serialization/scene/light.js +1 -0
  76. package/dist/utility/serialization/scene/light.js.map +1 -1
  77. package/dist/utility/serialization/scene/mesh.js +1 -0
  78. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  79. package/dist/utility/serialization/scene/node.js +1 -0
  80. package/dist/utility/serialization/scene/node.js.map +1 -1
  81. package/dist/utility/serialization/scene/particle.js +1 -0
  82. package/dist/utility/serialization/scene/particle.js.map +1 -1
  83. package/dist/utility/serialization/scene/primitive.js +1 -0
  84. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  85. package/dist/utility/serialization/scene/sprite.js +1 -0
  86. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  87. package/dist/utility/serialization/scene/terrain.js +1 -0
  88. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  89. package/dist/utility/serialization/scene/text.js +1 -0
  90. package/dist/utility/serialization/scene/text.js.map +1 -1
  91. package/dist/utility/serialization/scene/water.js +1 -0
  92. package/dist/utility/serialization/scene/water.js.map +1 -1
  93. package/dist/values.js +11 -1
  94. package/dist/values.js.map +1 -1
  95. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dualdepthpeeling_oit.js","sources":["../../src/render/dualdepthpeeling_oit.ts"],"sourcesContent":["import type {\r\n AbstractDevice,\r\n BindGroup,\r\n DeviceCaps,\r\n FrameBuffer,\r\n GPUProgram,\r\n PBGlobalScope,\r\n PBInsideFunctionScope,\r\n PBShaderExp,\r\n RenderStateSet,\r\n Texture2D,\r\n TextureFormat\r\n} from '@zephyr3d/device';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Disposable, Vector4 } from '@zephyr3d/base';\r\nimport type { OIT } from './oit';\r\nimport type { DrawContext } from './drawable';\r\nimport { drawFullscreenQuad } from './fullscreenquad';\r\nimport { tryGetApp } from '../app/api';\r\n\r\nconst DEPTH_FORMAT: TextureFormat = 'rg32f';\r\nconst ACCUM_FORMAT: TextureFormat = 'rgba16f';\r\nconst COLOR_ATTACHMENT_BYTES_PER_SAMPLE = 4 + 8 + 8;\r\n\r\n/**\r\n * Dual depth peeling OIT renderer.\r\n *\r\n * @remarks\r\n * This implementation follows the official dual depth peeling pass structure:\r\n * an initialization pass writes the nearest/farthest transparent depth pair, then\r\n * each peel pass ping-pongs the depth pair while accumulating front and back colors.\r\n *\r\n * It requires MRT, per-target blending, min/max blend equations and blendable\r\n * floating-point color targets. If those capabilities are missing, supportDevice()\r\n * returns false and the transparent pass falls back to sorted alpha blending.\r\n *\r\n * @public\r\n */\r\nexport class DualDepthPeelingOIT extends Disposable implements OIT {\r\n /** Type name of DualDepthPeelingOIT */\r\n public static readonly type = 'ddp';\r\n private static readonly DEPTH_CLEAR = new Vector4(-1, -1, -1, -1);\r\n private static readonly FRONT_CLEAR = new Vector4(0, 0, 0, 1);\r\n private static readonly BACK_CLEAR = new Vector4(0, 0, 0, 0);\r\n private static _compositeProgram: Nullable<GPUProgram> = null;\r\n private static _compositeBindGroup: Nullable<BindGroup> = null;\r\n private static _compositeRenderStates: Nullable<RenderStateSet> = null;\r\n private _numPeels: number;\r\n private _currentPass: number;\r\n private _hash: string;\r\n private _depthTargets: [Nullable<Texture2D>, Nullable<Texture2D>];\r\n private _frontTarget: Nullable<Texture2D>;\r\n private _backTarget: Nullable<Texture2D>;\r\n private _framebuffers: [Nullable<FrameBuffer>, Nullable<FrameBuffer>];\r\n private _device: Nullable<AbstractDevice>;\r\n\r\n /**\r\n * Creates an instance of DualDepthPeelingOIT.\r\n *\r\n * @param numPeels - Number of peel iterations after the initialization pass.\r\n */\r\n constructor(numPeels = 8) {\r\n super();\r\n this._numPeels = Math.max(1, Math.floor(numPeels || 0));\r\n this._currentPass = 0;\r\n this._hash = DualDepthPeelingOIT.type;\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** Number of front/back peel iterations after the initialization pass. */\r\n get numPeels() {\r\n return this._numPeels;\r\n }\r\n set numPeels(val: number) {\r\n this._numPeels = Math.max(1, Math.floor(val || 0));\r\n }\r\n\r\n /**\r\n * Checks whether dual depth peeling can run with a capability snapshot.\r\n *\r\n * @param deviceType - The device type.\r\n * @param caps - The device capabilities.\r\n * @returns True if dual depth peeling is supported.\r\n */\r\n static supportDeviceCaps(deviceType: string, caps: DeviceCaps) {\r\n const framebufferCaps = caps.framebufferCaps;\r\n const textureCaps = caps.textureCaps;\r\n const shaderCaps = caps.shaderCaps;\r\n const miscCaps = caps.miscCaps;\r\n const webgl2OrBetter = deviceType !== 'webgl' || shaderCaps.maxUniformBufferSize > 0;\r\n return (\r\n webgl2OrBetter &&\r\n framebufferCaps.maxDrawBuffers >= 3 &&\r\n framebufferCaps.supportPerTargetBlending &&\r\n framebufferCaps.maxColorAttachmentBytesPerSample >= COLOR_ATTACHMENT_BYTES_PER_SAMPLE &&\r\n miscCaps.supportBlendMinMax &&\r\n textureCaps.supportHalfFloatColorBuffer &&\r\n textureCaps.supportFloatColorBuffer &&\r\n textureCaps.supportFloatBlending\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.getType}\r\n */\r\n getType() {\r\n return DualDepthPeelingOIT.type;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.supportDevice}\r\n */\r\n supportDevice(deviceType: string) {\r\n const device = tryGetApp()?.device;\r\n return (\r\n !!device &&\r\n device.type === deviceType &&\r\n DualDepthPeelingOIT.supportDeviceCaps(deviceType, device.getDeviceCaps())\r\n );\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsPremultipliedAlpha}\r\n */\r\n wantsPremultipliedAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.wantsAdditiveLightPassAlpha}\r\n */\r\n wantsAdditiveLightPassAlpha() {\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.begin}\r\n */\r\n begin(ctx: DrawContext) {\r\n this.releaseFramebuffers();\r\n if (!ctx.depthTexture) {\r\n return 0;\r\n }\r\n this._device = ctx.device;\r\n this.createFramebuffers(ctx);\r\n return this._numPeels + 1;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.end}\r\n */\r\n end(ctx: DrawContext) {\r\n try {\r\n if (this._frontTarget && this._backTarget) {\r\n this.composite(ctx, ctx.device, this._frontTarget, this._backTarget);\r\n }\r\n } finally {\r\n this.releaseFramebuffers();\r\n this._hash = DualDepthPeelingOIT.type;\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.beginPass}\r\n */\r\n beginPass(ctx: DrawContext, pass: number) {\r\n this._currentPass = pass;\r\n const targetIndex = pass & 1;\r\n const currentDepthTarget = this._depthTargets[targetIndex];\r\n const previousDepthTarget = this._depthTargets[targetIndex ^ 1];\r\n const framebuffer = this._framebuffers[targetIndex];\r\n if (!currentDepthTarget || !framebuffer || (pass > 0 && !previousDepthTarget)) {\r\n return false;\r\n }\r\n this._hash =\r\n pass === 0\r\n ? `${this.getType()}#init#${currentDepthTarget.uid}`\r\n : `${this.getType()}#peel#${previousDepthTarget!.uid}`;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(framebuffer);\r\n ctx.device.clearFrameBuffer(\r\n pass === 0\r\n ? [DualDepthPeelingOIT.DEPTH_CLEAR, DualDepthPeelingOIT.FRONT_CLEAR, DualDepthPeelingOIT.BACK_CLEAR]\r\n : [DualDepthPeelingOIT.DEPTH_CLEAR, null, null],\r\n null,\r\n null\r\n );\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.endPass}\r\n */\r\n endPass(ctx: DrawContext, _pass: number) {\r\n ctx.device.popDeviceStates();\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setupFragmentOutput}\r\n */\r\n setupFragmentOutput(scope: PBGlobalScope) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2();\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4();\r\n scope.$outputs.Z_DDP_backColor = pb.vec4();\r\n if (this._currentPass > 0) {\r\n scope.Z_DDP_depthTexture = pb.tex2D().uniform(2).noSampler();\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.outputFragmentColor}\r\n */\r\n outputFragmentColor(scope: PBInsideFunctionScope, color: PBShaderExp, ctx: DrawContext) {\r\n const pb = scope.$builder;\r\n scope.$outputs.Z_DDP_depth = pb.vec2(-1, -1);\r\n scope.$outputs.Z_DDP_frontColor = pb.vec4(0, 0, 0, 0);\r\n scope.$outputs.Z_DDP_backColor = pb.vec4(0, 0, 0, 0);\r\n if (this._currentPass === 0) {\r\n scope.$outputs.Z_DDP_depth = pb.vec2(pb.neg(scope.$builtins.fragCoord.z), scope.$builtins.fragCoord.z);\r\n } else {\r\n scope.$l.Z_DDP_prevDepth = pb.textureLoad(\r\n scope.Z_DDP_depthTexture,\r\n pb.ivec2(scope.$builtins.fragCoord.xy),\r\n 0\r\n ).xy;\r\n scope.$l.Z_DDP_frontDepth = pb.neg(scope.Z_DDP_prevDepth.x);\r\n scope.$l.Z_DDP_backDepth = scope.Z_DDP_prevDepth.y;\r\n scope.$l.Z_DDP_curDepth = scope.$builtins.fragCoord.z;\r\n scope.$l.Z_DDP_outputColor = pb.vec4(color.rgb, ctx.lightBlending ? pb.float(0) : color.a);\r\n scope\r\n .$if(\r\n pb.or(\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n pb.discard();\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.greaterThan(pb.sub(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_frontDepth),\r\n pb.lessThan(pb.add(scope.Z_DDP_curDepth, 0.000001), scope.Z_DDP_backDepth)\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_depth = pb.vec2(\r\n pb.neg(this.$builtins.fragCoord.z),\r\n this.$builtins.fragCoord.z\r\n );\r\n }\r\n )\r\n .$elseif(\r\n pb.and(\r\n pb.lessThan(scope.Z_DDP_curDepth, pb.add(scope.Z_DDP_frontDepth, 0.000001)),\r\n pb.greaterThan(scope.Z_DDP_curDepth, pb.sub(scope.Z_DDP_frontDepth, 0.000001))\r\n ),\r\n function () {\r\n this.$outputs.Z_DDP_frontColor = this.Z_DDP_outputColor;\r\n }\r\n )\r\n .$else(function () {\r\n this.$outputs.Z_DDP_backColor = this.Z_DDP_outputColor;\r\n });\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.applyUniforms}\r\n */\r\n applyUniforms(_ctx: DrawContext, bindGroup: BindGroup) {\r\n if (this._currentPass > 0) {\r\n bindGroup.setTexture('Z_DDP_depthTexture', this._depthTargets[(this._currentPass & 1) ^ 1]!);\r\n }\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.calculateHash}\r\n */\r\n calculateHash() {\r\n return this._hash;\r\n }\r\n\r\n /**\r\n * {@inheritDoc OIT.setRenderStates}\r\n */\r\n setRenderStates(rs: RenderStateSet) {\r\n rs.useBlendingState().enable(false).enableAlphaToCoverage(false);\r\n rs.useDepthState().enableTest(true).enableWrite(false);\r\n\r\n rs.useTargetBlendingState(0)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('max', 'max')\r\n .setBlendFunc('one', 'one');\r\n\r\n rs.useTargetBlendingState(1)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('dst-alpha', 'one')\r\n .setBlendFuncAlpha('zero', 'inv-src-alpha');\r\n\r\n rs.useTargetBlendingState(2)\r\n .enable(true)\r\n .enableAlphaToCoverage(false)\r\n .setBlendEquation('add', 'add')\r\n .setBlendFuncRGB('one', 'inv-src-alpha')\r\n .setBlendFuncAlpha('one', 'inv-src-alpha');\r\n }\r\n\r\n /** @internal */\r\n private createFramebuffers(ctx: DrawContext) {\r\n const device = ctx.device;\r\n const width = ctx.depthTexture!.width;\r\n const height = ctx.depthTexture!.height;\r\n const depthTarget0 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const depthTarget1 = device.pool.fetchTemporalTexture2D(false, DEPTH_FORMAT, width, height, false);\r\n const frontTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const backTarget = device.pool.fetchTemporalTexture2D(false, ACCUM_FORMAT, width, height, false);\r\n const framebuffer0 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget0, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n const framebuffer1 = device.pool.createTemporalFramebuffer(\r\n false,\r\n [depthTarget1, frontTarget, backTarget],\r\n ctx.depthTexture\r\n );\r\n device.pool.releaseTexture(depthTarget0);\r\n device.pool.releaseTexture(depthTarget1);\r\n device.pool.releaseTexture(frontTarget);\r\n device.pool.releaseTexture(backTarget);\r\n this._depthTargets = [depthTarget0, depthTarget1];\r\n this._frontTarget = frontTarget;\r\n this._backTarget = backTarget;\r\n this._framebuffers = [framebuffer0, framebuffer1];\r\n }\r\n\r\n /** @internal */\r\n private composite(ctx: DrawContext, device: AbstractDevice, frontTarget: Texture2D, backTarget: Texture2D) {\r\n const currentFramebuffer = device.getFramebuffer();\r\n const colorAttachment = currentFramebuffer?.getColorAttachments()[0] ?? null;\r\n const singleColorFramebuffer =\r\n currentFramebuffer && currentFramebuffer.getColorAttachments().length > 1 && colorAttachment\r\n ? device.pool.fetchTemporalFramebuffer(\r\n false,\r\n 0,\r\n 0,\r\n colorAttachment,\r\n currentFramebuffer.getDepthAttachment(),\r\n false\r\n )\r\n : null;\r\n if (singleColorFramebuffer) {\r\n const viewport = device.getViewport();\r\n const scissor = device.getScissor();\r\n device.pushDeviceStates();\r\n device.setFramebuffer(singleColorFramebuffer);\r\n device.setViewport(viewport);\r\n device.setScissor(scissor);\r\n }\r\n try {\r\n device.setProgram(DualDepthPeelingOIT.getCompositeProgram(device));\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('frontTex', frontTarget);\r\n DualDepthPeelingOIT._compositeBindGroup!.setTexture('backTex', backTarget);\r\n device.setBindGroup(0, DualDepthPeelingOIT._compositeBindGroup!);\r\n drawFullscreenQuad(DualDepthPeelingOIT._compositeRenderStates!);\r\n } finally {\r\n if (singleColorFramebuffer) {\r\n device.popDeviceStates();\r\n device.pool.releaseFrameBuffer(singleColorFramebuffer);\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n private releaseFramebuffers() {\r\n if (this._device) {\r\n if (this._framebuffers[0]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[0]);\r\n }\r\n if (this._framebuffers[1]) {\r\n this._device.pool.releaseFrameBuffer(this._framebuffers[1]);\r\n }\r\n }\r\n this._depthTargets = [null, null];\r\n this._frontTarget = null;\r\n this._backTarget = null;\r\n this._framebuffers = [null, null];\r\n this._device = null;\r\n }\r\n\r\n /** @internal */\r\n private static getCompositeProgram(device: AbstractDevice) {\r\n if (!this._compositeProgram) {\r\n this._compositeProgram = device.buildRenderProgram({\r\n vertex(pb) {\r\n this.$inputs.pos = pb.vec2().attrib('position');\r\n this.$outputs.uv = pb.vec2();\r\n pb.main(function () {\r\n this.$builtins.position = pb.vec4(this.$inputs.pos, 1, 1);\r\n this.$outputs.uv = pb.add(pb.mul(this.$inputs.pos.xy, 0.5), pb.vec2(0.5));\r\n if (device.type === 'webgpu') {\r\n this.$builtins.position.y = pb.neg(this.$builtins.position.y);\r\n }\r\n });\r\n },\r\n fragment(pb) {\r\n this.$outputs.outColor = pb.vec4();\r\n this.frontTex = pb.tex2D().uniform(0);\r\n this.backTex = pb.tex2D().uniform(0);\r\n pb.main(function () {\r\n this.$l.frontColor = pb.textureSample(this.frontTex, this.$inputs.uv);\r\n this.$l.backColor = pb.textureSample(this.backTex, this.$inputs.uv);\r\n this.$l.remainingAlpha = pb.clamp(pb.mul(this.frontColor.a, pb.sub(1, this.backColor.a)), 0, 1);\r\n this.$outputs.outColor = pb.vec4(\r\n pb.add(this.frontColor.rgb, pb.mul(this.frontColor.a, this.backColor.rgb)),\r\n this.remainingAlpha\r\n );\r\n });\r\n }\r\n })!;\r\n this._compositeProgram.name = '@DualDepthPeelingOIT_Composite';\r\n this._compositeBindGroup = device.createBindGroup(this._compositeProgram.bindGroupLayouts[0]);\r\n this._compositeRenderStates = device.createRenderStateSet();\r\n this._compositeRenderStates\r\n .useBlendingState()\r\n .enable(true)\r\n .setBlendFuncRGB('one', 'src-alpha')\r\n .setBlendFuncAlpha('zero', 'one');\r\n this._compositeRenderStates.useDepthState().enableTest(false).enableWrite(false);\r\n }\r\n return this._compositeProgram;\r\n }\r\n\r\n protected onDispose() {\r\n super.onDispose();\r\n this.releaseFramebuffers();\r\n }\r\n}\r\n"],"names":["DEPTH_FORMAT","ACCUM_FORMAT","COLOR_ATTACHMENT_BYTES_PER_SAMPLE","DualDepthPeelingOIT","Disposable","type","DEPTH_CLEAR","Vector4","FRONT_CLEAR","BACK_CLEAR","_compositeProgram","_compositeBindGroup","_compositeRenderStates","_numPeels","_currentPass","_hash","_depthTargets","_frontTarget","_backTarget","_framebuffers","_device","numPeels","Math","max","floor","val","supportDeviceCaps","deviceType","caps","framebufferCaps","textureCaps","shaderCaps","miscCaps","webgl2OrBetter","maxUniformBufferSize","maxDrawBuffers","supportPerTargetBlending","maxColorAttachmentBytesPerSample","supportBlendMinMax","supportHalfFloatColorBuffer","supportFloatColorBuffer","supportFloatBlending","getType","supportDevice","device","tryGetApp","getDeviceCaps","wantsPremultipliedAlpha","wantsAdditiveLightPassAlpha","begin","ctx","releaseFramebuffers","depthTexture","createFramebuffers","end","composite","beginPass","pass","targetIndex","currentDepthTarget","previousDepthTarget","framebuffer","uid","pushDeviceStates","setFramebuffer","clearFrameBuffer","endPass","_pass","popDeviceStates","setupFragmentOutput","scope","pb","$builder","$outputs","Z_DDP_depth","vec2","Z_DDP_frontColor","vec4","Z_DDP_backColor","Z_DDP_depthTexture","tex2D","uniform","noSampler","outputFragmentColor","color","neg","$builtins","fragCoord","z","$l","Z_DDP_prevDepth","textureLoad","ivec2","xy","Z_DDP_frontDepth","x","Z_DDP_backDepth","y","Z_DDP_curDepth","Z_DDP_outputColor","rgb","lightBlending","float","a","$if","or","lessThan","add","greaterThan","sub","discard","$elseif","and","$else","applyUniforms","_ctx","bindGroup","setTexture","calculateHash","setRenderStates","rs","useBlendingState","enable","enableAlphaToCoverage","useDepthState","enableTest","enableWrite","useTargetBlendingState","setBlendEquation","setBlendFunc","setBlendFuncRGB","setBlendFuncAlpha","width","height","depthTarget0","pool","fetchTemporalTexture2D","depthTarget1","frontTarget","backTarget","framebuffer0","createTemporalFramebuffer","framebuffer1","releaseTexture","currentFramebuffer","getFramebuffer","colorAttachment","getColorAttachments","singleColorFramebuffer","length","fetchTemporalFramebuffer","getDepthAttachment","viewport","getViewport","scissor","getScissor","setViewport","setScissor","setProgram","getCompositeProgram","setBindGroup","drawFullscreenQuad","releaseFrameBuffer","buildRenderProgram","vertex","$inputs","pos","attrib","uv","main","position","mul","fragment","outColor","frontTex","backTex","frontColor","textureSample","backColor","remainingAlpha","clamp","name","createBindGroup","bindGroupLayouts","createRenderStateSet","onDispose"],"mappings":"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"}
@@ -5,16 +5,16 @@ import { ShaderHelper } from '../material/shader/helper.js';
5
5
 
6
6
  const SURFACE_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_DIFFUSE | MaterialVaryingFlags.SSS_STORE_NORMAL | MaterialVaryingFlags.SSS_STORE_TRANSMISSION | MaterialVaryingFlags.SKIN_SSS_STORE;
7
7
  const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHNESS | MaterialVaryingFlags.SSS_STORE_PROFILE | MaterialVaryingFlags.SSS_STORE_NORMAL;
8
- /**
9
- * Forward render pass
10
- * @internal
8
+ /**
9
+ * Forward render pass
10
+ * @internal
11
11
  */ class LightPass extends RenderPass {
12
12
  /** @internal */ _shadowMapHash;
13
13
  /** @internal */ _transmission;
14
14
  /** @internal */ _renderOpaque;
15
15
  /** @internal */ _renderTransparent;
16
- /**
17
- * Creates an instance of ForwardRenderPass
16
+ /**
17
+ * Creates an instance of ForwardRenderPass
18
18
  */ constructor(){
19
19
  super(RENDER_PASS_TYPE_LIGHT);
20
20
  this._shadowMapHash = null;
@@ -79,7 +79,7 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
79
79
  return shadowMapInfo.keys().next().value ?? null;
80
80
  }
81
81
  /** @internal */ _getGlobalBindGroupHash(ctx, camera) {
82
- return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}`;
82
+ return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${ctx.lightBlending ? 1 : 0}:${camera.oit?.calculateHash() ?? ''}:${ctx.env.getHash(ctx)}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${ctx.HiZTexture?.uid ?? 0}:${ctx.screenSpaceShadowMask ? 1 : 0}`;
83
83
  }
84
84
  /** @internal */ renderLightPass(ctx, camera, itemList, lights, flags) {
85
85
  const baseLightPass = !ctx.lightBlending;
@@ -97,6 +97,12 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
97
97
  ShaderHelper.setLightUniforms(bindGroup, ctx, ctx.clusteredLight.clusterParam, ctx.clusteredLight.countParam, ctx.clusteredLight.lightBuffer, ctx.clusteredLight.lightIndexTexture);
98
98
  flags.lightSet[ctx.renderPassHash] = 1;
99
99
  }
100
+ // Bind the per-queue cluster shadow-mask mode every call (not cached with
101
+ // lightSet): the same clustered program/bind group may serve both the opaque
102
+ // (sample mask) and transparent (skip shadow lights) queues.
103
+ if (ctx.screenSpaceShadowMask) {
104
+ ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);
105
+ }
100
106
  }
101
107
  if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {
102
108
  ShaderHelper.setFogUniforms(bindGroup, ctx.env.sky.skyType === 'scatter' ? 1 : 0, ctx.env.sky.mappedFogType, baseLightPass ? 0 : 1, ctx.env.sky.atmosphereParams, ctx.env.sky.heightFogParams, ctx.env.sky.getAerialPerspectiveLUT(ctx), ctx.env.sky.getSkyDistantLightLUT(ctx));
@@ -149,6 +155,14 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
149
155
  }
150
156
  if (lists[i]) {
151
157
  ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;
158
+ // The screen-space shadow mask is only valid for the opaque depth-prepass
159
+ // geometry: lists[0] in non-transmission mode. For that queue, shadow lights
160
+ // are lit via the clustered pass sampling the mask (additive passes skipped).
161
+ // Every other queue (transparent/OIT hair, transmission) keeps the inline
162
+ // additive shadow path, where shadows are sampled per-fragment at the real
163
+ // surface depth.
164
+ const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;
165
+ ctx.shadowMaskClusterSample = useShadowMaskQueue;
152
166
  ctx.oit = i === 0 || !items ? null : oit;
153
167
  const isolateTransparentABufferLightPasses = !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';
154
168
  if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {
@@ -190,7 +204,10 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
190
204
  }
191
205
  };
192
206
  let lightIndex = 0;
193
- if (ctx.shadowMapInfo) {
207
+ // Run the per-shadowed-light additive passes unless this queue uses the
208
+ // screen-space shadow mask (opaque). Transparent/transmission queues keep
209
+ // the inline additive shadow path even when the mask is enabled.
210
+ if (!useShadowMaskQueue && ctx.shadowMapInfo) {
194
211
  for (const k of ctx.shadowMapInfo.keys()){
195
212
  ctx.currentShadowLight = k;
196
213
  ctx.lightBlending = lightIndex > 0;
@@ -1 +1 @@
1
- {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\nimport type { Nullable } from '@zephyr3d/base';\nimport { Vector4 } from '@zephyr3d/base';\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\nimport type { PunctualLight } from '../scene/light';\nimport type { DrawContext } from './drawable';\nimport { ShaderHelper } from '../material/shader/helper';\nimport type { Camera } from '../camera';\n\nconst SURFACE_MRT_FLAGS =\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\n MaterialVaryingFlags.SSS_STORE_PROFILE |\n MaterialVaryingFlags.SSS_STORE_DIFFUSE |\n MaterialVaryingFlags.SSS_STORE_NORMAL |\n MaterialVaryingFlags.SSS_STORE_TRANSMISSION |\n MaterialVaryingFlags.SKIN_SSS_STORE;\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\n MaterialVaryingFlags.SSS_STORE_PROFILE |\n MaterialVaryingFlags.SSS_STORE_NORMAL;\n\n/**\n * Forward render pass\n * @internal\n */\nexport class LightPass extends RenderPass {\n /** @internal */\n protected _shadowMapHash: Nullable<string>;\n /** @internal */\n protected _transmission: boolean;\n /** @internal */\n protected _renderOpaque: boolean;\n /** @internal */\n protected _renderTransparent: boolean;\n /**\n * Creates an instance of ForwardRenderPass\n */\n constructor() {\n super(RENDER_PASS_TYPE_LIGHT);\n this._shadowMapHash = null;\n this._transmission = false;\n this._renderOpaque = true;\n this._renderTransparent = true;\n this._clearColor = Vector4.zero();\n }\n /** @internal */\n get transmission() {\n return this._transmission;\n }\n set transmission(val) {\n this._transmission = val;\n }\n /** @internal */\n get renderOpaque() {\n return this._renderOpaque;\n }\n set renderOpaque(val: boolean) {\n this._renderOpaque = !!val;\n }\n /** @internal */\n get renderTransparent() {\n return this._renderTransparent;\n }\n set renderTransparent(val: boolean) {\n this._renderTransparent = !!val;\n }\n /** @internal */\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\n const framebuffer = ctx.device.getFramebuffer();\n if (!framebuffer) {\n return null;\n }\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\n attachments.push(ctx.SSSDiffuseTexture!);\n }\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\n attachments.push(ctx.SSSTransmissionTexture!);\n }\n if (materialFlags & MaterialVaryingFlags.SKIN_SSS_STORE) {\n attachments.push(ctx.SkinSSSTexture!);\n }\n return attachments.length === 1 ? attachments[0] : attachments;\n }\n /** @internal */\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\n const shadowMapInfo = ctx.shadowMapInfo;\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\n return null;\n }\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\n return renderQueue.primaryDirectionalLight;\n }\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\n return renderQueue.primaryTransmissionLight;\n }\n for (const light of renderQueue.shadowedLights) {\n if (shadowMapInfo.has(light)) {\n return light;\n }\n }\n return shadowMapInfo.keys().next().value ?? null;\n }\n /** @internal */\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\n ctx.lightBlending ? 1 : 0\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\n ctx\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\n ctx.HiZTexture?.uid ?? 0\n }`;\n }\n /** @internal */\n protected renderLightPass(\n ctx: DrawContext,\n camera: Camera,\n itemList: RenderItemListBundle,\n lights: PunctualLight[],\n flags: any\n ) {\n const baseLightPass = !ctx.lightBlending;\n ctx.drawEnvLight =\n baseLightPass &&\n ctx.env!.light.type !== 'none' &&\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\n if (!flags.cameraSet[ctx.renderPassHash]) {\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\n flags.cameraSet[ctx.renderPassHash] = 1;\n }\n if (ctx.currentShadowLight) {\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\n } else {\n if (!flags.lightSet[ctx.renderPassHash]) {\n ShaderHelper.setLightUniforms(\n bindGroup,\n ctx,\n ctx.clusteredLight!.clusterParam,\n ctx.clusteredLight!.countParam,\n ctx.clusteredLight!.lightBuffer!,\n ctx.clusteredLight!.lightIndexTexture!\n );\n flags.lightSet[ctx.renderPassHash] = 1;\n }\n }\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\n ShaderHelper.setFogUniforms(\n bindGroup,\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\n ctx.env!.sky.mappedFogType,\n baseLightPass ? 0 : 1,\n ctx.env!.sky.atmosphereParams,\n ctx.env!.sky.heightFogParams,\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\n );\n flags.fogSet[ctx.renderPassHash] = 1;\n }\n ctx.device.setBindGroup(0, bindGroup);\n const reverseWinding = camera.worldMatrixDet < 0;\n for (const lit of itemList.lit) {\n this.drawItemList(lit, ctx, reverseWinding);\n }\n if (!ctx.lightBlending) {\n for (const unlit of itemList.unlit) {\n this.drawItemList(unlit, ctx, reverseWinding);\n }\n }\n }\n /** @internal */\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\n ctx.renderPassHash = null;\n ctx.env = ctx.scene.env;\n ctx.drawEnvLight = false;\n ctx.flip = this.isAutoFlip(ctx);\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\n const tmpFramebuffer = surfaceMRT\n ? ctx.device.pool.fetchTemporalFramebuffer(\n false,\n ctx.device.getDrawingBufferWidth(),\n ctx.device.getDrawingBufferHeight(),\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\n ctx.device.getFramebuffer()!.getDepthAttachment()\n )\n : null;\n const needsTransparentSingleColorFramebuffer =\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\n ? ctx.device.pool.fetchTemporalFramebuffer(\n false,\n ctx.device.getDrawingBufferWidth(),\n ctx.device.getDrawingBufferHeight(),\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\n ctx.device.getFramebuffer()!.getDepthAttachment()\n )\n : tmpFramebuffer;\n const oit =\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\n ? camera.oit\n : null;\n if (!oit && renderQueue.drawTransparent) {\n renderQueue.sortTransparentItems(camera.getWorldPosition());\n }\n const flags: any = {\n lightSet: {},\n cameraSet: {},\n fogSet: {}\n };\n const items = renderQueue.itemList;\n const lists = this._transmission\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\n : [items?.opaque, items?.transparent];\n for (let i = 0; i < lists.length; i++) {\n const isOpaquePass = i === 0;\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\n continue;\n }\n if (lists[i]) {\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\n ctx.oit = i === 0 || !items ? null : oit;\n const isolateTransparentABufferLightPasses =\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\n }\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\n for (let p = 0; p < numOitPasses; p++) {\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\n if (!ctx.oit.beginPass(ctx, p)) {\n continue;\n }\n }\n const runLightPass = (lights: PunctualLight[]) => {\n if (ctx.oit && isolateTransparentABufferLightPasses) {\n if (!ctx.oit.beginPass(ctx, p)) {\n return;\n }\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\n ctx.oit.endPass(ctx, p);\n } else {\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\n }\n };\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\n const passFramebuffer =\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\n const savedMaterialFlags = ctx.materialFlags;\n ctx.materialFlags =\n ctx.queue === QUEUE_TRANSPARENT\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\n ctx.device.pushDeviceStates();\n ctx.device.setFramebuffer(passFramebuffer);\n try {\n runLightPass(lights);\n } finally {\n ctx.materialFlags = savedMaterialFlags;\n ctx.device.popDeviceStates();\n }\n } else {\n runLightPass(lights);\n }\n };\n let lightIndex = 0;\n if (ctx.shadowMapInfo) {\n for (const k of ctx.shadowMapInfo.keys()) {\n ctx.currentShadowLight = k;\n ctx.lightBlending = lightIndex > 0;\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\n runAdditiveLightPass([k]);\n lightIndex++;\n }\n }\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\n ctx.currentShadowLight = null;\n ctx.lightBlending = lightIndex > 0;\n this._shadowMapHash = '';\n runAdditiveLightPass(renderQueue.unshadowedLights);\n }\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\n ctx.oit.endPass(ctx, p);\n }\n }\n if (ctx.oit) {\n ctx.oit.end(ctx);\n }\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\n }\n if (i === 0 && !ctx.sceneColorTexture) {\n if (tmpFramebuffer) {\n ctx.device.pushDeviceStates();\n ctx.device.setFramebuffer(tmpFramebuffer);\n }\n ctx.env.sky.renderSky(ctx);\n if (ctx.env.sky.fogPresents) {\n ctx.env.sky.renderFog(camera);\n }\n if (tmpFramebuffer) {\n ctx.device.popDeviceStates();\n }\n }\n // Post effects of all layers are built as render graph passes; the\n // opaque-layer chain runs between the opaque and transparent passes.\n }\n if (tmpFramebuffer) {\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\n }\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\n }\n ctx.oit = null;\n }\n}\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","releaseFrameBuffer"],"mappings":"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"}
1
+ {"version":3,"file":"lightpass.js","sources":["../../src/render/lightpass.ts"],"sourcesContent":["import { RenderPass } from './renderpass';\r\nimport { MaterialVaryingFlags, QUEUE_OPAQUE, QUEUE_TRANSPARENT, RENDER_PASS_TYPE_LIGHT } from '../values';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { Vector4 } from '@zephyr3d/base';\r\nimport type { RenderItemListBundle, RenderQueue } from './render_queue';\r\nimport type { PunctualLight } from '../scene/light';\r\nimport type { DrawContext } from './drawable';\r\nimport { ShaderHelper } from '../material/shader/helper';\r\nimport type { Camera } from '../camera';\r\n\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\nconst ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS =\r\n MaterialVaryingFlags.SSR_STORE_ROUGHNESS |\r\n MaterialVaryingFlags.SSS_STORE_PROFILE |\r\n MaterialVaryingFlags.SSS_STORE_NORMAL;\r\n\r\n/**\r\n * Forward render pass\r\n * @internal\r\n */\r\nexport class LightPass extends RenderPass {\r\n /** @internal */\r\n protected _shadowMapHash: Nullable<string>;\r\n /** @internal */\r\n protected _transmission: boolean;\r\n /** @internal */\r\n protected _renderOpaque: boolean;\r\n /** @internal */\r\n protected _renderTransparent: boolean;\r\n /**\r\n * Creates an instance of ForwardRenderPass\r\n */\r\n constructor() {\r\n super(RENDER_PASS_TYPE_LIGHT);\r\n this._shadowMapHash = null;\r\n this._transmission = false;\r\n this._renderOpaque = true;\r\n this._renderTransparent = true;\r\n this._clearColor = Vector4.zero();\r\n }\r\n /** @internal */\r\n get transmission() {\r\n return this._transmission;\r\n }\r\n set transmission(val) {\r\n this._transmission = val;\r\n }\r\n /** @internal */\r\n get renderOpaque() {\r\n return this._renderOpaque;\r\n }\r\n set renderOpaque(val: boolean) {\r\n this._renderOpaque = !!val;\r\n }\r\n /** @internal */\r\n get renderTransparent() {\r\n return this._renderTransparent;\r\n }\r\n set renderTransparent(val: boolean) {\r\n this._renderTransparent = !!val;\r\n }\r\n /** @internal */\r\n protected getAdditiveLightPassColorAttachments(ctx: DrawContext, materialFlags: number) {\r\n const framebuffer = ctx.device.getFramebuffer();\r\n if (!framebuffer) {\r\n return null;\r\n }\r\n const attachments: any[] = [framebuffer.getColorAttachments()[0]];\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_DIFFUSE) {\r\n attachments.push(ctx.SSSDiffuseTexture!);\r\n }\r\n if (materialFlags & MaterialVaryingFlags.SSS_STORE_TRANSMISSION) {\r\n attachments.push(ctx.SSSTransmissionTexture!);\r\n }\r\n if (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 /** @internal */\r\n protected selectTransparentOITShadowLight(ctx: DrawContext, renderQueue: RenderQueue) {\r\n const shadowMapInfo = ctx.shadowMapInfo;\r\n if (!shadowMapInfo || shadowMapInfo.size === 0) {\r\n return null;\r\n }\r\n if (renderQueue.primaryDirectionalLight && shadowMapInfo.has(renderQueue.primaryDirectionalLight)) {\r\n return renderQueue.primaryDirectionalLight;\r\n }\r\n if (renderQueue.primaryTransmissionLight && shadowMapInfo.has(renderQueue.primaryTransmissionLight)) {\r\n return renderQueue.primaryTransmissionLight;\r\n }\r\n for (const light of renderQueue.shadowedLights) {\r\n if (shadowMapInfo.has(light)) {\r\n return light;\r\n }\r\n }\r\n return shadowMapInfo.keys().next().value ?? null;\r\n }\r\n /** @internal */\r\n protected _getGlobalBindGroupHash(ctx: DrawContext, camera: Camera) {\r\n return `${this._shadowMapHash}:${ctx.currentShadowLight?.runtimeId ?? 0}:${\r\n ctx.lightBlending ? 1 : 0\r\n }:${camera.oit?.calculateHash() ?? ''}:${ctx.env!.getHash(\r\n ctx\r\n )}:${ctx.materialFlags}:${ctx.linearDepthTexture?.uid ?? 0}:${ctx.sceneColorTexture?.uid ?? 0}:${\r\n ctx.HiZTexture?.uid ?? 0\r\n }:${ctx.screenSpaceShadowMask ? 1 : 0}`;\r\n }\r\n /** @internal */\r\n protected renderLightPass(\r\n ctx: DrawContext,\r\n camera: Camera,\r\n itemList: RenderItemListBundle,\r\n lights: PunctualLight[],\r\n flags: any\r\n ) {\r\n const baseLightPass = !ctx.lightBlending;\r\n ctx.drawEnvLight =\r\n baseLightPass &&\r\n ctx.env!.light.type !== 'none' &&\r\n (ctx.env!.light.envLight.hasRadiance() || ctx.env!.light.envLight.hasIrradiance());\r\n ctx.renderPassHash = this.getGlobalBindGroupHash(ctx, camera);\r\n const bindGroup = ctx.globalBindGroupAllocator.getGlobalBindGroup(ctx);\r\n if (!flags.cameraSet[ctx.renderPassHash]) {\r\n ShaderHelper.setCameraUniforms(bindGroup, ctx, camera, !!ctx.device.getFramebuffer());\r\n flags.cameraSet[ctx.renderPassHash] = 1;\r\n }\r\n if (ctx.currentShadowLight) {\r\n ShaderHelper.setLightUniformsShadow(bindGroup, ctx, lights[0]);\r\n } else {\r\n if (!flags.lightSet[ctx.renderPassHash]) {\r\n ShaderHelper.setLightUniforms(\r\n bindGroup,\r\n ctx,\r\n ctx.clusteredLight!.clusterParam,\r\n ctx.clusteredLight!.countParam,\r\n ctx.clusteredLight!.lightBuffer!,\r\n ctx.clusteredLight!.lightIndexTexture!\r\n );\r\n flags.lightSet[ctx.renderPassHash] = 1;\r\n }\r\n // Bind the per-queue cluster shadow-mask mode every call (not cached with\r\n // lightSet): the same clustered program/bind group may serve both the opaque\r\n // (sample mask) and transparent (skip shadow lights) queues.\r\n if (ctx.screenSpaceShadowMask) {\r\n ShaderHelper.setShadowMaskMode(bindGroup, !!ctx.shadowMaskClusterSample);\r\n }\r\n }\r\n if (ctx.materialFlags & MaterialVaryingFlags.APPLY_FOG && !flags.fogSet[ctx.renderPassHash]) {\r\n ShaderHelper.setFogUniforms(\r\n bindGroup,\r\n ctx.env!.sky.skyType === 'scatter' ? 1 : 0,\r\n ctx.env!.sky.mappedFogType,\r\n baseLightPass ? 0 : 1,\r\n ctx.env!.sky.atmosphereParams,\r\n ctx.env!.sky.heightFogParams,\r\n ctx.env!.sky.getAerialPerspectiveLUT(ctx),\r\n ctx.env!.sky.getSkyDistantLightLUT(ctx)\r\n );\r\n flags.fogSet[ctx.renderPassHash] = 1;\r\n }\r\n ctx.device.setBindGroup(0, bindGroup);\r\n const reverseWinding = camera.worldMatrixDet < 0;\r\n for (const lit of itemList.lit) {\r\n this.drawItemList(lit, ctx, reverseWinding);\r\n }\r\n if (!ctx.lightBlending) {\r\n for (const unlit of itemList.unlit) {\r\n this.drawItemList(unlit, ctx, reverseWinding);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n protected renderItems(ctx: DrawContext, camera: Camera, renderQueue: RenderQueue) {\r\n ctx.renderPassHash = null;\r\n ctx.env = ctx.scene.env;\r\n ctx.drawEnvLight = false;\r\n ctx.flip = this.isAutoFlip(ctx);\r\n const surfaceMRT = ctx.materialFlags & SURFACE_MRT_FLAGS;\r\n const additiveOpaqueMaterialFlags = ctx.materialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n const additiveTransparentMaterialFlags = ctx.materialFlags & ~SURFACE_MRT_FLAGS;\r\n const tmpFramebuffer = surfaceMRT\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveOpaqueMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : null;\r\n const needsTransparentSingleColorFramebuffer =\r\n !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;\r\n const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer\r\n ? ctx.device.pool.fetchTemporalFramebuffer(\r\n false,\r\n ctx.device.getDrawingBufferWidth(),\r\n ctx.device.getDrawingBufferHeight(),\r\n this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags)!,\r\n ctx.device.getFramebuffer()!.getDepthAttachment()\r\n )\r\n : tmpFramebuffer;\r\n const oit =\r\n renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type)\r\n ? camera.oit\r\n : null;\r\n if (!oit && renderQueue.drawTransparent) {\r\n renderQueue.sortTransparentItems(camera.getWorldPosition());\r\n }\r\n const flags: any = {\r\n lightSet: {},\r\n cameraSet: {},\r\n fogSet: {}\r\n };\r\n const items = renderQueue.itemList;\r\n const lists = this._transmission\r\n ? [items?.transmission, items?.transmission_trans, items?.transparent]\r\n : [items?.opaque, items?.transparent];\r\n for (let i = 0; i < lists.length; i++) {\r\n const isOpaquePass = i === 0;\r\n if ((isOpaquePass && !this._renderOpaque) || (!isOpaquePass && !this._renderTransparent)) {\r\n continue;\r\n }\r\n if (lists[i]) {\r\n ctx.queue = i === 0 ? QUEUE_OPAQUE : QUEUE_TRANSPARENT;\r\n // The screen-space shadow mask is only valid for the opaque depth-prepass\r\n // geometry: lists[0] in non-transmission mode. For that queue, shadow lights\r\n // are lit via the clustered pass sampling the mask (additive passes skipped).\r\n // Every other queue (transparent/OIT hair, transmission) keeps the inline\r\n // additive shadow path, where shadows are sampled per-fragment at the real\r\n // surface depth.\r\n const useShadowMaskQueue = ctx.screenSpaceShadowMask && !this._transmission && i === 0;\r\n ctx.shadowMaskClusterSample = useShadowMaskQueue;\r\n ctx.oit = i === 0 || !items ? null : oit;\r\n const isolateTransparentABufferLightPasses =\r\n !!ctx.oit && ctx.queue === QUEUE_TRANSPARENT && ctx.oit.getType() === 'ab';\r\n if ((ctx.queue === QUEUE_TRANSPARENT || this._transmission) && ctx.scene.env.sky.fogPresents) {\r\n ctx.materialFlags |= MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n const numOitPasses = ctx.oit ? ctx.oit.begin(ctx) : 1;\r\n for (let p = 0; p < numOitPasses; p++) {\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n continue;\r\n }\r\n }\r\n const runLightPass = (lights: PunctualLight[]) => {\r\n if (ctx.oit && isolateTransparentABufferLightPasses) {\r\n if (!ctx.oit.beginPass(ctx, p)) {\r\n return;\r\n }\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n ctx.oit.endPass(ctx, p);\r\n } else {\r\n this.renderLightPass(ctx, camera, lists[i]!, lights, flags);\r\n }\r\n };\r\n const runAdditiveLightPass = (lights: PunctualLight[]) => {\r\n const passFramebuffer =\r\n ctx.queue === QUEUE_TRANSPARENT ? transparentTmpFramebuffer : tmpFramebuffer;\r\n if (ctx.lightBlending && passFramebuffer && !ctx.oit) {\r\n const savedMaterialFlags = ctx.materialFlags;\r\n ctx.materialFlags =\r\n ctx.queue === QUEUE_TRANSPARENT\r\n ? savedMaterialFlags & ~SURFACE_MRT_FLAGS\r\n : savedMaterialFlags & ~ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS;\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(passFramebuffer);\r\n try {\r\n runLightPass(lights);\r\n } finally {\r\n ctx.materialFlags = savedMaterialFlags;\r\n ctx.device.popDeviceStates();\r\n }\r\n } else {\r\n runLightPass(lights);\r\n }\r\n };\r\n let lightIndex = 0;\r\n // Run the per-shadowed-light additive passes unless this queue uses the\r\n // screen-space shadow mask (opaque). Transparent/transmission queues keep\r\n // the inline additive shadow path even when the mask is enabled.\r\n if (!useShadowMaskQueue && ctx.shadowMapInfo) {\r\n for (const k of ctx.shadowMapInfo.keys()) {\r\n ctx.currentShadowLight = k;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = ctx.shadowMapInfo.get(k)!.shaderHash;\r\n runAdditiveLightPass([k]);\r\n lightIndex++;\r\n }\r\n }\r\n if (lightIndex === 0 || renderQueue.unshadowedLights.length > 0) {\r\n ctx.currentShadowLight = null;\r\n ctx.lightBlending = lightIndex > 0;\r\n this._shadowMapHash = '';\r\n runAdditiveLightPass(renderQueue.unshadowedLights);\r\n }\r\n if (ctx.oit && !isolateTransparentABufferLightPasses) {\r\n ctx.oit.endPass(ctx, p);\r\n }\r\n }\r\n if (ctx.oit) {\r\n ctx.oit.end(ctx);\r\n }\r\n ctx.materialFlags &= ~MaterialVaryingFlags.APPLY_FOG;\r\n }\r\n if (i === 0 && !ctx.sceneColorTexture) {\r\n if (tmpFramebuffer) {\r\n ctx.device.pushDeviceStates();\r\n ctx.device.setFramebuffer(tmpFramebuffer);\r\n }\r\n ctx.env.sky.renderSky(ctx);\r\n if (ctx.env.sky.fogPresents) {\r\n ctx.env.sky.renderFog(camera);\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.popDeviceStates();\r\n }\r\n }\r\n // Post effects of all layers are built as render graph passes; the\r\n // opaque-layer chain runs between the opaque and transparent passes.\r\n }\r\n if (tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n if (transparentTmpFramebuffer && transparentTmpFramebuffer !== tmpFramebuffer) {\r\n ctx.device.pool.releaseFrameBuffer(transparentTmpFramebuffer);\r\n }\r\n ctx.oit = null;\r\n }\r\n}\r\n"],"names":["SURFACE_MRT_FLAGS","MaterialVaryingFlags","SSR_STORE_ROUGHNESS","SSS_STORE_PROFILE","SSS_STORE_DIFFUSE","SSS_STORE_NORMAL","SSS_STORE_TRANSMISSION","SKIN_SSS_STORE","ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS","LightPass","RenderPass","RENDER_PASS_TYPE_LIGHT","_shadowMapHash","_transmission","_renderOpaque","_renderTransparent","_clearColor","Vector4","zero","transmission","val","renderOpaque","renderTransparent","getAdditiveLightPassColorAttachments","ctx","materialFlags","framebuffer","device","getFramebuffer","attachments","getColorAttachments","push","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","length","selectTransparentOITShadowLight","renderQueue","shadowMapInfo","size","primaryDirectionalLight","has","primaryTransmissionLight","light","shadowedLights","keys","next","value","_getGlobalBindGroupHash","camera","currentShadowLight","runtimeId","lightBlending","oit","calculateHash","env","getHash","linearDepthTexture","uid","sceneColorTexture","HiZTexture","screenSpaceShadowMask","renderLightPass","itemList","lights","flags","baseLightPass","drawEnvLight","type","envLight","hasRadiance","hasIrradiance","renderPassHash","getGlobalBindGroupHash","bindGroup","globalBindGroupAllocator","getGlobalBindGroup","cameraSet","ShaderHelper","setCameraUniforms","setLightUniformsShadow","lightSet","setLightUniforms","clusteredLight","clusterParam","countParam","lightBuffer","lightIndexTexture","setShadowMaskMode","shadowMaskClusterSample","APPLY_FOG","fogSet","setFogUniforms","sky","skyType","mappedFogType","atmosphereParams","heightFogParams","getAerialPerspectiveLUT","getSkyDistantLightLUT","setBindGroup","reverseWinding","worldMatrixDet","lit","drawItemList","unlit","scene","flip","isAutoFlip","surfaceMRT","additiveOpaqueMaterialFlags","additiveTransparentMaterialFlags","tmpFramebuffer","pool","fetchTemporalFramebuffer","getDrawingBufferWidth","getDrawingBufferHeight","getDepthAttachment","needsTransparentSingleColorFramebuffer","transparentTmpFramebuffer","drawTransparent","supportDevice","sortTransparentItems","getWorldPosition","items","lists","transmission_trans","transparent","opaque","i","isOpaquePass","queue","QUEUE_OPAQUE","QUEUE_TRANSPARENT","useShadowMaskQueue","isolateTransparentABufferLightPasses","getType","fogPresents","numOitPasses","begin","p","beginPass","runLightPass","endPass","runAdditiveLightPass","passFramebuffer","savedMaterialFlags","pushDeviceStates","setFramebuffer","popDeviceStates","lightIndex","k","get","shaderHash","unshadowedLights","end","renderSky","renderFog","releaseFrameBuffer"],"mappings":"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"}
@@ -48,6 +48,9 @@ import { executeForwardPlusGraph } from './rendergraph/forward_plus_builder.js';
48
48
  motionVectors: device.type !== 'webgl' && (camera.TAA || camera.motionBlur || SSR && camera.ssrTemporal),
49
49
  HiZ: camera.HiZ && device.type !== 'webgl',
50
50
  HiZTexture: null,
51
+ // WebGL1 has no 2D array textures; degrade gracefully to the legacy
52
+ // per-light additive shadow path (mirrors the HiZ gating above).
53
+ screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',
51
54
  globalBindGroupAllocator,
52
55
  camera,
53
56
  compositor: camera.compositor,
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // SSR roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SSRRoughnessTexture: null,\r\n SSRNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
1
+ {"version":3,"file":"renderer.js","sources":["../../src/render/renderer.ts"],"sourcesContent":["import { CopyBlitter } from '../blitter';\r\nimport type { DrawContext } from './drawable';\r\nimport type { Scene } from '../scene';\r\nimport type { Camera } from '../camera';\r\nimport { GlobalBindGroupAllocator } from './globalbindgroup_allocator';\r\nimport { fetchSampler } from '../utility/misc';\r\nimport { getDevice } from '../app/api';\r\nimport { executeForwardPlusGraph } from './rendergraph/forward_plus_builder';\r\n\r\n/**\r\n * Forward render scheme\r\n * @internal\r\n */\r\nexport class SceneRenderer {\r\n /**\r\n * Renders a scene by given camera\r\n * @param scene - The scene to render\r\n * @param camera - The camera that will be used to render the scene\r\n */\r\n static renderScene(scene: Scene, camera: Camera): void {\r\n const device = getDevice();\r\n const halfFloatColorBuffer = device.getDeviceCaps().textureCaps.supportHalfFloatColorBuffer;\r\n const colorFormat = camera.HDR && halfFloatColorBuffer ? 'rgba16f' : 'rgba8unorm';\r\n const depthFormat = device.getDeviceCaps().framebufferCaps.supportDepth32floatStencil8\r\n ? 'd32fs8'\r\n : 'd24s8';\r\n const globalBindGroupAllocator = GlobalBindGroupAllocator.get();\r\n scene.frameUpdate();\r\n scene.frameUpdatePerCamera(camera);\r\n if (camera && !device.isContextLost()) {\r\n const defaultViewport = (!camera.TAA || device.type === 'webgl') && !camera.viewport && !camera.scissor;\r\n const renderX = camera.viewport ? device.screenXToDevice(camera.viewport[0]) : 0;\r\n const renderY = camera.viewport ? device.screenYToDevice(camera.viewport[1]) : 0;\r\n const renderWidth = camera.viewport\r\n ? device.screenXToDevice(camera.viewport[2])\r\n : device.getDrawingBufferWidth();\r\n const renderHeight = camera.viewport\r\n ? device.screenYToDevice(camera.viewport[3])\r\n : device.getDrawingBufferHeight();\r\n if (renderWidth > 0 && renderHeight > 0) {\r\n const tmpFramebuffer = defaultViewport\r\n ? null\r\n : device.pool.fetchTemporalFramebuffer(false, renderWidth, renderHeight, colorFormat, depthFormat);\r\n const originFramebuffer = device.getFramebuffer();\r\n if (tmpFramebuffer) {\r\n device.pushDeviceStates();\r\n device.setFramebuffer(tmpFramebuffer);\r\n }\r\n device.clearFrameBuffer(camera.clearColor, camera.clearDepth, camera.clearStencil);\r\n const SSR = camera.SSR && scene.env.light.envLight && scene.env.light.envLight.hasRadiance();\r\n const SSS = camera.SSS;\r\n const ctx: DrawContext = {\r\n device,\r\n scene,\r\n renderWidth,\r\n renderHeight,\r\n oit: null,\r\n motionVectors:\r\n device.type !== 'webgl' && (camera.TAA || camera.motionBlur || (SSR && camera.ssrTemporal)),\r\n HiZ: camera.HiZ && device.type !== 'webgl',\r\n HiZTexture: null,\r\n // WebGL1 has no 2D array textures; degrade gracefully to the legacy\r\n // per-light additive shadow path (mirrors the HiZ gating above).\r\n screenSpaceShadowMask: camera.screenSpaceShadowMask && device.type !== 'webgl',\r\n globalBindGroupAllocator,\r\n camera,\r\n compositor: camera.compositor,\r\n queue: 0,\r\n lightBlending: false,\r\n renderPass: null,\r\n renderPassHash: null,\r\n flip: false,\r\n depthFormat,\r\n colorFormat,\r\n drawEnvLight: false,\r\n env: null,\r\n sunLight: null,\r\n primaryDirectionalLight: null,\r\n primaryTransmissionLight: null,\r\n materialFlags: 0,\r\n SSR,\r\n SSS,\r\n SSRCalcThickness: SSR && camera.ssrCalcThickness,\r\n // SSR roughness/normal MRT textures are render graph resources\r\n // created by the LightPass; resolved into these fields at execution.\r\n SSRRoughnessTexture: null,\r\n SSRNormalTexture: null,\r\n SSSProfileTexture: null,\r\n SSSParamTexture: null,\r\n SSSDiffuseTexture: null,\r\n SSSTransmissionTexture: null,\r\n SkinSSSTexture: null,\r\n ssrSDFBoxBuffer: null,\r\n ssrSDFBoxCount: 0,\r\n finalFramebuffer: device.getFramebuffer(),\r\n intermediateFramebuffer: null\r\n };\r\n this._renderScene(ctx);\r\n if (tmpFramebuffer) {\r\n device.popDeviceStates();\r\n const oversizedViewport =\r\n renderX < 0 ||\r\n renderY < 0 ||\r\n renderX + renderWidth > device.getDrawingBufferWidth() ||\r\n renderY + renderHeight > device.getDrawingBufferHeight();\r\n const blitter = new CopyBlitter();\r\n if (oversizedViewport) {\r\n blitter.destRect = [renderX, renderY, renderWidth, renderHeight];\r\n } else {\r\n blitter.viewport = camera.viewport ? camera.viewport.slice() : null;\r\n }\r\n blitter.scissor = camera.scissor ? camera.scissor.slice() : null;\r\n blitter.srgbOut = !originFramebuffer;\r\n blitter.blit(\r\n tmpFramebuffer.getColorAttachments()[0],\r\n originFramebuffer ?? null,\r\n fetchSampler('clamp_nearest_nomip')\r\n );\r\n device.pool.releaseFrameBuffer(tmpFramebuffer);\r\n }\r\n } else {\r\n camera.getPickResultResolveFunc()?.(null);\r\n return;\r\n }\r\n }\r\n GlobalBindGroupAllocator.release(globalBindGroupAllocator);\r\n }\r\n\r\n /** @internal */\r\n protected static _renderScene(ctx: DrawContext): void {\r\n executeForwardPlusGraph(ctx);\r\n }\r\n}\r\n"],"names":["SceneRenderer","renderScene","scene","camera","device","getDevice","halfFloatColorBuffer","getDeviceCaps","textureCaps","supportHalfFloatColorBuffer","colorFormat","HDR","depthFormat","framebufferCaps","supportDepth32floatStencil8","globalBindGroupAllocator","GlobalBindGroupAllocator","get","frameUpdate","frameUpdatePerCamera","isContextLost","defaultViewport","TAA","type","viewport","scissor","renderX","screenXToDevice","renderY","screenYToDevice","renderWidth","getDrawingBufferWidth","renderHeight","getDrawingBufferHeight","tmpFramebuffer","pool","fetchTemporalFramebuffer","originFramebuffer","getFramebuffer","pushDeviceStates","setFramebuffer","clearFrameBuffer","clearColor","clearDepth","clearStencil","SSR","env","light","envLight","hasRadiance","SSS","ctx","oit","motionVectors","motionBlur","ssrTemporal","HiZ","HiZTexture","screenSpaceShadowMask","compositor","queue","lightBlending","renderPass","renderPassHash","flip","drawEnvLight","sunLight","primaryDirectionalLight","primaryTransmissionLight","materialFlags","SSRCalcThickness","ssrCalcThickness","SSRRoughnessTexture","SSRNormalTexture","SSSProfileTexture","SSSParamTexture","SSSDiffuseTexture","SSSTransmissionTexture","SkinSSSTexture","ssrSDFBoxBuffer","ssrSDFBoxCount","finalFramebuffer","intermediateFramebuffer","_renderScene","popDeviceStates","oversizedViewport","blitter","CopyBlitter","destRect","slice","srgbOut","blit","getColorAttachments","fetchSampler","releaseFrameBuffer","getPickResultResolveFunc","release","executeForwardPlusGraph"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- /**
2
- * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.
3
- *
4
- * Producer passes register their output handles under these names so that
5
- * consumers (e.g. post effects) can declare reads without hard-coupling to
6
- * the pass that produced them.
7
- *
8
- * @public
1
+ /**
2
+ * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.
3
+ *
4
+ * Producer passes register their output handles under these names so that
5
+ * consumers (e.g. post effects) can declare reads without hard-coupling to
6
+ * the pass that produced them.
7
+ *
8
+ * @public
9
9
  */ const FrameResources = {
10
10
  SceneColor: 'sceneColor',
11
11
  SceneColorCopy: 'sceneColorCopy',
@@ -19,47 +19,48 @@
19
19
  SSSParam: 'sssParam',
20
20
  SSSDiffuse: 'sssDiffuse',
21
21
  SSSTransmission: 'sssTransmission',
22
- SkinSSS: 'skinSSS'
22
+ SkinSSS: 'skinSSS',
23
+ ShadowMask: 'shadowMask'
23
24
  };
24
- /**
25
- * Named registry of render graph resource handles for the current frame.
26
- *
27
- * The blackboard decouples resource producers from consumers: passes that
28
- * create shared resources register the returned handles by name, and later
29
- * passes look them up to declare read dependencies. This replaces passing
30
- * textures through mutable `DrawContext` fields.
31
- *
32
- * A blackboard instance is valid for a single graph build; create a new one
33
- * (or clear it) every frame together with the graph.
34
- *
35
- * @public
25
+ /**
26
+ * Named registry of render graph resource handles for the current frame.
27
+ *
28
+ * The blackboard decouples resource producers from consumers: passes that
29
+ * create shared resources register the returned handles by name, and later
30
+ * passes look them up to declare read dependencies. This replaces passing
31
+ * textures through mutable `DrawContext` fields.
32
+ *
33
+ * A blackboard instance is valid for a single graph build; create a new one
34
+ * (or clear it) every frame together with the graph.
35
+ *
36
+ * @public
36
37
  */ class RGBlackboard {
37
38
  /** @internal */ _handles = new Map();
38
- /**
39
- * Register a resource handle under a name, replacing any previous entry.
40
- * @param name - Resource name, typically one of {@link FrameResources}.
41
- * @param handle - The handle to register.
39
+ /**
40
+ * Register a resource handle under a name, replacing any previous entry.
41
+ * @param name - Resource name, typically one of {@link FrameResources}.
42
+ * @param handle - The handle to register.
42
43
  */ set(name, handle) {
43
44
  this._handles.set(name, handle);
44
45
  }
45
- /**
46
- * Look up a resource handle by name.
47
- * @param name - Resource name, typically one of {@link FrameResources}.
48
- * @returns The registered handle, or null if not present this frame.
46
+ /**
47
+ * Look up a resource handle by name.
48
+ * @param name - Resource name, typically one of {@link FrameResources}.
49
+ * @returns The registered handle, or null if not present this frame.
49
50
  */ get(name) {
50
51
  return this._handles.get(name) ?? null;
51
52
  }
52
- /**
53
- * Check whether a resource is registered.
54
- * @param name - Resource name.
55
- * @returns true if a handle is registered under the name.
53
+ /**
54
+ * Check whether a resource is registered.
55
+ * @param name - Resource name.
56
+ * @returns true if a handle is registered under the name.
56
57
  */ has(name) {
57
58
  return this._handles.has(name);
58
59
  }
59
- /**
60
- * Look up a resource handle that must exist.
61
- * @param name - Resource name.
62
- * @returns The registered handle.
60
+ /**
61
+ * Look up a resource handle that must exist.
62
+ * @param name - Resource name.
63
+ * @returns The registered handle.
63
64
  */ expect(name) {
64
65
  const handle = this._handles.get(name);
65
66
  if (!handle) {
@@ -67,8 +68,8 @@
67
68
  }
68
69
  return handle;
69
70
  }
70
- /**
71
- * Remove all registered handles.
71
+ /**
72
+ * Remove all registered handles.
72
73
  */ clear() {
73
74
  this._handles.clear();
74
75
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\nimport type { RGHandle } from './types';\n\n/**\n * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.\n *\n * Producer passes register their output handles under these names so that\n * consumers (e.g. post effects) can declare reads without hard-coupling to\n * the pass that produced them.\n *\n * @public\n */\nexport const FrameResources = {\n SceneColor: 'sceneColor',\n SceneColorCopy: 'sceneColorCopy',\n LinearDepth: 'linearDepth',\n SceneDepthAttachment: 'sceneDepthAttachment',\n MotionVector: 'motionVector',\n HiZ: 'hiZ',\n SSRRoughness: 'ssrRoughness',\n SSRNormal: 'ssrNormal',\n SSSProfile: 'sssProfile',\n SSSParam: 'sssParam',\n SSSDiffuse: 'sssDiffuse',\n SSSTransmission: 'sssTransmission',\n SkinSSS: 'skinSSS'\n} as const;\n\n/**\n * Named registry of render graph resource handles for the current frame.\n *\n * The blackboard decouples resource producers from consumers: passes that\n * create shared resources register the returned handles by name, and later\n * passes look them up to declare read dependencies. This replaces passing\n * textures through mutable `DrawContext` fields.\n *\n * A blackboard instance is valid for a single graph build; create a new one\n * (or clear it) every frame together with the graph.\n *\n * @public\n */\nexport class RGBlackboard {\n /** @internal */\n private _handles: Map<string, RGHandle> = new Map();\n /**\n * Register a resource handle under a name, replacing any previous entry.\n * @param name - Resource name, typically one of {@link FrameResources}.\n * @param handle - The handle to register.\n */\n set(name: string, handle: RGHandle): void {\n this._handles.set(name, handle);\n }\n /**\n * Look up a resource handle by name.\n * @param name - Resource name, typically one of {@link FrameResources}.\n * @returns The registered handle, or null if not present this frame.\n */\n get(name: string): Nullable<RGHandle> {\n return this._handles.get(name) ?? null;\n }\n /**\n * Check whether a resource is registered.\n * @param name - Resource name.\n * @returns true if a handle is registered under the name.\n */\n has(name: string): boolean {\n return this._handles.has(name);\n }\n /**\n * Look up a resource handle that must exist.\n * @param name - Resource name.\n * @returns The registered handle.\n */\n expect(name: string): RGHandle {\n const handle = this._handles.get(name);\n if (!handle) {\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\n }\n return handle;\n }\n /**\n * Remove all registered handles.\n */\n clear(): void {\n this._handles.clear();\n }\n}\n"],"names":["FrameResources","SceneColor","SceneColorCopy","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SSRRoughness","SSRNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","SkinSSS","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"AAGA;;;;;;;;UASaA,cAAiB,GAAA;IAC5BC,UAAY,EAAA,YAAA;IACZC,cAAgB,EAAA,gBAAA;IAChBC,WAAa,EAAA,aAAA;IACbC,oBAAsB,EAAA,sBAAA;IACtBC,YAAc,EAAA,cAAA;IACdC,GAAK,EAAA,KAAA;IACLC,YAAc,EAAA,cAAA;IACdC,SAAW,EAAA,WAAA;IACXC,UAAY,EAAA,YAAA;IACZC,QAAU,EAAA,UAAA;IACVC,UAAY,EAAA,YAAA;IACZC,eAAiB,EAAA,iBAAA;IACjBC,OAAS,EAAA;AACX;AAEA;;;;;;;;;;;;AAYC,IACM,MAAMC,YAAAA,CAAAA;AACX,qBACQC,QAAkC,GAAA,IAAIC,GAAM,EAAA;AACpD;;;;AAIC,MACDC,GAAIC,CAAAA,IAAY,EAAEC,MAAgB,EAAQ;AACxC,QAAA,IAAI,CAACJ,QAAQ,CAACE,GAAG,CAACC,IAAMC,EAAAA,MAAAA,CAAAA;AAC1B;AACA;;;;MAKAC,GAAAA,CAAIF,IAAY,EAAsB;AACpC,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACK,GAAG,CAACF,IAAS,CAAA,IAAA,IAAA;AACpC;AACA;;;;MAKAG,GAAAA,CAAIH,IAAY,EAAW;AACzB,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACM,GAAG,CAACH,IAAAA,CAAAA;AAC3B;AACA;;;;MAKAI,MAAAA,CAAOJ,IAAY,EAAY;AAC7B,QAAA,MAAMC,SAAS,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AACjC,QAAA,IAAI,CAACC,MAAQ,EAAA;AACX,YAAA,MAAM,IAAII,KAAM,CAAA,CAAC,uCAAuC,EAAEL,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AACtF;QACA,OAAOC,MAAAA;AACT;AACA;;AAEC,MACDK,KAAc,GAAA;QACZ,IAAI,CAACT,QAAQ,CAACS,KAAK,EAAA;AACrB;AACF;;;;"}
1
+ {"version":3,"file":"blackboard.js","sources":["../../../src/render/rendergraph/blackboard.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { RGHandle } from './types';\r\n\r\n/**\r\n * Canonical names for well-known per-frame resources shared through {@link RGBlackboard}.\r\n *\r\n * Producer passes register their output handles under these names so that\r\n * consumers (e.g. post effects) can declare reads without hard-coupling to\r\n * the pass that produced them.\r\n *\r\n * @public\r\n */\r\nexport const FrameResources = {\r\n SceneColor: 'sceneColor',\r\n SceneColorCopy: 'sceneColorCopy',\r\n LinearDepth: 'linearDepth',\r\n SceneDepthAttachment: 'sceneDepthAttachment',\r\n MotionVector: 'motionVector',\r\n HiZ: 'hiZ',\r\n SSRRoughness: 'ssrRoughness',\r\n SSRNormal: 'ssrNormal',\r\n SSSProfile: 'sssProfile',\r\n SSSParam: 'sssParam',\r\n SSSDiffuse: 'sssDiffuse',\r\n SSSTransmission: 'sssTransmission',\r\n SkinSSS: 'skinSSS',\r\n ShadowMask: 'shadowMask'\r\n} as const;\r\n\r\n/**\r\n * Named registry of render graph resource handles for the current frame.\r\n *\r\n * The blackboard decouples resource producers from consumers: passes that\r\n * create shared resources register the returned handles by name, and later\r\n * passes look them up to declare read dependencies. This replaces passing\r\n * textures through mutable `DrawContext` fields.\r\n *\r\n * A blackboard instance is valid for a single graph build; create a new one\r\n * (or clear it) every frame together with the graph.\r\n *\r\n * @public\r\n */\r\nexport class RGBlackboard {\r\n /** @internal */\r\n private _handles: Map<string, RGHandle> = new Map();\r\n /**\r\n * Register a resource handle under a name, replacing any previous entry.\r\n * @param name - Resource name, typically one of {@link FrameResources}.\r\n * @param handle - The handle to register.\r\n */\r\n set(name: string, handle: RGHandle): void {\r\n this._handles.set(name, handle);\r\n }\r\n /**\r\n * Look up a resource handle by name.\r\n * @param name - Resource name, typically one of {@link FrameResources}.\r\n * @returns The registered handle, or null if not present this frame.\r\n */\r\n get(name: string): Nullable<RGHandle> {\r\n return this._handles.get(name) ?? null;\r\n }\r\n /**\r\n * Check whether a resource is registered.\r\n * @param name - Resource name.\r\n * @returns true if a handle is registered under the name.\r\n */\r\n has(name: string): boolean {\r\n return this._handles.has(name);\r\n }\r\n /**\r\n * Look up a resource handle that must exist.\r\n * @param name - Resource name.\r\n * @returns The registered handle.\r\n */\r\n expect(name: string): RGHandle {\r\n const handle = this._handles.get(name);\r\n if (!handle) {\r\n throw new Error(`RGBlackboard: required frame resource \"${name}\" was not registered`);\r\n }\r\n return handle;\r\n }\r\n /**\r\n * Remove all registered handles.\r\n */\r\n clear(): void {\r\n this._handles.clear();\r\n }\r\n}\r\n"],"names":["FrameResources","SceneColor","SceneColorCopy","LinearDepth","SceneDepthAttachment","MotionVector","HiZ","SSRRoughness","SSRNormal","SSSProfile","SSSParam","SSSDiffuse","SSSTransmission","SkinSSS","ShadowMask","RGBlackboard","_handles","Map","set","name","handle","get","has","expect","Error","clear"],"mappings":"AAGA;;;;;;;;UASaA,cAAiB,GAAA;IAC5BC,UAAY,EAAA,YAAA;IACZC,cAAgB,EAAA,gBAAA;IAChBC,WAAa,EAAA,aAAA;IACbC,oBAAsB,EAAA,sBAAA;IACtBC,YAAc,EAAA,cAAA;IACdC,GAAK,EAAA,KAAA;IACLC,YAAc,EAAA,cAAA;IACdC,SAAW,EAAA,WAAA;IACXC,UAAY,EAAA,YAAA;IACZC,QAAU,EAAA,UAAA;IACVC,UAAY,EAAA,YAAA;IACZC,eAAiB,EAAA,iBAAA;IACjBC,OAAS,EAAA,SAAA;IACTC,UAAY,EAAA;AACd;AAEA;;;;;;;;;;;;AAYC,IACM,MAAMC,YAAAA,CAAAA;AACX,qBACQC,QAAkC,GAAA,IAAIC,GAAM,EAAA;AACpD;;;;AAIC,MACDC,GAAIC,CAAAA,IAAY,EAAEC,MAAgB,EAAQ;AACxC,QAAA,IAAI,CAACJ,QAAQ,CAACE,GAAG,CAACC,IAAMC,EAAAA,MAAAA,CAAAA;AAC1B;AACA;;;;MAKAC,GAAAA,CAAIF,IAAY,EAAsB;AACpC,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACK,GAAG,CAACF,IAAS,CAAA,IAAA,IAAA;AACpC;AACA;;;;MAKAG,GAAAA,CAAIH,IAAY,EAAW;AACzB,QAAA,OAAO,IAAI,CAACH,QAAQ,CAACM,GAAG,CAACH,IAAAA,CAAAA;AAC3B;AACA;;;;MAKAI,MAAAA,CAAOJ,IAAY,EAAY;AAC7B,QAAA,MAAMC,SAAS,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACF,IAAAA,CAAAA;AACjC,QAAA,IAAI,CAACC,MAAQ,EAAA;AACX,YAAA,MAAM,IAAII,KAAM,CAAA,CAAC,uCAAuC,EAAEL,IAAAA,CAAK,oBAAoB,CAAC,CAAA;AACtF;QACA,OAAOC,MAAAA;AACT;AACA;;AAEC,MACDK,KAAc,GAAA;QACZ,IAAI,CAACT,QAAQ,CAACS,KAAK,EAAA;AACrB;AACF;;;;"}
@@ -32,7 +32,16 @@ import { getDevice } from '../../app/api.js';
32
32
  */ allocate(desc, size) {
33
33
  const device = this._device ?? getDevice();
34
34
  const mipmapping = (desc.mipLevels ?? 1) > 1;
35
- const texture = device.pool.fetchTemporalTexture2D(false, desc.format, size.width, size.height, mipmapping);
35
+ const arrayLayers = desc.arrayLayers;
36
+ // A defined arrayLayers (even 1) requests a 2D array texture — a single-layer
37
+ // array is a distinct texture type from a plain 2D texture, and the two are
38
+ // not interchangeable when bound to a tex2DArray sampler. Array textures are
39
+ // fetched as Texture2DArray. The render graph's TTexture channel is nominally
40
+ // Texture2D (see forward_plus_builder's executor annotation); TS types are
41
+ // erased at runtime, every pool op below accepts BaseTexture, so the cast is
42
+ // safe. Passes resolve the real type via getTexture<Texture2DArray>().
43
+ // Individual layers are targeted through RGFramebufferDesc.attachmentLayer.
44
+ const texture = arrayLayers !== undefined ? device.pool.fetchTemporalTexture2DArray(false, desc.format, size.width, size.height, arrayLayers, mipmapping) : device.pool.fetchTemporalTexture2D(false, desc.format, size.width, size.height, mipmapping);
36
45
  if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {
37
46
  device.pool.releaseTexture(texture);
38
47
  throw new Error(`DevicePoolAllocator: texture "${desc.label ?? '<unnamed>'}" requested ${desc.mipLevels} ` + `mip levels, but only ${texture.mipLevelCount} were allocated.`);
@@ -1 +1 @@
1
- {"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, TextureFormat, AbstractDevice } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Bridges the render graph's {@link RGTextureAllocator} interface to the\r\n * engine's device resource pool (`device.pool`).\r\n *\r\n * Transient textures are fetched from the pool on `allocate()` and\r\n * returned to the pool on `release()`, enabling automatic reuse\r\n * across frames without manual lifecycle management.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const allocator = new DevicePoolAllocator();\r\n * const executor = new RenderGraphExecutor(allocator, width, height);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D, FrameBuffer> {\r\n private _device: Nullable<AbstractDevice>;\r\n /**\r\n * Creates a new instance of the DevicePoolAllocator.\r\n * @param device - Optional device instance to use for resource allocation. If not provided, the global device will be used.\r\n */\r\n constructor(device?: AbstractDevice) {\r\n this._device = device ?? null;\r\n }\r\n /**\r\n * Allocate a transient texture from the device pool.\r\n *\r\n * @param desc - Texture descriptor from the render graph pass.\r\n * @param size - Resolved pixel dimensions.\r\n * @returns A pooled Texture2D instance.\r\n */\r\n allocate(desc: RGTextureDesc, size: RGResolvedSize): Texture2D {\r\n const device = this._device ?? getDevice();\r\n const mipmapping = (desc.mipLevels ?? 1) > 1;\r\n const texture = device.pool.fetchTemporalTexture2D(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n mipmapping\r\n );\r\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\r\n device.pool.releaseTexture(texture);\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\r\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\r\n );\r\n }\r\n return texture;\r\n }\r\n\r\n /**\r\n * Release a transient texture back to the device pool.\r\n *\r\n * @param texture - The texture to release.\r\n */\r\n release(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * Retain a pooled texture so it can be owned outside the graph lifetime.\r\n *\r\n * @param texture - The texture to retain.\r\n */\r\n retain(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.retainTexture(texture);\r\n }\r\n\r\n /**\r\n * Allocate a temporary framebuffer from the device pool.\r\n *\r\n * @param desc - Framebuffer descriptor from the render graph pass.\r\n * @returns A pooled FrameBuffer instance.\r\n */\r\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\r\n const device = this._device ?? getDevice();\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments as Texture2D | TextureFormat]\r\n : [];\r\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n desc.width ?? 0,\r\n desc.height ?? 0,\r\n colors,\r\n depthAttachment,\r\n desc.mipmapping ?? false,\r\n desc.sampleCount ?? 1,\r\n desc.ignoreDepthStencil ?? true,\r\n desc.attachmentMipLevel ?? 0,\r\n desc.attachmentCubeface ?? 0,\r\n desc.attachmentLayer ?? 0\r\n );\r\n }\r\n\r\n /**\r\n * Release a temporary framebuffer back to the device pool.\r\n *\r\n * @param framebuffer - The framebuffer to release.\r\n */\r\n releaseFramebuffer(framebuffer: FrameBuffer): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n }\r\n}\r\n"],"names":["DevicePoolAllocator","_device","device","allocate","desc","size","getDevice","mipmapping","mipLevels","texture","pool","fetchTemporalTexture2D","format","width","height","mipLevelCount","releaseTexture","Error","label","release","retain","retainTexture","allocateFramebuffer","colors","Array","isArray","colorAttachments","depthAttachment","fetchTemporalFramebuffer","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","releaseFramebuffer","framebuffer","releaseFrameBuffer"],"mappings":";;AAKA;;;;;;;;;;;;;;;AAeC,IACM,MAAMA,mBAAAA,CAAAA;IACHC,OAAkC;AAC1C;;;MAIA,WAAA,CAAYC,MAAuB,CAAE;QACnC,IAAI,CAACD,OAAO,GAAGC,MAAU,IAAA,IAAA;AAC3B;AACA;;;;;;AAMC,MACDC,QAASC,CAAAA,IAAmB,EAAEC,IAAoB,EAAa;AAC7D,QAAA,MAAMH,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;AAC/B,QAAA,MAAMC,aAAa,CAACH,KAAKI,SAAS,IAAI,CAAA,IAAK,CAAA;AAC3C,QAAA,MAAMC,OAAUP,GAAAA,MAAAA,CAAOQ,IAAI,CAACC,sBAAsB,CAChD,KAAA,EACAP,IAAKQ,CAAAA,MAAM,EACXP,IAAKQ,CAAAA,KAAK,EACVR,IAAAA,CAAKS,MAAM,EACXP,UAAAA,CAAAA;QAEF,IAAIH,IAAAA,CAAKI,SAAS,IAAIC,OAAAA,CAAQM,aAAa,GAAGX,IAAAA,CAAKI,SAAS,EAAE;YAC5DN,MAAOQ,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;YAC3B,MAAM,IAAIQ,KACR,CAAA,CAAC,8BAA8B,EAAEb,KAAKc,KAAK,IAAI,WAAY,CAAA,YAAY,EAAEd,IAAAA,CAAKI,SAAS,CAAC,CAAC,CAAC,GACxF,CAAC,qBAAqB,EAAEC,OAAQM,CAAAA,aAAa,CAAC,gBAAgB,CAAC,CAAA;AAErE;QACA,OAAON,OAAAA;AACT;AAEA;;;;MAKAU,OAAAA,CAAQV,OAAkB,EAAQ;AAChC,QAAA,MAAMP,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAACM,cAAc,CAACP,OAAAA,CAAAA;AAC7B;AAEA;;;;MAKAW,MAAAA,CAAOX,OAAkB,EAAQ;AAC/B,QAAA,MAAMP,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAACW,aAAa,CAACZ,OAAAA,CAAAA;AAC5B;AAEA;;;;;MAMAa,mBAAAA,CAAoBlB,IAAuB,EAAe;AACxD,QAAA,MAAMF,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;AAC/B,QAAA,MAAMiB,MAASC,GAAAA,KAAAA,CAAMC,OAAO,CAACrB,IAAKsB,CAAAA,gBAAgB,CAC7CtB,GAAAA,IAAAA,CAAKsB,gBAAgB,GACtBtB,IAAKsB,CAAAA,gBAAgB,GACnB;AAACtB,YAAAA,IAAAA,CAAKsB;AAA8C,SAAA,GACpD,EAAE;QACR,MAAMC,eAAAA,GAAmBvB,IAAKuB,CAAAA,eAAe,IAAI,IAAA;AACjD,QAAA,OAAOzB,OAAOQ,IAAI,CAACkB,wBAAwB,CACzC,OACAxB,IAAKS,CAAAA,KAAK,IAAI,CAAA,EACdT,KAAKU,MAAM,IAAI,GACfS,MACAI,EAAAA,eAAAA,EACAvB,KAAKG,UAAU,IAAI,KACnBH,EAAAA,IAAAA,CAAKyB,WAAW,IAAI,CAAA,EACpBzB,IAAK0B,CAAAA,kBAAkB,IAAI,IAC3B1B,EAAAA,IAAAA,CAAK2B,kBAAkB,IAAI,GAC3B3B,IAAK4B,CAAAA,kBAAkB,IAAI,CAC3B5B,EAAAA,IAAAA,CAAK6B,eAAe,IAAI,CAAA,CAAA;AAE5B;AAEA;;;;MAKAC,kBAAAA,CAAmBC,WAAwB,EAAQ;AACjD,QAAA,MAAMjC,MAAS,GAAA,IAAI,CAACD,OAAO,IAAIK,SAAAA,EAAAA;QAC/BJ,MAAOQ,CAAAA,IAAI,CAAC0B,kBAAkB,CAACD,WAAAA,CAAAA;AACjC;AACF;;;;"}
1
+ {"version":3,"file":"device_pool_allocator.js","sources":["../../../src/render/rendergraph/device_pool_allocator.ts"],"sourcesContent":["import type { FrameBuffer, Texture2D, TextureFormat, AbstractDevice } from '@zephyr3d/device';\r\nimport type { RGFramebufferDesc, RGTextureAllocator, RGTextureDesc, RGResolvedSize } from './types';\r\nimport { getDevice } from '../../app/api';\r\nimport type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Bridges the render graph's {@link RGTextureAllocator} interface to the\r\n * engine's device resource pool (`device.pool`).\r\n *\r\n * Transient textures are fetched from the pool on `allocate()` and\r\n * returned to the pool on `release()`, enabling automatic reuse\r\n * across frames without manual lifecycle management.\r\n *\r\n * Usage:\r\n * ```ts\r\n * const allocator = new DevicePoolAllocator();\r\n * const executor = new RenderGraphExecutor(allocator, width, height);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class DevicePoolAllocator implements RGTextureAllocator<Texture2D, FrameBuffer> {\r\n private _device: Nullable<AbstractDevice>;\r\n /**\r\n * Creates a new instance of the DevicePoolAllocator.\r\n * @param device - Optional device instance to use for resource allocation. If not provided, the global device will be used.\r\n */\r\n constructor(device?: AbstractDevice) {\r\n this._device = device ?? null;\r\n }\r\n /**\r\n * Allocate a transient texture from the device pool.\r\n *\r\n * @param desc - Texture descriptor from the render graph pass.\r\n * @param size - Resolved pixel dimensions.\r\n * @returns A pooled Texture2D instance.\r\n */\r\n allocate(desc: RGTextureDesc, size: RGResolvedSize): Texture2D {\r\n const device = this._device ?? getDevice();\r\n const mipmapping = (desc.mipLevels ?? 1) > 1;\r\n const arrayLayers = desc.arrayLayers;\r\n // A defined arrayLayers (even 1) requests a 2D array texture — a single-layer\r\n // array is a distinct texture type from a plain 2D texture, and the two are\r\n // not interchangeable when bound to a tex2DArray sampler. Array textures are\r\n // fetched as Texture2DArray. The render graph's TTexture channel is nominally\r\n // Texture2D (see forward_plus_builder's executor annotation); TS types are\r\n // erased at runtime, every pool op below accepts BaseTexture, so the cast is\r\n // safe. Passes resolve the real type via getTexture<Texture2DArray>().\r\n // Individual layers are targeted through RGFramebufferDesc.attachmentLayer.\r\n const texture =\r\n arrayLayers !== undefined\r\n ? (device.pool.fetchTemporalTexture2DArray(\r\n false,\r\n desc.format,\r\n size.width,\r\n size.height,\r\n arrayLayers,\r\n mipmapping\r\n ) as unknown as Texture2D)\r\n : device.pool.fetchTemporalTexture2D(false, desc.format, size.width, size.height, mipmapping);\r\n if (desc.mipLevels && texture.mipLevelCount < desc.mipLevels) {\r\n device.pool.releaseTexture(texture);\r\n throw new Error(\r\n `DevicePoolAllocator: texture \"${desc.label ?? '<unnamed>'}\" requested ${desc.mipLevels} ` +\r\n `mip levels, but only ${texture.mipLevelCount} were allocated.`\r\n );\r\n }\r\n return texture;\r\n }\r\n\r\n /**\r\n * Release a transient texture back to the device pool.\r\n *\r\n * @param texture - The texture to release.\r\n */\r\n release(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseTexture(texture);\r\n }\r\n\r\n /**\r\n * Retain a pooled texture so it can be owned outside the graph lifetime.\r\n *\r\n * @param texture - The texture to retain.\r\n */\r\n retain(texture: Texture2D): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.retainTexture(texture);\r\n }\r\n\r\n /**\r\n * Allocate a temporary framebuffer from the device pool.\r\n *\r\n * @param desc - Framebuffer descriptor from the render graph pass.\r\n * @returns A pooled FrameBuffer instance.\r\n */\r\n allocateFramebuffer(desc: RGFramebufferDesc): FrameBuffer {\r\n const device = this._device ?? getDevice();\r\n const colors = Array.isArray(desc.colorAttachments)\r\n ? (desc.colorAttachments as Array<Texture2D | TextureFormat>)\r\n : desc.colorAttachments\r\n ? [desc.colorAttachments as Texture2D | TextureFormat]\r\n : [];\r\n const depthAttachment = (desc.depthAttachment ?? null) as Texture2D | TextureFormat | null;\r\n return device.pool.fetchTemporalFramebuffer(\r\n false,\r\n desc.width ?? 0,\r\n desc.height ?? 0,\r\n colors,\r\n depthAttachment,\r\n desc.mipmapping ?? false,\r\n desc.sampleCount ?? 1,\r\n desc.ignoreDepthStencil ?? true,\r\n desc.attachmentMipLevel ?? 0,\r\n desc.attachmentCubeface ?? 0,\r\n desc.attachmentLayer ?? 0\r\n );\r\n }\r\n\r\n /**\r\n * Release a temporary framebuffer back to the device pool.\r\n *\r\n * @param framebuffer - The framebuffer to release.\r\n */\r\n releaseFramebuffer(framebuffer: FrameBuffer): void {\r\n const device = this._device ?? getDevice();\r\n device.pool.releaseFrameBuffer(framebuffer);\r\n }\r\n}\r\n"],"names":["DevicePoolAllocator","_device","device","allocate","desc","size","getDevice","mipmapping","mipLevels","arrayLayers","texture","undefined","pool","fetchTemporalTexture2DArray","format","width","height","fetchTemporalTexture2D","mipLevelCount","releaseTexture","Error","label","release","retain","retainTexture","allocateFramebuffer","colors","Array","isArray","colorAttachments","depthAttachment","fetchTemporalFramebuffer","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","releaseFramebuffer","framebuffer","releaseFrameBuffer"],"mappings":"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"}