@zephyr3d/scene 0.9.20 → 0.9.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/camera/camera.js +208 -208
- package/dist/camera/camera.js.map +1 -1
- package/dist/posteffect/sss.js +8 -8
- package/dist/posteffect/sss.js.map +1 -1
- package/dist/render/lightpass.js +5 -1
- package/dist/render/lightpass.js.map +1 -1
- package/dist/render/rendergraph/forward_plus_builder.js +21 -6
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
- package/dist/render/shadow_mask_pass.js +39 -39
- package/dist/render/shadow_mask_pass.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/package.json +1 -1
package/dist/render/lightpass.js
CHANGED
|
@@ -131,7 +131,11 @@ const ADDITIVE_LIGHT_PASS_OMIT_MRT_FLAGS = MaterialVaryingFlags.SSR_STORE_ROUGHN
|
|
|
131
131
|
const needsTransparentSingleColorFramebuffer = !!tmpFramebuffer && tmpFramebuffer.getColorAttachments().length > 1;
|
|
132
132
|
const transparentTmpFramebuffer = needsTransparentSingleColorFramebuffer ? ctx.device.pool.fetchTemporalFramebuffer(false, ctx.device.getDrawingBufferWidth(), ctx.device.getDrawingBufferHeight(), this.getAdditiveLightPassColorAttachments(ctx, additiveTransparentMaterialFlags), ctx.device.getFramebuffer().getDepthAttachment()) : tmpFramebuffer;
|
|
133
133
|
const oit = renderQueue.drawTransparent && camera.oit && camera.oit.supportDevice(ctx.device.type) ? camera.oit : null;
|
|
134
|
-
|
|
134
|
+
// Sort only when this invocation actually draws the transparent queue.
|
|
135
|
+
// The opaque pass (and the SSS-profile pass) run with _renderTransparent
|
|
136
|
+
// === false; without this guard they would sort the transparent lists
|
|
137
|
+
// pointlessly, and the real transparent pass would then sort them again.
|
|
138
|
+
if (!oit && renderQueue.drawTransparent && this._renderTransparent) {
|
|
135
139
|
renderQueue.sortTransparentItems(camera.getWorldPosition());
|
|
136
140
|
}
|
|
137
141
|
const flags = {
|
|
@@ -1 +1 @@
|
|
|
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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"}
|
|
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 // Sort only when this invocation actually draws the transparent queue.\r\n // The opaque pass (and the SSS-profile pass) run with _renderTransparent\r\n // === false; without this guard they would sort the transparent lists\r\n // pointlessly, and the real transparent pass would then sort them again.\r\n if (!oit && renderQueue.drawTransparent && this._renderTransparent) {\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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"}
|
|
@@ -407,7 +407,14 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
|
|
|
407
407
|
const numShadowLights = renderQueue.shadowedLights.length;
|
|
408
408
|
const numLayers = ShadowMaskRenderer.getLayerCount(numShadowLights);
|
|
409
409
|
const maskPassResult = graph.addPass('ShadowMaskPass', (builder)=>{
|
|
410
|
-
|
|
410
|
+
// Freeze the current linear-depth handle at build time. `depthHandle` is a
|
|
411
|
+
// mutable `let` that a later TransmissionDepth pass reassigns to a new
|
|
412
|
+
// version ('linearDepth@TransmissionDepth'); if the execute closure below
|
|
413
|
+
// captured it by reference it would read a handle this pass never declared,
|
|
414
|
+
// tripping RenderGraphExecutor's access assertion. The shadow mask is built
|
|
415
|
+
// from the opaque prepass depth, so the pre-transmission version is correct.
|
|
416
|
+
const maskDepthHandle = depthHandle;
|
|
417
|
+
builder.read(maskDepthHandle);
|
|
411
418
|
builder.read(depthPassResult.depthFramebufferHandle);
|
|
412
419
|
// createTexture already registers this pass as the resource producer, so
|
|
413
420
|
// downstream passes read this handle directly (same pattern as HiZ). The
|
|
@@ -420,7 +427,7 @@ function buildForwardPlusGraphInternal(graph, ctx, renderQueue, options) {
|
|
|
420
427
|
arrayLayers: numLayers
|
|
421
428
|
});
|
|
422
429
|
builder.setExecute((rgCtx)=>{
|
|
423
|
-
const depthTex = rgCtx.getTexture(
|
|
430
|
+
const depthTex = rgCtx.getTexture(maskDepthHandle);
|
|
424
431
|
const maskTex = rgCtx.getTexture(maskHandle);
|
|
425
432
|
_shadowMaskRenderer.render(ctx, depthTex, renderQueue.shadowedLights, (layer)=>rgCtx.createFramebuffer({
|
|
426
433
|
width: maskTex.width,
|
|
@@ -1376,8 +1383,12 @@ function blitToCurrentColorAttachment(ctx, source) {
|
|
|
1376
1383
|
_scenePass.renderOpaque = true;
|
|
1377
1384
|
_scenePass.renderTransparent = false;
|
|
1378
1385
|
_scenePass.render(ctx, null, null, renderQueue);
|
|
1379
|
-
_scenePass.renderTransparent = true;
|
|
1380
1386
|
} finally{
|
|
1387
|
+
// Restore the shared _scenePass flags so no state leaks to the next pass:
|
|
1388
|
+
// the transparent pass sets transmission/renderOpaque/renderTransparent
|
|
1389
|
+
// itself rather than inheriting whatever this pass happened to leave.
|
|
1390
|
+
_scenePass.renderTransparent = true;
|
|
1391
|
+
_scenePass.transmission = false;
|
|
1381
1392
|
ctx.device.popDeviceStates();
|
|
1382
1393
|
}
|
|
1383
1394
|
}
|
|
@@ -1420,9 +1431,13 @@ function blitToCurrentColorAttachment(ctx, source) {
|
|
|
1420
1431
|
device.setFramebuffer(framebuffer);
|
|
1421
1432
|
device.setViewport(null);
|
|
1422
1433
|
device.setScissor(null);
|
|
1423
|
-
//
|
|
1424
|
-
//
|
|
1425
|
-
//
|
|
1434
|
+
// Derive transmission mode from the same single source of truth the opaque
|
|
1435
|
+
// pass used (renderQueue.needSceneColor()) instead of inheriting leftover
|
|
1436
|
+
// _scenePass state. When scene color is needed the opaque pass seeded the
|
|
1437
|
+
// refraction background and drew the transmission-opaque list, so here we
|
|
1438
|
+
// draw transmission_trans + transparent; otherwise just the transparent
|
|
1439
|
+
// list. Never clear: the opaque result is already in the target.
|
|
1440
|
+
_scenePass.transmission = renderQueue.needSceneColor();
|
|
1426
1441
|
_scenePass.clearColor = null;
|
|
1427
1442
|
_scenePass.clearDepth = null;
|
|
1428
1443
|
_scenePass.clearStencil = null;
|