475bd00faea67cfdc8afa3f228aad40503caf8fe97bd155d38b5b088d1758406.json 68 KB

1
  1. {"ast":null,"code":"import _asyncToGenerator from \"F:/workspace/202226701027/huinongbao-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\";\n/**\n * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b\n */\n\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget.js\";\nimport { Color4 } from \"../Maths/math.color.js\";\nimport { SmartArray } from \"../Misc/smartArray.js\";\nimport { ThinTexture } from \"../Materials/Textures/thinTexture.js\";\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer.js\";\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.js\";\nimport { Logger } from \"../Misc/logger.js\";\nimport { Material } from \"../Materials/material.js\";\nimport \"../Engines/Extensions/engine.multiRender.js\";\nclass DepthPeelingEffectConfiguration {\n constructor() {\n /**\n * Is this effect enabled\n */\n this.enabled = true;\n /**\n * Name of the configuration\n */\n this.name = \"depthPeeling\";\n /**\n * Textures that should be present in the MRT for this effect to work\n */\n this.texturesRequired = [4];\n }\n}\n/**\n * The depth peeling renderer that performs\n * Order independant transparency (OIT).\n * This should not be instanciated directly, as it is part of a scene component\n */\nexport class DepthPeelingRenderer {\n /**\n * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.\n */\n get passCount() {\n return this._passCount;\n }\n set passCount(count) {\n if (this._passCount === count) {\n return;\n }\n this._passCount = count;\n this._createRenderPassIds();\n }\n /**\n * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.\n */\n get useRenderPasses() {\n return this._useRenderPasses;\n }\n set useRenderPasses(usePasses) {\n if (this._useRenderPasses === usePasses) {\n return;\n }\n this._useRenderPasses = usePasses;\n this._createRenderPassIds();\n }\n /**\n * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer\n * @param mesh The mesh to exclude from the depth peeling renderer\n */\n addExcludedMesh(mesh) {\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\n this._excludedMeshes.push(mesh.uniqueId);\n }\n }\n /**\n * Remove a mesh from the exclusion list of the depth peeling renderer\n * @param mesh The mesh to remove\n */\n removeExcludedMesh(mesh) {\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\n if (index !== -1) {\n this._excludedMeshes.splice(index, 1);\n }\n }\n /**\n * Gets the shader language used in this renderer\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Instanciates the depth peeling renderer\n * @param scene Scene to attach to\n * @param passCount Number of depth layers to peel\n * @returns The depth peeling renderer\n */\n constructor(scene, passCount = 5) {\n this._thinTextures = [];\n this._currentPingPongState = 0;\n this._layoutCacheFormat = [[true], [true, true], [true, true, true]];\n this._layoutCache = [];\n this._candidateSubMeshes = new SmartArray(10);\n this._excludedSubMeshes = new SmartArray(10);\n this._excludedMeshes = [];\n this._colorCache = [new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0), new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0), new Color4(0, 0, 0, 0)];\n /** Shader language used by the renderer */\n this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;\n this._scene = scene;\n this._engine = scene.getEngine();\n this._passCount = passCount;\n // We need a depth texture for opaque\n if (!scene.enablePrePassRenderer()) {\n Logger.Warn(\"Depth peeling for order independant transparency could not enable PrePass, aborting.\");\n return;\n }\n for (let i = 0; i < this._layoutCacheFormat.length; ++i) {\n this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);\n }\n this._renderPassIds = [];\n this.useRenderPasses = false;\n if (this._engine.isWebGPU) {\n this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n }\n this._prePassEffectConfiguration = new DepthPeelingEffectConfiguration();\n this._createTextures();\n this._createEffects();\n }\n _createRenderPassIds() {\n this._releaseRenderPassIds();\n if (this._useRenderPasses) {\n for (let i = 0; i < this._passCount + 1; ++i) {\n if (!this._renderPassIds[i]) {\n this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);\n }\n }\n }\n }\n _releaseRenderPassIds() {\n for (let i = 0; i < this._renderPassIds.length; ++i) {\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\n }\n this._renderPassIds = [];\n }\n _createTextures() {\n const size = {\n width: this._engine.getRenderWidth(),\n height: this._engine.getRenderHeight()\n };\n // 2 for ping pong\n this._depthMrts = [new MultiRenderTarget(\"depthPeelingDepth0MRT\", size, 3, this._scene, undefined, [\"depthPeelingDepth0MRT_depth\", \"depthPeelingDepth0MRT_frontColor\", \"depthPeelingDepth0MRT_backColor\"]), new MultiRenderTarget(\"depthPeelingDepth1MRT\", size, 3, this._scene, undefined, [\"depthPeelingDepth1MRT_depth\", \"depthPeelingDepth1MRT_frontColor\", \"depthPeelingDepth1MRT_backColor\"])];\n this._colorMrts = [new MultiRenderTarget(\"depthPeelingColor0MRT\", size, 2, this._scene, {\n generateDepthBuffer: false\n }, [\"depthPeelingColor0MRT_frontColor\", \"depthPeelingColor0MRT_backColor\"]), new MultiRenderTarget(\"depthPeelingColor1MRT\", size, 2, this._scene, {\n generateDepthBuffer: false\n }, [\"depthPeelingColor1MRT_frontColor\", \"depthPeelingColor1MRT_backColor\"])];\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBackMRT\", size, 1, this._scene, {\n generateDepthBuffer: false\n }, [\"depthPeelingBackMRT_blendBack\"]);\n this._outputRT = new RenderTargetTexture(\"depthPeelingOutputRTT\", size, this._scene, false);\n // 0 is a depth texture\n // 1 is a color texture\n const optionsArray = [{\n format: 7,\n // For MSAA we need RGBA\n samplingMode: 1,\n type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,\n label: \"DepthPeelingRenderer-DepthTexture\"\n }, {\n format: 5,\n samplingMode: 1,\n type: 2,\n // For MSAA we need FLOAT\n label: \"DepthPeelingRenderer-ColorTexture\"\n }];\n for (let i = 0; i < 2; i++) {\n const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);\n const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\n const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\n this._depthMrts[i].setInternalTexture(depthTexture, 0);\n this._depthMrts[i].setInternalTexture(frontColorTexture, 1);\n this._depthMrts[i].setInternalTexture(backColorTexture, 2);\n this._colorMrts[i].setInternalTexture(frontColorTexture, 0);\n this._colorMrts[i].setInternalTexture(backColorTexture, 1);\n this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));\n }\n }\n // TODO : explore again MSAA with depth peeling when\n // we are able to fetch individual samples in a multisampled renderbuffer\n // public set samples(value: number) {\n // for (let i = 0; i < 2; i++) {\n // this._depthMrts[i].samples = value;\n // this._colorMrts[i].samples = value;\n // }\n // this._scene.prePassRenderer!.samples = value;\n // }\n _disposeTextures() {\n for (let i = 0; i < this._thinTextures.length; i++) {\n if (i === 6) {\n // Do not dispose the shared texture with the prepass\n continue;\n }\n this._thinTextures[i].dispose();\n }\n for (let i = 0; i < 2; i++) {\n this._depthMrts[i].dispose(true);\n this._colorMrts[i].dispose(true);\n this._blendBackMrt.dispose(true);\n }\n this._outputRT.dispose();\n this._thinTextures = [];\n this._colorMrts = [];\n this._depthMrts = [];\n }\n _updateTextures() {\n if (this._depthMrts[0].getSize().width !== this._engine.getRenderWidth() || this._depthMrts[0].getSize().height !== this._engine.getRenderHeight()) {\n this._disposeTextures();\n this._createTextures();\n }\n return this._updateTextureReferences();\n }\n _updateTextureReferences() {\n var _prePassRenderer$defa;\n const prePassRenderer = this._scene.prePassRenderer;\n if (!prePassRenderer) {\n return false;\n }\n // Retrieve opaque color texture\n const textureIndex = prePassRenderer.getIndex(4);\n const prePassTexture = (_prePassRenderer$defa = prePassRenderer.defaultRT.textures) !== null && _prePassRenderer$defa !== void 0 && _prePassRenderer$defa.length ? prePassRenderer.defaultRT.textures[textureIndex].getInternalTexture() : null;\n if (!prePassTexture) {\n return false;\n }\n if (this._blendBackTexture !== prePassTexture) {\n this._blendBackTexture = prePassTexture;\n this._blendBackMrt.setInternalTexture(this._blendBackTexture, 0);\n if (this._thinTextures[6]) {\n this._thinTextures[6].dispose();\n }\n this._thinTextures[6] = new ThinTexture(this._blendBackTexture);\n prePassRenderer.defaultRT.renderTarget.shareDepth(this._depthMrts[0].renderTarget);\n }\n return true;\n }\n _createEffects() {\n var _this = this;\n this._blendBackEffectWrapper = new EffectWrapper({\n fragmentShader: \"oitBackBlend\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: function () {\n var _ref = _asyncToGenerator(function* () {\n if (_this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n yield import(\"../ShadersWGSL/oitBackBlend.fragment.js\");\n } else {\n yield import(\"../Shaders/oitBackBlend.fragment.js\");\n }\n });\n return function extraInitializationsAsync() {\n return _ref.apply(this, arguments);\n };\n }()\n });\n this._blendBackEffectWrapperPingPong = new EffectWrapper({\n fragmentShader: \"oitBackBlend\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: function () {\n var _ref2 = _asyncToGenerator(function* () {\n if (_this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n yield import(\"../ShadersWGSL/oitBackBlend.fragment.js\");\n } else {\n yield import(\"../Shaders/oitBackBlend.fragment.js\");\n }\n });\n return function extraInitializationsAsync() {\n return _ref2.apply(this, arguments);\n };\n }()\n });\n this._finalEffectWrapper = new EffectWrapper({\n fragmentShader: \"oitFinal\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uFrontColor\", \"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: function () {\n var _ref3 = _asyncToGenerator(function* () {\n if (_this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n yield import(\"../ShadersWGSL/oitFinal.fragment.js\");\n } else {\n yield import(\"../Shaders/oitFinal.fragment.js\");\n }\n });\n return function extraInitializationsAsync() {\n return _ref3.apply(this, arguments);\n };\n }()\n });\n this._effectRenderer = new EffectRenderer(this._engine);\n }\n /**\n * Links to the prepass renderer\n * @param prePassRenderer The scene PrePassRenderer\n */\n setPrePassRenderer(prePassRenderer) {\n prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\n }\n /**\n * Binds depth peeling textures on an effect\n * @param effect The effect to bind textures on\n */\n bind(effect) {\n effect.setTexture(\"oitDepthSampler\", this._thinTextures[this._currentPingPongState * 3]);\n effect.setTexture(\"oitFrontColorSampler\", this._thinTextures[this._currentPingPongState * 3 + 1]);\n }\n _renderSubMeshes(transparentSubMeshes) {\n let mapMaterialContext;\n if (this._useRenderPasses) {\n mapMaterialContext = {};\n }\n for (let j = 0; j < transparentSubMeshes.length; j++) {\n const material = transparentSubMeshes.data[j].getMaterial();\n let previousShaderHotSwapping = true;\n let previousBFC = false;\n const subMesh = transparentSubMeshes.data[j];\n let drawWrapper;\n let firstDraw = false;\n if (this._useRenderPasses) {\n drawWrapper = subMesh._getDrawWrapper();\n firstDraw = !drawWrapper;\n }\n if (material) {\n previousShaderHotSwapping = material.allowShaderHotSwapping;\n previousBFC = material.backFaceCulling;\n material.allowShaderHotSwapping = false;\n material.backFaceCulling = false;\n }\n subMesh.render(false);\n if (firstDraw) {\n // first time we draw this submesh: we replace the material context\n drawWrapper = subMesh._getDrawWrapper(); // we are sure it is now non empty as we just rendered the submesh\n if (drawWrapper.materialContext) {\n let newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId];\n if (!newMaterialContext) {\n newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();\n }\n subMesh._getDrawWrapper().materialContext = newMaterialContext;\n }\n }\n if (material) {\n material.allowShaderHotSwapping = previousShaderHotSwapping;\n material.backFaceCulling = previousBFC;\n }\n }\n }\n _finalCompose(writeId) {\n var _this$_scene$prePassR;\n const output = (_this$_scene$prePassR = this._scene.prePassRenderer) === null || _this$_scene$prePassR === void 0 ? void 0 : _this$_scene$prePassR.setCustomOutput(this._outputRT);\n if (output) {\n this._engine.bindFramebuffer(this._outputRT.renderTarget);\n } else {\n this._engine.restoreDefaultFramebuffer();\n }\n this._engine.setAlphaMode(0);\n this._engine.applyStates();\n this._engine.enableEffect(this._finalEffectWrapper.drawWrapper);\n this._finalEffectWrapper.effect.setTexture(\"uFrontColor\", this._thinTextures[writeId * 3 + 1]);\n this._finalEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[6]);\n this._effectRenderer.render(this._finalEffectWrapper);\n }\n /**\n * Checks if the depth peeling renderer is ready to render transparent meshes\n * @returns true if the depth peeling renderer is ready to render the transparent meshes\n */\n isReady() {\n return this._blendBackEffectWrapper.effect.isReady() && this._blendBackEffectWrapperPingPong.effect.isReady() && this._finalEffectWrapper.effect.isReady() && this._updateTextures();\n }\n /**\n * Renders transparent submeshes with depth peeling\n * @param transparentSubMeshes List of transparent meshes to render\n * @returns The array of submeshes that could not be handled by this renderer\n */\n render(transparentSubMeshes) {\n this._candidateSubMeshes.length = 0;\n this._excludedSubMeshes.length = 0;\n if (!this.isReady()) {\n return this._excludedSubMeshes;\n }\n if (this._scene.activeCamera) {\n this._engine.setViewport(this._scene.activeCamera.viewport);\n }\n for (let i = 0; i < transparentSubMeshes.length; i++) {\n const subMesh = transparentSubMeshes.data[i];\n const material = subMesh.getMaterial();\n const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);\n if (material && (fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) && this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1) {\n this._candidateSubMeshes.push(subMesh);\n } else {\n this._excludedSubMeshes.push(subMesh);\n }\n }\n if (!this._candidateSubMeshes.length) {\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget);\n this._finalCompose(1);\n return this._excludedSubMeshes;\n }\n const currentRenderPassId = this._engine.currentRenderPassId;\n this._scene.prePassRenderer._enabled = false;\n if (this._useRenderPasses) {\n this._engine.currentRenderPassId = this._renderPassIds[0];\n }\n // Clears\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[0], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindFramebuffer(this._depthMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[1], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget);\n // Draw depth for first pass\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.setAlphaMode(11); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error\n this._engine.setAlphaEquation(3);\n this._engine.depthCullingState.depthMask = false;\n this._engine.depthCullingState.depthTest = true;\n this._engine.applyStates();\n this._currentPingPongState = 1;\n // Render\n this._renderSubMeshes(this._candidateSubMeshes);\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);\n this._scene.resetCachedMaterial();\n // depth peeling ping-pong\n let readId = 0;\n let writeId = 0;\n for (let i = 0; i < this._passCount; i++) {\n readId = i % 2;\n writeId = 1 - readId;\n this._currentPingPongState = readId;\n if (this._useRenderPasses) {\n this._engine.currentRenderPassId = this._renderPassIds[i + 1];\n }\n if (this._scene.activeCamera) {\n this._engine.setViewport(this._scene.activeCamera.viewport);\n }\n // Clears\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[0], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget);\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[2]);\n this._engine.setAlphaMode(11); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error\n this._engine.setAlphaEquation(3);\n this._engine.depthCullingState.depthTest = false;\n this._engine.applyStates();\n // Render\n this._renderSubMeshes(this._candidateSubMeshes);\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._scene.resetCachedMaterial();\n // Back color\n this._engine.bindFramebuffer(this._blendBackMrt.renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.setAlphaEquation(0);\n this._engine.setAlphaMode(17);\n this._engine.applyStates();\n const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;\n this._engine.enableEffect(blendBackEffectWrapper.drawWrapper);\n blendBackEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[writeId * 3 + 2]);\n this._effectRenderer.render(blendBackEffectWrapper);\n this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget);\n }\n this._engine.currentRenderPassId = currentRenderPassId;\n // Final composition on default FB\n this._finalCompose(writeId);\n this._scene.prePassRenderer._enabled = true;\n this._engine.depthCullingState.depthMask = true;\n this._engine.depthCullingState.depthTest = true;\n return this._excludedSubMeshes;\n }\n /**\n * Disposes the depth peeling renderer and associated ressources\n */\n dispose() {\n this._disposeTextures();\n this._blendBackEffectWrapper.dispose();\n this._finalEffectWrapper.dispose();\n this._effectRenderer.dispose();\n this._releaseRenderPassIds();\n }\n}\nDepthPeelingRenderer._DEPTH_CLEAR_VALUE = -99999.0;\nDepthPeelingRenderer._MIN_DEPTH = 0;\nDepthPeelingRenderer._MAX_DEPTH = 1;","map":{"version":3,"names":["MultiRenderTarget","Color4","SmartArray","ThinTexture","EffectRenderer","EffectWrapper","RenderTargetTexture","Logger","Material","DepthPeelingEffectConfiguration","constructor","enabled","name","texturesRequired","DepthPeelingRenderer","passCount","_passCount","count","_createRenderPassIds","useRenderPasses","_useRenderPasses","usePasses","addExcludedMesh","mesh","_excludedMeshes","indexOf","uniqueId","push","removeExcludedMesh","index","splice","shaderLanguage","_shaderLanguage","scene","_thinTextures","_currentPingPongState","_layoutCacheFormat","_layoutCache","_candidateSubMeshes","_excludedSubMeshes","_colorCache","_DEPTH_CLEAR_VALUE","_MIN_DEPTH","_MAX_DEPTH","_scene","_engine","getEngine","enablePrePassRenderer","Warn","i","length","buildTextureLayout","_renderPassIds","isWebGPU","_prePassEffectConfiguration","_createTextures","_createEffects","_releaseRenderPassIds","createRenderPassId","releaseRenderPassId","size","width","getRenderWidth","height","getRenderHeight","_depthMrts","undefined","_colorMrts","generateDepthBuffer","_blendBackMrt","_outputRT","optionsArray","format","samplingMode","type","getCaps","textureFloatLinearFiltering","label","depthTexture","_createInternalTexture","frontColorTexture","backColorTexture","setInternalTexture","_disposeTextures","dispose","_updateTextures","getSize","_updateTextureReferences","_prePassRenderer$defa","prePassRenderer","textureIndex","getIndex","prePassTexture","defaultRT","textures","getInternalTexture","_blendBackTexture","renderTarget","shareDepth","_this","_blendBackEffectWrapper","fragmentShader","useShaderStore","engine","samplerNames","uniformNames","extraInitializationsAsync","_ref","_asyncToGenerator","apply","arguments","_blendBackEffectWrapperPingPong","_ref2","_finalEffectWrapper","_ref3","_effectRenderer","setPrePassRenderer","addEffectConfiguration","bind","effect","setTexture","_renderSubMeshes","transparentSubMeshes","mapMaterialContext","j","material","data","getMaterial","previousShaderHotSwapping","previousBFC","subMesh","drawWrapper","firstDraw","_getDrawWrapper","allowShaderHotSwapping","backFaceCulling","render","materialContext","newMaterialContext","createMaterialContext","_finalCompose","writeId","_this$_scene$prePassR","output","setCustomOutput","bindFramebuffer","restoreDefaultFramebuffer","setAlphaMode","applyStates","enableEffect","isReady","activeCamera","setViewport","viewport","fillMode","getRenderingMesh","_getRenderingFillMode","TriangleFanDrawMode","TriangleFillMode","TriangleStripDrawMode","getMesh","bindAttachments","clear","unBindFramebuffer","currentRenderPassId","_enabled","setAlphaEquation","depthCullingState","depthMask","depthTest","resetCachedMaterial","readId","blendBackEffectWrapper"],"sources":["F:/workspace/202226701027/huinongbao-app/node_modules/@babylonjs/core/Rendering/depthPeelingRenderer.js"],"sourcesContent":["/**\n * Implementation based on https://medium.com/@shrekshao_71662/dual-depth-peeling-implementation-in-webgl-11baa061ba4b\n */\n\nimport { MultiRenderTarget } from \"../Materials/Textures/multiRenderTarget.js\";\nimport { Color4 } from \"../Maths/math.color.js\";\nimport { SmartArray } from \"../Misc/smartArray.js\";\nimport { ThinTexture } from \"../Materials/Textures/thinTexture.js\";\nimport { EffectRenderer, EffectWrapper } from \"../Materials/effectRenderer.js\";\nimport { RenderTargetTexture } from \"../Materials/Textures/renderTargetTexture.js\";\nimport { Logger } from \"../Misc/logger.js\";\nimport { Material } from \"../Materials/material.js\";\nimport \"../Engines/Extensions/engine.multiRender.js\";\nclass DepthPeelingEffectConfiguration {\n constructor() {\n /**\n * Is this effect enabled\n */\n this.enabled = true;\n /**\n * Name of the configuration\n */\n this.name = \"depthPeeling\";\n /**\n * Textures that should be present in the MRT for this effect to work\n */\n this.texturesRequired = [4];\n }\n}\n/**\n * The depth peeling renderer that performs\n * Order independant transparency (OIT).\n * This should not be instanciated directly, as it is part of a scene component\n */\nexport class DepthPeelingRenderer {\n /**\n * Number of depth peeling passes. As we are using dual depth peeling, each pass two levels of transparency are processed.\n */\n get passCount() {\n return this._passCount;\n }\n set passCount(count) {\n if (this._passCount === count) {\n return;\n }\n this._passCount = count;\n this._createRenderPassIds();\n }\n /**\n * Instructs the renderer to use render passes. It is an optimization that makes the rendering faster for some engines (like WebGPU) but that consumes more memory, so it is disabled by default.\n */\n get useRenderPasses() {\n return this._useRenderPasses;\n }\n set useRenderPasses(usePasses) {\n if (this._useRenderPasses === usePasses) {\n return;\n }\n this._useRenderPasses = usePasses;\n this._createRenderPassIds();\n }\n /**\n * Add a mesh in the exclusion list to prevent it to be handled by the depth peeling renderer\n * @param mesh The mesh to exclude from the depth peeling renderer\n */\n addExcludedMesh(mesh) {\n if (this._excludedMeshes.indexOf(mesh.uniqueId) === -1) {\n this._excludedMeshes.push(mesh.uniqueId);\n }\n }\n /**\n * Remove a mesh from the exclusion list of the depth peeling renderer\n * @param mesh The mesh to remove\n */\n removeExcludedMesh(mesh) {\n const index = this._excludedMeshes.indexOf(mesh.uniqueId);\n if (index !== -1) {\n this._excludedMeshes.splice(index, 1);\n }\n }\n /**\n * Gets the shader language used in this renderer\n */\n get shaderLanguage() {\n return this._shaderLanguage;\n }\n /**\n * Instanciates the depth peeling renderer\n * @param scene Scene to attach to\n * @param passCount Number of depth layers to peel\n * @returns The depth peeling renderer\n */\n constructor(scene, passCount = 5) {\n this._thinTextures = [];\n this._currentPingPongState = 0;\n this._layoutCacheFormat = [[true], [true, true], [true, true, true]];\n this._layoutCache = [];\n this._candidateSubMeshes = new SmartArray(10);\n this._excludedSubMeshes = new SmartArray(10);\n this._excludedMeshes = [];\n this._colorCache = [\n new Color4(DepthPeelingRenderer._DEPTH_CLEAR_VALUE, DepthPeelingRenderer._DEPTH_CLEAR_VALUE, 0, 0),\n new Color4(-DepthPeelingRenderer._MIN_DEPTH, DepthPeelingRenderer._MAX_DEPTH, 0, 0),\n new Color4(0, 0, 0, 0),\n ];\n /** Shader language used by the renderer */\n this._shaderLanguage = 0 /* ShaderLanguage.GLSL */;\n this._scene = scene;\n this._engine = scene.getEngine();\n this._passCount = passCount;\n // We need a depth texture for opaque\n if (!scene.enablePrePassRenderer()) {\n Logger.Warn(\"Depth peeling for order independant transparency could not enable PrePass, aborting.\");\n return;\n }\n for (let i = 0; i < this._layoutCacheFormat.length; ++i) {\n this._layoutCache[i] = this._engine.buildTextureLayout(this._layoutCacheFormat[i]);\n }\n this._renderPassIds = [];\n this.useRenderPasses = false;\n if (this._engine.isWebGPU) {\n this._shaderLanguage = 1 /* ShaderLanguage.WGSL */;\n }\n this._prePassEffectConfiguration = new DepthPeelingEffectConfiguration();\n this._createTextures();\n this._createEffects();\n }\n _createRenderPassIds() {\n this._releaseRenderPassIds();\n if (this._useRenderPasses) {\n for (let i = 0; i < this._passCount + 1; ++i) {\n if (!this._renderPassIds[i]) {\n this._renderPassIds[i] = this._engine.createRenderPassId(`DepthPeelingRenderer - pass #${i}`);\n }\n }\n }\n }\n _releaseRenderPassIds() {\n for (let i = 0; i < this._renderPassIds.length; ++i) {\n this._engine.releaseRenderPassId(this._renderPassIds[i]);\n }\n this._renderPassIds = [];\n }\n _createTextures() {\n const size = {\n width: this._engine.getRenderWidth(),\n height: this._engine.getRenderHeight(),\n };\n // 2 for ping pong\n this._depthMrts = [\n new MultiRenderTarget(\"depthPeelingDepth0MRT\", size, 3, this._scene, undefined, [\n \"depthPeelingDepth0MRT_depth\",\n \"depthPeelingDepth0MRT_frontColor\",\n \"depthPeelingDepth0MRT_backColor\",\n ]),\n new MultiRenderTarget(\"depthPeelingDepth1MRT\", size, 3, this._scene, undefined, [\n \"depthPeelingDepth1MRT_depth\",\n \"depthPeelingDepth1MRT_frontColor\",\n \"depthPeelingDepth1MRT_backColor\",\n ]),\n ];\n this._colorMrts = [\n new MultiRenderTarget(\"depthPeelingColor0MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\n \"depthPeelingColor0MRT_frontColor\",\n \"depthPeelingColor0MRT_backColor\",\n ]),\n new MultiRenderTarget(\"depthPeelingColor1MRT\", size, 2, this._scene, { generateDepthBuffer: false }, [\n \"depthPeelingColor1MRT_frontColor\",\n \"depthPeelingColor1MRT_backColor\",\n ]),\n ];\n this._blendBackMrt = new MultiRenderTarget(\"depthPeelingBackMRT\", size, 1, this._scene, { generateDepthBuffer: false }, [\"depthPeelingBackMRT_blendBack\"]);\n this._outputRT = new RenderTargetTexture(\"depthPeelingOutputRTT\", size, this._scene, false);\n // 0 is a depth texture\n // 1 is a color texture\n const optionsArray = [\n {\n format: 7, // For MSAA we need RGBA\n samplingMode: 1,\n type: this._engine.getCaps().textureFloatLinearFiltering ? 1 : 2,\n label: \"DepthPeelingRenderer-DepthTexture\",\n },\n {\n format: 5,\n samplingMode: 1,\n type: 2, // For MSAA we need FLOAT\n label: \"DepthPeelingRenderer-ColorTexture\",\n },\n ];\n for (let i = 0; i < 2; i++) {\n const depthTexture = this._engine._createInternalTexture(size, optionsArray[0], false);\n const frontColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\n const backColorTexture = this._engine._createInternalTexture(size, optionsArray[1], false);\n this._depthMrts[i].setInternalTexture(depthTexture, 0);\n this._depthMrts[i].setInternalTexture(frontColorTexture, 1);\n this._depthMrts[i].setInternalTexture(backColorTexture, 2);\n this._colorMrts[i].setInternalTexture(frontColorTexture, 0);\n this._colorMrts[i].setInternalTexture(backColorTexture, 1);\n this._thinTextures.push(new ThinTexture(depthTexture), new ThinTexture(frontColorTexture), new ThinTexture(backColorTexture));\n }\n }\n // TODO : explore again MSAA with depth peeling when\n // we are able to fetch individual samples in a multisampled renderbuffer\n // public set samples(value: number) {\n // for (let i = 0; i < 2; i++) {\n // this._depthMrts[i].samples = value;\n // this._colorMrts[i].samples = value;\n // }\n // this._scene.prePassRenderer!.samples = value;\n // }\n _disposeTextures() {\n for (let i = 0; i < this._thinTextures.length; i++) {\n if (i === 6) {\n // Do not dispose the shared texture with the prepass\n continue;\n }\n this._thinTextures[i].dispose();\n }\n for (let i = 0; i < 2; i++) {\n this._depthMrts[i].dispose(true);\n this._colorMrts[i].dispose(true);\n this._blendBackMrt.dispose(true);\n }\n this._outputRT.dispose();\n this._thinTextures = [];\n this._colorMrts = [];\n this._depthMrts = [];\n }\n _updateTextures() {\n if (this._depthMrts[0].getSize().width !== this._engine.getRenderWidth() || this._depthMrts[0].getSize().height !== this._engine.getRenderHeight()) {\n this._disposeTextures();\n this._createTextures();\n }\n return this._updateTextureReferences();\n }\n _updateTextureReferences() {\n const prePassRenderer = this._scene.prePassRenderer;\n if (!prePassRenderer) {\n return false;\n }\n // Retrieve opaque color texture\n const textureIndex = prePassRenderer.getIndex(4);\n const prePassTexture = prePassRenderer.defaultRT.textures?.length ? prePassRenderer.defaultRT.textures[textureIndex].getInternalTexture() : null;\n if (!prePassTexture) {\n return false;\n }\n if (this._blendBackTexture !== prePassTexture) {\n this._blendBackTexture = prePassTexture;\n this._blendBackMrt.setInternalTexture(this._blendBackTexture, 0);\n if (this._thinTextures[6]) {\n this._thinTextures[6].dispose();\n }\n this._thinTextures[6] = new ThinTexture(this._blendBackTexture);\n prePassRenderer.defaultRT.renderTarget.shareDepth(this._depthMrts[0].renderTarget);\n }\n return true;\n }\n _createEffects() {\n this._blendBackEffectWrapper = new EffectWrapper({\n fragmentShader: \"oitBackBlend\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: async () => {\n if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n await import(\"../ShadersWGSL/oitBackBlend.fragment.js\");\n }\n else {\n await import(\"../Shaders/oitBackBlend.fragment.js\");\n }\n },\n });\n this._blendBackEffectWrapperPingPong = new EffectWrapper({\n fragmentShader: \"oitBackBlend\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: async () => {\n if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n await import(\"../ShadersWGSL/oitBackBlend.fragment.js\");\n }\n else {\n await import(\"../Shaders/oitBackBlend.fragment.js\");\n }\n },\n });\n this._finalEffectWrapper = new EffectWrapper({\n fragmentShader: \"oitFinal\",\n useShaderStore: true,\n engine: this._engine,\n samplerNames: [\"uFrontColor\", \"uBackColor\"],\n uniformNames: [],\n shaderLanguage: this._shaderLanguage,\n extraInitializationsAsync: async () => {\n if (this._shaderLanguage === 1 /* ShaderLanguage.WGSL */) {\n await import(\"../ShadersWGSL/oitFinal.fragment.js\");\n }\n else {\n await import(\"../Shaders/oitFinal.fragment.js\");\n }\n },\n });\n this._effectRenderer = new EffectRenderer(this._engine);\n }\n /**\n * Links to the prepass renderer\n * @param prePassRenderer The scene PrePassRenderer\n */\n setPrePassRenderer(prePassRenderer) {\n prePassRenderer.addEffectConfiguration(this._prePassEffectConfiguration);\n }\n /**\n * Binds depth peeling textures on an effect\n * @param effect The effect to bind textures on\n */\n bind(effect) {\n effect.setTexture(\"oitDepthSampler\", this._thinTextures[this._currentPingPongState * 3]);\n effect.setTexture(\"oitFrontColorSampler\", this._thinTextures[this._currentPingPongState * 3 + 1]);\n }\n _renderSubMeshes(transparentSubMeshes) {\n let mapMaterialContext;\n if (this._useRenderPasses) {\n mapMaterialContext = {};\n }\n for (let j = 0; j < transparentSubMeshes.length; j++) {\n const material = transparentSubMeshes.data[j].getMaterial();\n let previousShaderHotSwapping = true;\n let previousBFC = false;\n const subMesh = transparentSubMeshes.data[j];\n let drawWrapper;\n let firstDraw = false;\n if (this._useRenderPasses) {\n drawWrapper = subMesh._getDrawWrapper();\n firstDraw = !drawWrapper;\n }\n if (material) {\n previousShaderHotSwapping = material.allowShaderHotSwapping;\n previousBFC = material.backFaceCulling;\n material.allowShaderHotSwapping = false;\n material.backFaceCulling = false;\n }\n subMesh.render(false);\n if (firstDraw) {\n // first time we draw this submesh: we replace the material context\n drawWrapper = subMesh._getDrawWrapper(); // we are sure it is now non empty as we just rendered the submesh\n if (drawWrapper.materialContext) {\n let newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId];\n if (!newMaterialContext) {\n newMaterialContext = mapMaterialContext[drawWrapper.materialContext.uniqueId] = this._engine.createMaterialContext();\n }\n subMesh._getDrawWrapper().materialContext = newMaterialContext;\n }\n }\n if (material) {\n material.allowShaderHotSwapping = previousShaderHotSwapping;\n material.backFaceCulling = previousBFC;\n }\n }\n }\n _finalCompose(writeId) {\n const output = this._scene.prePassRenderer?.setCustomOutput(this._outputRT);\n if (output) {\n this._engine.bindFramebuffer(this._outputRT.renderTarget);\n }\n else {\n this._engine.restoreDefaultFramebuffer();\n }\n this._engine.setAlphaMode(0);\n this._engine.applyStates();\n this._engine.enableEffect(this._finalEffectWrapper.drawWrapper);\n this._finalEffectWrapper.effect.setTexture(\"uFrontColor\", this._thinTextures[writeId * 3 + 1]);\n this._finalEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[6]);\n this._effectRenderer.render(this._finalEffectWrapper);\n }\n /**\n * Checks if the depth peeling renderer is ready to render transparent meshes\n * @returns true if the depth peeling renderer is ready to render the transparent meshes\n */\n isReady() {\n return (this._blendBackEffectWrapper.effect.isReady() &&\n this._blendBackEffectWrapperPingPong.effect.isReady() &&\n this._finalEffectWrapper.effect.isReady() &&\n this._updateTextures());\n }\n /**\n * Renders transparent submeshes with depth peeling\n * @param transparentSubMeshes List of transparent meshes to render\n * @returns The array of submeshes that could not be handled by this renderer\n */\n render(transparentSubMeshes) {\n this._candidateSubMeshes.length = 0;\n this._excludedSubMeshes.length = 0;\n if (!this.isReady()) {\n return this._excludedSubMeshes;\n }\n if (this._scene.activeCamera) {\n this._engine.setViewport(this._scene.activeCamera.viewport);\n }\n for (let i = 0; i < transparentSubMeshes.length; i++) {\n const subMesh = transparentSubMeshes.data[i];\n const material = subMesh.getMaterial();\n const fillMode = material && subMesh.getRenderingMesh()._getRenderingFillMode(material.fillMode);\n if (material &&\n (fillMode === Material.TriangleFanDrawMode || fillMode === Material.TriangleFillMode || fillMode === Material.TriangleStripDrawMode) &&\n this._excludedMeshes.indexOf(subMesh.getMesh().uniqueId) === -1) {\n this._candidateSubMeshes.push(subMesh);\n }\n else {\n this._excludedSubMeshes.push(subMesh);\n }\n }\n if (!this._candidateSubMeshes.length) {\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget);\n this._finalCompose(1);\n return this._excludedSubMeshes;\n }\n const currentRenderPassId = this._engine.currentRenderPassId;\n this._scene.prePassRenderer._enabled = false;\n if (this._useRenderPasses) {\n this._engine.currentRenderPassId = this._renderPassIds[0];\n }\n // Clears\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[0], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindFramebuffer(this._depthMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[1], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[1].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[0].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[1].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[1].renderTarget);\n // Draw depth for first pass\n this._engine.bindFramebuffer(this._depthMrts[0].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.setAlphaMode(11); // in WebGPU, when using MIN or MAX equation, the src / dst color factors should not use SRC_ALPHA and the src / dst alpha factors must be 1 else WebGPU will throw a validation error\n this._engine.setAlphaEquation(3);\n this._engine.depthCullingState.depthMask = false;\n this._engine.depthCullingState.depthTest = true;\n this._engine.applyStates();\n this._currentPingPongState = 1;\n // Render\n this._renderSubMeshes(this._candidateSubMeshes);\n this._engine.unBindFramebuffer(this._depthMrts[0].renderTarget);\n this._scene.resetCachedMaterial();\n // depth peeling ping-pong\n let readId = 0;\n let writeId = 0;\n for (let i = 0; i < this._passCount; i++) {\n readId = i % 2;\n writeId = 1 - readId;\n this._currentPingPongState = readId;\n if (this._useRenderPasses) {\n this._engine.currentRenderPassId = this._renderPassIds[i + 1];\n }\n if (this._scene.activeCamera) {\n this._engine.setViewport(this._scene.activeCamera.viewport);\n }\n // Clears\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.clear(this._colorCache[0], true, false, false);\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindFramebuffer(this._colorMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[1]);\n this._engine.clear(this._colorCache[2], true, false, false);\n this._engine.unBindFramebuffer(this._colorMrts[writeId].renderTarget);\n this._engine.bindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._engine.bindAttachments(this._layoutCache[2]);\n this._engine.setAlphaMode(11); // the value does not matter (as MAX operation does not use them) but the src and dst color factors should not use SRC_ALPHA else WebGPU will throw a validation error\n this._engine.setAlphaEquation(3);\n this._engine.depthCullingState.depthTest = false;\n this._engine.applyStates();\n // Render\n this._renderSubMeshes(this._candidateSubMeshes);\n this._engine.unBindFramebuffer(this._depthMrts[writeId].renderTarget);\n this._scene.resetCachedMaterial();\n // Back color\n this._engine.bindFramebuffer(this._blendBackMrt.renderTarget);\n this._engine.bindAttachments(this._layoutCache[0]);\n this._engine.setAlphaEquation(0);\n this._engine.setAlphaMode(17);\n this._engine.applyStates();\n const blendBackEffectWrapper = writeId === 0 || !this._useRenderPasses ? this._blendBackEffectWrapper : this._blendBackEffectWrapperPingPong;\n this._engine.enableEffect(blendBackEffectWrapper.drawWrapper);\n blendBackEffectWrapper.effect.setTexture(\"uBackColor\", this._thinTextures[writeId * 3 + 2]);\n this._effectRenderer.render(blendBackEffectWrapper);\n this._engine.unBindFramebuffer(this._blendBackMrt.renderTarget);\n }\n this._engine.currentRenderPassId = currentRenderPassId;\n // Final composition on default FB\n this._finalCompose(writeId);\n this._scene.prePassRenderer._enabled = true;\n this._engine.depthCullingState.depthMask = true;\n this._engine.depthCullingState.depthTest = true;\n return this._excludedSubMeshes;\n }\n /**\n * Disposes the depth peeling renderer and associated ressources\n */\n dispose() {\n this._disposeTextures();\n this._blendBackEffectWrapper.dispose();\n this._finalEffectWrapper.dispose();\n this._effectRenderer.dispose();\n this._releaseRenderPassIds();\n }\n}\nDepthPeelingRenderer._DEPTH_CLEAR_VALUE = -99999.0;\nDepthPeelingRenderer._MIN_DEPTH = 0;\nDepthPeelingRenderer._MAX_DEPTH = 1;\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}