60dfea53e1c17502cf4f0661946a964ad3ff0296.js 66 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524
  1. System.register(["__unresolved_0", "cc", "cc/env", "__unresolved_1"], function (_export, _context) {
  2. "use strict";
  3. var _reporterNs, _cclegacy, __checkObsolete__, __checkObsoleteInNamespace__, assert, cclegacy, clamp, geometry, gfx, Layers, Material, pipeline, PipelineEventType, renderer, rendering, sys, Vec2, Vec3, Vec4, warn, DEBUG, EDITOR, makePipelineSettings, PipelineConfigs, CameraConfigs, ForwardLighting, BuiltinForwardPassBuilder, BuiltinBloomPassBuilder, BuiltinToneMappingPassBuilder, BuiltinFXAAPassBuilder, BuiltinFsrPassBuilder, BuiltinUiPassBuilder, _crd, AABB, Sphere, intersect, ClearFlagBit, Color, Format, FormatFeatureBit, LoadOp, StoreOp, TextureType, Viewport, scene, CameraUsage, CSMLevel, LightType, defaultSettings, sClearColorTransparentBlack, QueueHint, SceneFlags;
  4. function forwardNeedClearColor(camera) {
  5. return !!(camera.clearFlag & (ClearFlagBit.COLOR | ClearFlagBit.STENCIL << 1));
  6. }
  7. function getCsmMainLightViewport(light, w, h, level, vp, screenSpaceSignY) {
  8. if (light.shadowFixedArea || light.csmLevel === CSMLevel.LEVEL_1) {
  9. vp.left = 0;
  10. vp.top = 0;
  11. vp.width = Math.trunc(w);
  12. vp.height = Math.trunc(h);
  13. } else {
  14. vp.left = Math.trunc(level % 2 * 0.5 * w);
  15. if (screenSpaceSignY > 0) {
  16. vp.top = Math.trunc((1 - Math.floor(level / 2)) * 0.5 * h);
  17. } else {
  18. vp.top = Math.trunc(Math.floor(level / 2) * 0.5 * h);
  19. }
  20. vp.width = Math.trunc(0.5 * w);
  21. vp.height = Math.trunc(0.5 * h);
  22. }
  23. vp.left = Math.max(0, vp.left);
  24. vp.top = Math.max(0, vp.top);
  25. vp.width = Math.max(1, vp.width);
  26. vp.height = Math.max(1, vp.height);
  27. }
  28. function setupPipelineConfigs(ppl, configs) {
  29. var sampleFeature = FormatFeatureBit.SAMPLED_TEXTURE | FormatFeatureBit.LINEAR_FILTER;
  30. var device = ppl.device; // Platform
  31. configs.isWeb = !sys.isNative;
  32. configs.isWebGL1 = device.gfxAPI === gfx.API.WEBGL;
  33. configs.isWebGPU = device.gfxAPI === gfx.API.WEBGPU;
  34. configs.isMobile = sys.isMobile; // Rendering
  35. configs.isHDR = ppl.pipelineSceneData.isHDR; // Has tone mapping
  36. configs.useFloatOutput = ppl.getMacroBool('CC_USE_FLOAT_OUTPUT');
  37. configs.toneMappingType = ppl.pipelineSceneData.postSettings.toneMappingType; // Shadow
  38. var shadowInfo = ppl.pipelineSceneData.shadows;
  39. configs.shadowEnabled = shadowInfo.enabled;
  40. configs.shadowMapFormat = pipeline.supportsR32FloatTexture(ppl.device) ? Format.R32F : Format.RGBA8;
  41. configs.shadowMapSize.set(shadowInfo.size);
  42. configs.usePlanarShadow = shadowInfo.enabled && shadowInfo.type === renderer.scene.ShadowType.Planar; // Device
  43. configs.screenSpaceSignY = ppl.device.capabilities.screenSpaceSignY;
  44. configs.supportDepthSample = (ppl.device.getFormatFeatures(Format.DEPTH_STENCIL) & sampleFeature) === sampleFeature; // Constants
  45. var screenSpaceSignY = device.capabilities.screenSpaceSignY;
  46. configs.platform.x = configs.isMobile ? 1.0 : 0.0;
  47. configs.platform.w = screenSpaceSignY * 0.5 + 0.5 << 1 | device.capabilities.clipSpaceSignY * 0.5 + 0.5;
  48. }
  49. function sortPipelinePassBuildersByConfigOrder(passBuilders) {
  50. passBuilders.sort((a, b) => {
  51. return a.getConfigOrder() - b.getConfigOrder();
  52. });
  53. }
  54. function sortPipelinePassBuildersByRenderOrder(passBuilders) {
  55. passBuilders.sort((a, b) => {
  56. return a.getRenderOrder() - b.getRenderOrder();
  57. });
  58. }
  59. function addCopyToScreenPass(ppl, pplConfigs, cameraConfigs, input) {
  60. assert(!!cameraConfigs.copyAndTonemapMaterial);
  61. var pass = ppl.addRenderPass(cameraConfigs.nativeWidth, cameraConfigs.nativeHeight, 'cc-tone-mapping');
  62. pass.addRenderTarget(cameraConfigs.colorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  63. pass.addTexture(input, 'inputTexture');
  64. pass.setVec4('g_platform', pplConfigs.platform);
  65. pass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(cameraConfigs.copyAndTonemapMaterial, 1);
  66. return pass;
  67. }
  68. function getPingPongRenderTarget(prevName, prefix, id) {
  69. if (prevName.startsWith(prefix)) {
  70. return "" + prefix + (1 - Number(prevName.charAt(prefix.length))) + "_" + id;
  71. } else {
  72. return prefix + "0_" + id;
  73. }
  74. }
  75. function _reportPossibleCrUseOfmakePipelineSettings(extras) {
  76. _reporterNs.report("makePipelineSettings", "./builtin-pipeline-types", _context.meta, extras);
  77. }
  78. function _reportPossibleCrUseOfPipelineSettings(extras) {
  79. _reporterNs.report("PipelineSettings", "./builtin-pipeline-types", _context.meta, extras);
  80. }
  81. _export({
  82. PipelineConfigs: void 0,
  83. CameraConfigs: void 0,
  84. getPingPongRenderTarget: getPingPongRenderTarget,
  85. BuiltinForwardPassBuilder: void 0,
  86. BuiltinBloomPassBuilder: void 0,
  87. BuiltinToneMappingPassBuilder: void 0,
  88. BuiltinFXAAPassBuilder: void 0,
  89. BuiltinFsrPassBuilder: void 0,
  90. BuiltinUiPassBuilder: void 0
  91. });
  92. return {
  93. setters: [function (_unresolved_) {
  94. _reporterNs = _unresolved_;
  95. }, function (_cc) {
  96. _cclegacy = _cc.cclegacy;
  97. __checkObsolete__ = _cc.__checkObsolete__;
  98. __checkObsoleteInNamespace__ = _cc.__checkObsoleteInNamespace__;
  99. assert = _cc.assert;
  100. cclegacy = _cc.cclegacy;
  101. clamp = _cc.clamp;
  102. geometry = _cc.geometry;
  103. gfx = _cc.gfx;
  104. Layers = _cc.Layers;
  105. Material = _cc.Material;
  106. pipeline = _cc.pipeline;
  107. PipelineEventType = _cc.PipelineEventType;
  108. renderer = _cc.renderer;
  109. rendering = _cc.rendering;
  110. sys = _cc.sys;
  111. Vec2 = _cc.Vec2;
  112. Vec3 = _cc.Vec3;
  113. Vec4 = _cc.Vec4;
  114. warn = _cc.warn;
  115. }, function (_ccEnv) {
  116. DEBUG = _ccEnv.DEBUG;
  117. EDITOR = _ccEnv.EDITOR;
  118. }, function (_unresolved_2) {
  119. makePipelineSettings = _unresolved_2.makePipelineSettings;
  120. }],
  121. execute: function () {
  122. _crd = true;
  123. _cclegacy._RF.push({}, "ff9b0GZzgRM/obMbHGfCNbk", "builtin-pipeline", undefined);
  124. /*
  125. Copyright (c) 2021-2024 Xiamen Yaji Software Co., Ltd.
  126. https://www.cocos.com/
  127. Permission is hereby granted, free of charge, to any person obtaining a copy
  128. of this software and associated documentation files (the "Software"), to deal
  129. in the Software without restriction, including without limitation the rights to
  130. use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
  131. of the Software, and to permit persons to whom the Software is furnished to do so,
  132. subject to the following conditions:
  133. The above copyright notice and this permission notice shall be included in
  134. all copies or substantial portions of the Software.
  135. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  136. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  137. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  138. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  139. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  140. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  141. THE SOFTWARE.
  142. */
  143. __checkObsolete__(['assert', 'cclegacy', 'clamp', 'geometry', 'gfx', 'Layers', 'Material', 'pipeline', 'PipelineEventProcessor', 'PipelineEventType', 'ReflectionProbeManager', 'renderer', 'rendering', 'sys', 'Vec2', 'Vec3', 'Vec4', 'warn']);
  144. ({
  145. AABB,
  146. Sphere,
  147. intersect
  148. } = geometry);
  149. ({
  150. ClearFlagBit,
  151. Color,
  152. Format,
  153. FormatFeatureBit,
  154. LoadOp,
  155. StoreOp,
  156. TextureType,
  157. Viewport
  158. } = gfx);
  159. ({
  160. scene
  161. } = renderer);
  162. ({
  163. CameraUsage,
  164. CSMLevel,
  165. LightType
  166. } = scene);
  167. _export("PipelineConfigs", PipelineConfigs = class PipelineConfigs {
  168. constructor() {
  169. this.isWeb = false;
  170. this.isWebGL1 = false;
  171. this.isWebGPU = false;
  172. this.isMobile = false;
  173. this.isHDR = false;
  174. this.useFloatOutput = false;
  175. this.toneMappingType = 0;
  176. // 0: ACES, 1: None
  177. this.shadowEnabled = false;
  178. this.shadowMapFormat = Format.R32F;
  179. this.shadowMapSize = new Vec2(1, 1);
  180. this.usePlanarShadow = false;
  181. this.screenSpaceSignY = 1;
  182. this.supportDepthSample = false;
  183. this.mobileMaxSpotLightShadowMaps = 1;
  184. this.platform = new Vec4(0, 0, 0, 0);
  185. }
  186. });
  187. defaultSettings = (_crd && makePipelineSettings === void 0 ? (_reportPossibleCrUseOfmakePipelineSettings({
  188. error: Error()
  189. }), makePipelineSettings) : makePipelineSettings)();
  190. _export("CameraConfigs", CameraConfigs = class CameraConfigs {
  191. constructor() {
  192. this.settings = defaultSettings;
  193. // Window
  194. this.isMainGameWindow = false;
  195. this.renderWindowId = 0;
  196. // Camera
  197. this.colorName = '';
  198. this.depthStencilName = '';
  199. // Pipeline
  200. this.enableFullPipeline = false;
  201. this.enableProfiler = false;
  202. this.remainingPasses = 0;
  203. // Shading Scale
  204. this.enableShadingScale = false;
  205. this.shadingScale = 1.0;
  206. this.nativeWidth = 1;
  207. this.nativeHeight = 1;
  208. this.width = 1;
  209. // Scaled width
  210. this.height = 1;
  211. // Scaled height
  212. // Radiance
  213. this.enableHDR = false;
  214. this.radianceFormat = gfx.Format.RGBA8;
  215. // Tone Mapping
  216. this.copyAndTonemapMaterial = null;
  217. // Depth
  218. /** @en mutable */
  219. this.enableStoreSceneDepth = false;
  220. }
  221. });
  222. sClearColorTransparentBlack = new Color(0, 0, 0, 0);
  223. ForwardLighting = class ForwardLighting {
  224. constructor() {
  225. // Active lights
  226. this.lights = [];
  227. // Active spot lights with shadows (Mutually exclusive with `lights`)
  228. this.shadowEnabledSpotLights = [];
  229. // Internal cached resources
  230. this._sphere = Sphere.create(0, 0, 0, 1);
  231. this._boundingBox = new AABB();
  232. this._rangedDirLightBoundingBox = new AABB(0.0, 0.0, 0.0, 0.5, 0.5, 0.5);
  233. }
  234. // ----------------------------------------------------------------
  235. // Interface
  236. // ----------------------------------------------------------------
  237. cullLights(scene, frustum, cameraPos) {
  238. // TODO(zhouzhenglong): Make light culling native
  239. this.lights.length = 0;
  240. this.shadowEnabledSpotLights.length = 0; // spot lights
  241. for (var light of scene.spotLights) {
  242. if (light.baked) {
  243. continue;
  244. }
  245. Sphere.set(this._sphere, light.position.x, light.position.y, light.position.z, light.range);
  246. if (intersect.sphereFrustum(this._sphere, frustum)) {
  247. if (light.shadowEnabled) {
  248. this.shadowEnabledSpotLights.push(light);
  249. } else {
  250. this.lights.push(light);
  251. }
  252. }
  253. } // sphere lights
  254. for (var _light of scene.sphereLights) {
  255. if (_light.baked) {
  256. continue;
  257. }
  258. Sphere.set(this._sphere, _light.position.x, _light.position.y, _light.position.z, _light.range);
  259. if (intersect.sphereFrustum(this._sphere, frustum)) {
  260. this.lights.push(_light);
  261. }
  262. } // point lights
  263. for (var _light2 of scene.pointLights) {
  264. if (_light2.baked) {
  265. continue;
  266. }
  267. Sphere.set(this._sphere, _light2.position.x, _light2.position.y, _light2.position.z, _light2.range);
  268. if (intersect.sphereFrustum(this._sphere, frustum)) {
  269. this.lights.push(_light2);
  270. }
  271. } // ranged dir lights
  272. for (var _light3 of scene.rangedDirLights) {
  273. AABB.transform(this._boundingBox, this._rangedDirLightBoundingBox, _light3.node.getWorldMatrix());
  274. if (intersect.aabbFrustum(this._boundingBox, frustum)) {
  275. this.lights.push(_light3);
  276. }
  277. }
  278. if (cameraPos) {
  279. this.shadowEnabledSpotLights.sort((lhs, rhs) => Vec3.squaredDistance(cameraPos, lhs.position) - Vec3.squaredDistance(cameraPos, rhs.position));
  280. }
  281. }
  282. _addLightQueues(camera, pass) {
  283. for (var light of this.lights) {
  284. var queue = pass.addQueue(rendering.QueueHint.BLEND, 'forward-add');
  285. switch (light.type) {
  286. case LightType.SPHERE:
  287. queue.name = 'sphere-light';
  288. break;
  289. case LightType.SPOT:
  290. queue.name = 'spot-light';
  291. break;
  292. case LightType.POINT:
  293. queue.name = 'point-light';
  294. break;
  295. case LightType.RANGED_DIRECTIONAL:
  296. queue.name = 'ranged-directional-light';
  297. break;
  298. default:
  299. queue.name = 'unknown-light';
  300. }
  301. queue.addScene(camera, rendering.SceneFlags.BLEND, light);
  302. }
  303. }
  304. addSpotlightShadowPasses(ppl, camera, maxNumShadowMaps) {
  305. var i = 0;
  306. for (var light of this.shadowEnabledSpotLights) {
  307. var shadowMapSize = ppl.pipelineSceneData.shadows.size;
  308. var shadowPass = ppl.addRenderPass(shadowMapSize.x, shadowMapSize.y, 'default');
  309. shadowPass.name = "SpotLightShadowPass" + i;
  310. shadowPass.addRenderTarget("SpotShadowMap" + i, LoadOp.CLEAR, StoreOp.STORE, new Color(1, 1, 1, 1));
  311. shadowPass.addDepthStencil("SpotShadowDepth" + i, LoadOp.CLEAR, StoreOp.DISCARD);
  312. shadowPass.addQueue(rendering.QueueHint.NONE, 'shadow-caster').addScene(camera, rendering.SceneFlags.OPAQUE | rendering.SceneFlags.MASK | rendering.SceneFlags.SHADOW_CASTER).useLightFrustum(light);
  313. ++i;
  314. if (i >= maxNumShadowMaps) {
  315. break;
  316. }
  317. }
  318. }
  319. addLightQueues(pass, camera, maxNumShadowMaps) {
  320. this._addLightQueues(camera, pass);
  321. var i = 0;
  322. for (var light of this.shadowEnabledSpotLights) {
  323. // Add spot-light pass
  324. // Save last RenderPass to the `pass` variable
  325. // TODO(zhouzhenglong): Fix per queue addTexture
  326. pass.addTexture("SpotShadowMap" + i, 'cc_spotShadowMap');
  327. var queue = pass.addQueue(rendering.QueueHint.BLEND, 'forward-add');
  328. queue.addScene(camera, rendering.SceneFlags.BLEND, light);
  329. ++i;
  330. if (i >= maxNumShadowMaps) {
  331. break;
  332. }
  333. }
  334. } // Notice: ForwardLighting cannot handle a lot of lights.
  335. // If there are too many lights, the performance will be very poor.
  336. // If many lights are needed, please implement a forward+ or deferred rendering pipeline.
  337. addLightPasses(colorName, depthStencilName, depthStencilStoreOp, id, // window id
  338. width, height, camera, viewport, ppl, pass) {
  339. this._addLightQueues(camera, pass);
  340. var count = 0;
  341. var shadowMapSize = ppl.pipelineSceneData.shadows.size;
  342. for (var light of this.shadowEnabledSpotLights) {
  343. var shadowPass = ppl.addRenderPass(shadowMapSize.x, shadowMapSize.y, 'default');
  344. shadowPass.name = 'SpotlightShadowPass'; // Reuse csm shadow map
  345. shadowPass.addRenderTarget("ShadowMap" + id, LoadOp.CLEAR, StoreOp.STORE, new Color(1, 1, 1, 1));
  346. shadowPass.addDepthStencil("ShadowDepth" + id, LoadOp.CLEAR, StoreOp.DISCARD);
  347. shadowPass.addQueue(rendering.QueueHint.NONE, 'shadow-caster').addScene(camera, rendering.SceneFlags.OPAQUE | rendering.SceneFlags.MASK | rendering.SceneFlags.SHADOW_CASTER).useLightFrustum(light); // Add spot-light pass
  348. // Save last RenderPass to the `pass` variable
  349. ++count;
  350. var storeOp = count === this.shadowEnabledSpotLights.length ? depthStencilStoreOp : StoreOp.STORE;
  351. pass = ppl.addRenderPass(width, height, 'default');
  352. pass.name = 'SpotlightWithShadowMap';
  353. pass.setViewport(viewport);
  354. pass.addRenderTarget(colorName, LoadOp.LOAD);
  355. pass.addDepthStencil(depthStencilName, LoadOp.LOAD, storeOp);
  356. pass.addTexture("ShadowMap" + id, 'cc_spotShadowMap');
  357. var queue = pass.addQueue(rendering.QueueHint.BLEND, 'forward-add');
  358. queue.addScene(camera, rendering.SceneFlags.BLEND, light);
  359. }
  360. return pass;
  361. }
  362. isMultipleLightPassesNeeded() {
  363. return this.shadowEnabledSpotLights.length > 0;
  364. }
  365. };
  366. _export("BuiltinForwardPassBuilder", BuiltinForwardPassBuilder = class BuiltinForwardPassBuilder {
  367. constructor() {
  368. this.forwardLighting = new ForwardLighting();
  369. this._viewport = new Viewport();
  370. this._clearColor = new Color(0, 0, 0, 1);
  371. this._reflectionProbeClearColor = new Vec3(0, 0, 0);
  372. }
  373. getConfigOrder() {
  374. return BuiltinForwardPassBuilder.ConfigOrder;
  375. }
  376. getRenderOrder() {
  377. return BuiltinForwardPassBuilder.RenderOrder;
  378. }
  379. configCamera(camera, pipelineConfigs, cameraConfigs) {
  380. // Shadow
  381. cameraConfigs.enableMainLightShadowMap = pipelineConfigs.shadowEnabled && !pipelineConfigs.usePlanarShadow && !!camera.scene && !!camera.scene.mainLight && camera.scene.mainLight.shadowEnabled;
  382. cameraConfigs.enableMainLightPlanarShadowMap = pipelineConfigs.shadowEnabled && pipelineConfigs.usePlanarShadow && !!camera.scene && !!camera.scene.mainLight && camera.scene.mainLight.shadowEnabled; // Reflection Probe
  383. cameraConfigs.enablePlanarReflectionProbe = cameraConfigs.isMainGameWindow || camera.cameraUsage === CameraUsage.SCENE_VIEW || camera.cameraUsage === CameraUsage.GAME_VIEW; // MSAA
  384. cameraConfigs.enableMSAA = cameraConfigs.settings.msaa.enabled && !cameraConfigs.enableStoreSceneDepth // Cannot store MS depth, resolve depth is also not cross-platform
  385. && !pipelineConfigs.isWeb // TODO(zhouzhenglong): remove this constraint
  386. && !pipelineConfigs.isWebGL1; // Forward rendering (Depend on MSAA and TBR)
  387. cameraConfigs.enableSingleForwardPass = pipelineConfigs.isMobile || cameraConfigs.enableMSAA;
  388. ++cameraConfigs.remainingPasses;
  389. }
  390. windowResize(ppl, pplConfigs, cameraConfigs, window, camera, nativeWidth, nativeHeight) {
  391. var ResourceFlags = rendering.ResourceFlags;
  392. var ResourceResidency = rendering.ResourceResidency;
  393. var id = window.renderWindowId;
  394. var settings = cameraConfigs.settings;
  395. var width = cameraConfigs.enableShadingScale ? Math.max(Math.floor(nativeWidth * cameraConfigs.shadingScale), 1) : nativeWidth;
  396. var height = cameraConfigs.enableShadingScale ? Math.max(Math.floor(nativeHeight * cameraConfigs.shadingScale), 1) : nativeHeight; // MsaaRadiance
  397. if (cameraConfigs.enableMSAA) {
  398. // Notice: We never store multisample results.
  399. // These samples are always resolved and discarded at the end of the render pass.
  400. // So the ResourceResidency should be MEMORYLESS.
  401. if (cameraConfigs.enableHDR) {
  402. ppl.addTexture("MsaaRadiance" + id, TextureType.TEX2D, cameraConfigs.radianceFormat, width, height, 1, 1, 1, settings.msaa.sampleCount, ResourceFlags.COLOR_ATTACHMENT, ResourceResidency.MEMORYLESS);
  403. } else {
  404. ppl.addTexture("MsaaRadiance" + id, TextureType.TEX2D, Format.RGBA8, width, height, 1, 1, 1, settings.msaa.sampleCount, ResourceFlags.COLOR_ATTACHMENT, ResourceResidency.MEMORYLESS);
  405. }
  406. ppl.addTexture("MsaaDepthStencil" + id, TextureType.TEX2D, Format.DEPTH_STENCIL, width, height, 1, 1, 1, settings.msaa.sampleCount, ResourceFlags.DEPTH_STENCIL_ATTACHMENT, ResourceResidency.MEMORYLESS);
  407. } // Mainlight ShadowMap
  408. ppl.addRenderTarget("ShadowMap" + id, pplConfigs.shadowMapFormat, pplConfigs.shadowMapSize.x, pplConfigs.shadowMapSize.y);
  409. ppl.addDepthStencil("ShadowDepth" + id, Format.DEPTH_STENCIL, pplConfigs.shadowMapSize.x, pplConfigs.shadowMapSize.y); // Spot-light shadow maps
  410. if (cameraConfigs.enableSingleForwardPass) {
  411. var count = pplConfigs.mobileMaxSpotLightShadowMaps;
  412. for (var i = 0; i !== count; ++i) {
  413. ppl.addRenderTarget("SpotShadowMap" + i, pplConfigs.shadowMapFormat, pplConfigs.shadowMapSize.x, pplConfigs.shadowMapSize.y);
  414. ppl.addDepthStencil("SpotShadowDepth" + i, Format.DEPTH_STENCIL, pplConfigs.shadowMapSize.x, pplConfigs.shadowMapSize.y);
  415. }
  416. }
  417. }
  418. setup(ppl, pplConfigs, cameraConfigs, camera, context) {
  419. var id = camera.window.renderWindowId;
  420. var scene = camera.scene;
  421. var mainLight = scene.mainLight;
  422. --cameraConfigs.remainingPasses;
  423. assert(cameraConfigs.remainingPasses >= 0); // Forward Lighting (Light Culling)
  424. this.forwardLighting.cullLights(scene, camera.frustum); // Main Directional light CSM Shadow Map
  425. if (cameraConfigs.enableMainLightShadowMap) {
  426. assert(!!mainLight);
  427. this._addCascadedShadowMapPass(ppl, pplConfigs, id, mainLight, camera);
  428. } // Spot light shadow maps (Mobile or MSAA)
  429. if (cameraConfigs.enableSingleForwardPass) {
  430. // Currently, only support 1 spot light with shadow map on mobile platform.
  431. // TODO(zhouzhenglong): Relex this limitation.
  432. this.forwardLighting.addSpotlightShadowPasses(ppl, camera, pplConfigs.mobileMaxSpotLightShadowMaps);
  433. }
  434. this._tryAddReflectionProbePasses(ppl, cameraConfigs, id, mainLight, camera.scene);
  435. if (cameraConfigs.remainingPasses > 0 || cameraConfigs.enableShadingScale) {
  436. context.colorName = cameraConfigs.enableShadingScale ? "ScaledRadiance0_" + id : "Radiance0_" + id;
  437. context.depthStencilName = cameraConfigs.enableShadingScale ? "ScaledSceneDepth_" + id : "SceneDepth_" + id;
  438. } else {
  439. context.colorName = cameraConfigs.colorName;
  440. context.depthStencilName = cameraConfigs.depthStencilName;
  441. }
  442. var pass = this._addForwardRadiancePasses(ppl, pplConfigs, cameraConfigs, id, camera, cameraConfigs.width, cameraConfigs.height, mainLight, context.colorName, context.depthStencilName, !cameraConfigs.enableMSAA, cameraConfigs.enableStoreSceneDepth ? StoreOp.STORE : StoreOp.DISCARD);
  443. if (!cameraConfigs.enableStoreSceneDepth) {
  444. context.depthStencilName = '';
  445. }
  446. if (cameraConfigs.remainingPasses === 0 && cameraConfigs.enableShadingScale) {
  447. return addCopyToScreenPass(ppl, pplConfigs, cameraConfigs, context.colorName);
  448. } else {
  449. return pass;
  450. }
  451. }
  452. _addCascadedShadowMapPass(ppl, pplConfigs, id, light, camera) {
  453. var QueueHint = rendering.QueueHint;
  454. var SceneFlags = rendering.SceneFlags; // ----------------------------------------------------------------
  455. // Dynamic states
  456. // ----------------------------------------------------------------
  457. var shadowSize = ppl.pipelineSceneData.shadows.size;
  458. var width = shadowSize.x;
  459. var height = shadowSize.y;
  460. var viewport = this._viewport;
  461. viewport.left = viewport.top = 0;
  462. viewport.width = width;
  463. viewport.height = height; // ----------------------------------------------------------------
  464. // CSM Shadow Map
  465. // ----------------------------------------------------------------
  466. var pass = ppl.addRenderPass(width, height, 'default');
  467. pass.name = 'CascadedShadowMap';
  468. pass.addRenderTarget("ShadowMap" + id, LoadOp.CLEAR, StoreOp.STORE, new Color(1, 1, 1, 1));
  469. pass.addDepthStencil("ShadowDepth" + id, LoadOp.CLEAR, StoreOp.DISCARD);
  470. var csmLevel = ppl.pipelineSceneData.csmSupported ? light.csmLevel : 1; // Add shadow map viewports
  471. for (var level = 0; level !== csmLevel; ++level) {
  472. getCsmMainLightViewport(light, width, height, level, this._viewport, pplConfigs.screenSpaceSignY);
  473. var queue = pass.addQueue(QueueHint.NONE, 'shadow-caster');
  474. if (!pplConfigs.isWebGPU) {
  475. // Temporary workaround for WebGPU
  476. queue.setViewport(this._viewport);
  477. }
  478. queue.addScene(camera, SceneFlags.OPAQUE | SceneFlags.MASK | SceneFlags.SHADOW_CASTER).useLightFrustum(light, level);
  479. }
  480. }
  481. _tryAddReflectionProbePasses(ppl, cameraConfigs, id, mainLight, scene) {
  482. var reflectionProbeManager = cclegacy.internal.reflectionProbeManager;
  483. if (!reflectionProbeManager) {
  484. return;
  485. }
  486. var ResourceResidency = rendering.ResourceResidency;
  487. var probes = reflectionProbeManager.getProbes();
  488. var maxProbeCount = 4;
  489. var probeID = 0;
  490. for (var probe of probes) {
  491. if (!probe.needRender) {
  492. continue;
  493. }
  494. var area = probe.renderArea();
  495. var width = Math.max(Math.floor(area.x), 1);
  496. var height = Math.max(Math.floor(area.y), 1);
  497. if (probe.probeType === renderer.scene.ProbeType.PLANAR) {
  498. if (!cameraConfigs.enablePlanarReflectionProbe) {
  499. continue;
  500. }
  501. var window = probe.realtimePlanarTexture.window;
  502. var colorName = "PlanarProbeRT" + probeID;
  503. var depthStencilName = "PlanarProbeDS" + probeID; // ProbeResource
  504. ppl.addRenderWindow(colorName, cameraConfigs.radianceFormat, width, height, window);
  505. ppl.addDepthStencil(depthStencilName, gfx.Format.DEPTH_STENCIL, width, height, ResourceResidency.MEMORYLESS); // Rendering
  506. var probePass = ppl.addRenderPass(width, height, 'default');
  507. probePass.name = "PlanarReflectionProbe" + probeID;
  508. this._buildReflectionProbePass(probePass, cameraConfigs, id, probe.camera, colorName, depthStencilName, mainLight, scene);
  509. } else if (EDITOR) {
  510. for (var faceIdx = 0; faceIdx < probe.bakedCubeTextures.length; faceIdx++) {
  511. probe.updateCameraDir(faceIdx);
  512. var _window = probe.bakedCubeTextures[faceIdx].window;
  513. var _colorName = "CubeProbeRT" + probeID + faceIdx;
  514. var _depthStencilName = "CubeProbeDS" + probeID + faceIdx; // ProbeResource
  515. ppl.addRenderWindow(_colorName, cameraConfigs.radianceFormat, width, height, _window);
  516. ppl.addDepthStencil(_depthStencilName, gfx.Format.DEPTH_STENCIL, width, height, ResourceResidency.MEMORYLESS); // Rendering
  517. var _probePass = ppl.addRenderPass(width, height, 'default');
  518. _probePass.name = "CubeProbe" + probeID + faceIdx;
  519. this._buildReflectionProbePass(_probePass, cameraConfigs, id, probe.camera, _colorName, _depthStencilName, mainLight, scene);
  520. }
  521. probe.needRender = false;
  522. }
  523. ++probeID;
  524. if (probeID === maxProbeCount) {
  525. break;
  526. }
  527. }
  528. }
  529. _buildReflectionProbePass(pass, cameraConfigs, id, camera, colorName, depthStencilName, mainLight, scene) {
  530. if (scene === void 0) {
  531. scene = null;
  532. }
  533. var QueueHint = rendering.QueueHint;
  534. var SceneFlags = rendering.SceneFlags; // set viewport
  535. var colorStoreOp = cameraConfigs.enableMSAA ? StoreOp.DISCARD : StoreOp.STORE; // bind output render target
  536. if (forwardNeedClearColor(camera)) {
  537. this._reflectionProbeClearColor.x = camera.clearColor.x;
  538. this._reflectionProbeClearColor.y = camera.clearColor.y;
  539. this._reflectionProbeClearColor.z = camera.clearColor.z;
  540. var clearColor = rendering.packRGBE(this._reflectionProbeClearColor);
  541. this._clearColor.x = clearColor.x;
  542. this._clearColor.y = clearColor.y;
  543. this._clearColor.z = clearColor.z;
  544. this._clearColor.w = clearColor.w;
  545. pass.addRenderTarget(colorName, LoadOp.CLEAR, colorStoreOp, this._clearColor);
  546. } else {
  547. pass.addRenderTarget(colorName, LoadOp.LOAD, colorStoreOp);
  548. } // bind depth stencil buffer
  549. if (camera.clearFlag & ClearFlagBit.DEPTH_STENCIL) {
  550. pass.addDepthStencil(depthStencilName, LoadOp.CLEAR, StoreOp.DISCARD, camera.clearDepth, camera.clearStencil, camera.clearFlag & ClearFlagBit.DEPTH_STENCIL);
  551. } else {
  552. pass.addDepthStencil(depthStencilName, LoadOp.LOAD, StoreOp.DISCARD);
  553. } // Set shadow map if enabled
  554. if (cameraConfigs.enableMainLightShadowMap) {
  555. pass.addTexture("ShadowMap" + id, 'cc_shadowMap');
  556. } // TODO(zhouzhenglong): Separate OPAQUE and MASK queue
  557. // add opaque and mask queue
  558. pass.addQueue(QueueHint.NONE, 'reflect-map') // Currently we put OPAQUE and MASK into one queue, so QueueHint is NONE
  559. .addScene(camera, SceneFlags.OPAQUE | SceneFlags.MASK | SceneFlags.REFLECTION_PROBE, mainLight || undefined, scene ? scene : undefined);
  560. }
  561. _addForwardRadiancePasses(ppl, pplConfigs, cameraConfigs, id, camera, width, height, mainLight, colorName, depthStencilName, disableMSAA, depthStencilStoreOp) {
  562. if (disableMSAA === void 0) {
  563. disableMSAA = false;
  564. }
  565. if (depthStencilStoreOp === void 0) {
  566. depthStencilStoreOp = StoreOp.DISCARD;
  567. }
  568. var QueueHint = rendering.QueueHint;
  569. var SceneFlags = rendering.SceneFlags; // ----------------------------------------------------------------
  570. // Dynamic states
  571. // ----------------------------------------------------------------
  572. // Prepare camera clear color
  573. var clearColor = camera.clearColor; // Reduce C++/TS interop
  574. this._clearColor.x = clearColor.x;
  575. this._clearColor.y = clearColor.y;
  576. this._clearColor.z = clearColor.z;
  577. this._clearColor.w = clearColor.w; // Prepare camera viewport
  578. var viewport = camera.viewport; // Reduce C++/TS interop
  579. this._viewport.left = Math.round(viewport.x * width);
  580. this._viewport.top = Math.round(viewport.y * height); // Here we must use camera.viewport.width instead of camera.viewport.z, which
  581. // is undefined on native platform. The same as camera.viewport.height.
  582. this._viewport.width = Math.max(Math.round(viewport.width * width), 1);
  583. this._viewport.height = Math.max(Math.round(viewport.height * height), 1); // MSAA
  584. var enableMSAA = !disableMSAA && cameraConfigs.enableMSAA;
  585. assert(!enableMSAA || cameraConfigs.enableSingleForwardPass); // ----------------------------------------------------------------
  586. // Forward Lighting (Main Directional Light)
  587. // ----------------------------------------------------------------
  588. var pass = cameraConfigs.enableSingleForwardPass ? this._addForwardSingleRadiancePass(ppl, pplConfigs, cameraConfigs, id, camera, enableMSAA, width, height, mainLight, colorName, depthStencilName, depthStencilStoreOp) : this._addForwardMultipleRadiancePasses(ppl, cameraConfigs, id, camera, width, height, mainLight, colorName, depthStencilName, depthStencilStoreOp); // Planar Shadow
  589. if (cameraConfigs.enableMainLightPlanarShadowMap) {
  590. this._addPlanarShadowQueue(camera, mainLight, pass);
  591. } // ----------------------------------------------------------------
  592. // Forward Lighting (Blend)
  593. // ----------------------------------------------------------------
  594. // Add transparent queue
  595. var sceneFlags = SceneFlags.BLEND | (camera.geometryRenderer ? SceneFlags.GEOMETRY : SceneFlags.NONE);
  596. pass.addQueue(QueueHint.BLEND).addScene(camera, sceneFlags, mainLight || undefined);
  597. return pass;
  598. }
  599. _addForwardSingleRadiancePass(ppl, pplConfigs, cameraConfigs, id, camera, enableMSAA, width, height, mainLight, colorName, depthStencilName, depthStencilStoreOp) {
  600. assert(cameraConfigs.enableSingleForwardPass); // ----------------------------------------------------------------
  601. // Forward Lighting (Main Directional Light)
  602. // ----------------------------------------------------------------
  603. var pass;
  604. if (enableMSAA) {
  605. var msaaRadianceName = "MsaaRadiance" + id;
  606. var msaaDepthStencilName = "MsaaDepthStencil" + id;
  607. var sampleCount = cameraConfigs.settings.msaa.sampleCount;
  608. var msPass = ppl.addMultisampleRenderPass(width, height, sampleCount, 0, 'default');
  609. msPass.name = 'MsaaForwardPass'; // MSAA always discards depth stencil
  610. this._buildForwardMainLightPass(msPass, cameraConfigs, id, camera, msaaRadianceName, msaaDepthStencilName, StoreOp.DISCARD, mainLight);
  611. msPass.resolveRenderTarget(msaaRadianceName, colorName);
  612. pass = msPass;
  613. } else {
  614. pass = ppl.addRenderPass(width, height, 'default');
  615. pass.name = 'ForwardPass';
  616. this._buildForwardMainLightPass(pass, cameraConfigs, id, camera, colorName, depthStencilName, depthStencilStoreOp, mainLight);
  617. }
  618. assert(pass !== undefined); // Forward Lighting (Additive Lights)
  619. this.forwardLighting.addLightQueues(pass, camera, pplConfigs.mobileMaxSpotLightShadowMaps);
  620. return pass;
  621. }
  622. _addForwardMultipleRadiancePasses(ppl, cameraConfigs, id, camera, width, height, mainLight, colorName, depthStencilName, depthStencilStoreOp) {
  623. assert(!cameraConfigs.enableSingleForwardPass); // Forward Lighting (Main Directional Light)
  624. var pass = ppl.addRenderPass(width, height, 'default');
  625. pass.name = 'ForwardPass';
  626. var firstStoreOp = this.forwardLighting.isMultipleLightPassesNeeded() ? StoreOp.STORE : depthStencilStoreOp;
  627. this._buildForwardMainLightPass(pass, cameraConfigs, id, camera, colorName, depthStencilName, firstStoreOp, mainLight); // Forward Lighting (Additive Lights)
  628. pass = this.forwardLighting.addLightPasses(colorName, depthStencilName, depthStencilStoreOp, id, width, height, camera, this._viewport, ppl, pass);
  629. return pass;
  630. }
  631. _buildForwardMainLightPass(pass, cameraConfigs, id, camera, colorName, depthStencilName, depthStencilStoreOp, mainLight, scene) {
  632. if (scene === void 0) {
  633. scene = null;
  634. }
  635. var QueueHint = rendering.QueueHint;
  636. var SceneFlags = rendering.SceneFlags; // set viewport
  637. pass.setViewport(this._viewport);
  638. var colorStoreOp = cameraConfigs.enableMSAA ? StoreOp.DISCARD : StoreOp.STORE; // bind output render target
  639. if (forwardNeedClearColor(camera)) {
  640. pass.addRenderTarget(colorName, LoadOp.CLEAR, colorStoreOp, this._clearColor);
  641. } else {
  642. pass.addRenderTarget(colorName, LoadOp.LOAD, colorStoreOp);
  643. } // bind depth stencil buffer
  644. if (DEBUG) {
  645. if (colorName === cameraConfigs.colorName && depthStencilName !== cameraConfigs.depthStencilName) {
  646. warn('Default framebuffer cannot use custom depth stencil buffer');
  647. }
  648. }
  649. if (camera.clearFlag & ClearFlagBit.DEPTH_STENCIL) {
  650. pass.addDepthStencil(depthStencilName, LoadOp.CLEAR, depthStencilStoreOp, camera.clearDepth, camera.clearStencil, camera.clearFlag & ClearFlagBit.DEPTH_STENCIL);
  651. } else {
  652. pass.addDepthStencil(depthStencilName, LoadOp.LOAD, depthStencilStoreOp);
  653. } // Set shadow map if enabled
  654. if (cameraConfigs.enableMainLightShadowMap) {
  655. pass.addTexture("ShadowMap" + id, 'cc_shadowMap');
  656. } // TODO(zhouzhenglong): Separate OPAQUE and MASK queue
  657. // add opaque and mask queue
  658. pass.addQueue(QueueHint.NONE) // Currently we put OPAQUE and MASK into one queue, so QueueHint is NONE
  659. .addScene(camera, SceneFlags.OPAQUE | SceneFlags.MASK, mainLight || undefined, scene ? scene : undefined);
  660. }
  661. _addPlanarShadowQueue(camera, mainLight, pass) {
  662. var QueueHint = rendering.QueueHint;
  663. var SceneFlags = rendering.SceneFlags;
  664. pass.addQueue(QueueHint.BLEND, 'planar-shadow').addScene(camera, SceneFlags.SHADOW_CASTER | SceneFlags.PLANAR_SHADOW | SceneFlags.BLEND, mainLight || undefined);
  665. }
  666. });
  667. BuiltinForwardPassBuilder.ConfigOrder = 100;
  668. BuiltinForwardPassBuilder.RenderOrder = 100;
  669. _export("BuiltinBloomPassBuilder", BuiltinBloomPassBuilder = class BuiltinBloomPassBuilder {
  670. constructor() {
  671. // Bloom
  672. this._clearColorTransparentBlack = new Color(0, 0, 0, 0);
  673. this._bloomParams = new Vec4(0, 0, 0, 0);
  674. this._bloomTexSize = new Vec4(0, 0, 0, 0);
  675. this._bloomWidths = [];
  676. this._bloomHeights = [];
  677. this._bloomTexNames = [];
  678. }
  679. getConfigOrder() {
  680. return 0;
  681. }
  682. getRenderOrder() {
  683. return 200;
  684. }
  685. configCamera(camera, pipelineConfigs, cameraConfigs) {
  686. cameraConfigs.enableBloom = cameraConfigs.settings.bloom.enabled && !!cameraConfigs.settings.bloom.material;
  687. if (cameraConfigs.enableBloom) {
  688. ++cameraConfigs.remainingPasses;
  689. }
  690. }
  691. windowResize(ppl, pplConfigs, cameraConfigs, window) {
  692. if (cameraConfigs.enableBloom) {
  693. var id = window.renderWindowId;
  694. var bloomWidth = cameraConfigs.width;
  695. var bloomHeight = cameraConfigs.height;
  696. for (var i = 0; i !== cameraConfigs.settings.bloom.iterations + 1; ++i) {
  697. bloomWidth = Math.max(Math.floor(bloomWidth / 2), 1);
  698. bloomHeight = Math.max(Math.floor(bloomHeight / 2), 1);
  699. ppl.addRenderTarget("BloomTex" + id + "_" + i, cameraConfigs.radianceFormat, bloomWidth, bloomHeight);
  700. }
  701. }
  702. }
  703. setup(ppl, pplConfigs, cameraConfigs, camera, context, prevRenderPass) {
  704. if (!cameraConfigs.enableBloom) {
  705. return prevRenderPass;
  706. }
  707. --cameraConfigs.remainingPasses;
  708. assert(cameraConfigs.remainingPasses >= 0);
  709. var id = camera.window.renderWindowId;
  710. assert(!!cameraConfigs.settings.bloom.material);
  711. return this._addKawaseDualFilterBloomPasses(ppl, pplConfigs, cameraConfigs, cameraConfigs.settings, cameraConfigs.settings.bloom.material, id, cameraConfigs.width, cameraConfigs.height, context.colorName);
  712. }
  713. _addKawaseDualFilterBloomPasses(ppl, pplConfigs, cameraConfigs, settings, bloomMaterial, id, width, height, radianceName) {
  714. var QueueHint = rendering.QueueHint; // Based on Kawase Dual Filter Blur. Saves bandwidth on mobile devices.
  715. // eslint-disable-next-line max-len
  716. // https://community.arm.com/cfs-file/__key/communityserver-blogs-components-weblogfiles/00-00-00-20-66/siggraph2015_2D00_mmg_2D00_marius_2D00_slides.pdf
  717. // Size: [prefilter(1/2), downsample(1/4), downsample(1/8), downsample(1/16), ...]
  718. var iterations = settings.bloom.iterations;
  719. var sizeCount = iterations + 1;
  720. this._bloomWidths.length = sizeCount;
  721. this._bloomHeights.length = sizeCount;
  722. this._bloomWidths[0] = Math.max(Math.floor(width / 2), 1);
  723. this._bloomHeights[0] = Math.max(Math.floor(height / 2), 1);
  724. for (var i = 1; i !== sizeCount; ++i) {
  725. this._bloomWidths[i] = Math.max(Math.floor(this._bloomWidths[i - 1] / 2), 1);
  726. this._bloomHeights[i] = Math.max(Math.floor(this._bloomHeights[i - 1] / 2), 1);
  727. } // Bloom texture names
  728. this._bloomTexNames.length = sizeCount;
  729. for (var _i = 0; _i !== sizeCount; ++_i) {
  730. this._bloomTexNames[_i] = "BloomTex" + id + "_" + _i;
  731. } // Setup bloom parameters
  732. this._bloomParams.x = pplConfigs.useFloatOutput ? 1 : 0;
  733. this._bloomParams.x = 0; // unused
  734. this._bloomParams.z = settings.bloom.threshold;
  735. this._bloomParams.w = settings.bloom.enableAlphaMask ? 1 : 0; // Prefilter pass
  736. var prefilterPass = ppl.addRenderPass(this._bloomWidths[0], this._bloomHeights[0], 'cc-bloom-prefilter');
  737. prefilterPass.addRenderTarget(this._bloomTexNames[0], LoadOp.CLEAR, StoreOp.STORE, this._clearColorTransparentBlack);
  738. prefilterPass.addTexture(radianceName, 'inputTexture');
  739. prefilterPass.setVec4('g_platform', pplConfigs.platform);
  740. prefilterPass.setVec4('bloomParams', this._bloomParams);
  741. prefilterPass.addQueue(QueueHint.OPAQUE).addFullscreenQuad(bloomMaterial, 0); // Downsample passes
  742. for (var _i2 = 1; _i2 !== sizeCount; ++_i2) {
  743. var downPass = ppl.addRenderPass(this._bloomWidths[_i2], this._bloomHeights[_i2], 'cc-bloom-downsample');
  744. downPass.addRenderTarget(this._bloomTexNames[_i2], LoadOp.CLEAR, StoreOp.STORE, this._clearColorTransparentBlack);
  745. downPass.addTexture(this._bloomTexNames[_i2 - 1], 'bloomTexture');
  746. this._bloomTexSize.x = this._bloomWidths[_i2 - 1];
  747. this._bloomTexSize.y = this._bloomHeights[_i2 - 1];
  748. downPass.setVec4('g_platform', pplConfigs.platform);
  749. downPass.setVec4('bloomTexSize', this._bloomTexSize);
  750. downPass.addQueue(QueueHint.OPAQUE).addFullscreenQuad(bloomMaterial, 1);
  751. } // Upsample passes
  752. for (var _i3 = iterations; _i3-- > 0;) {
  753. var upPass = ppl.addRenderPass(this._bloomWidths[_i3], this._bloomHeights[_i3], 'cc-bloom-upsample');
  754. upPass.addRenderTarget(this._bloomTexNames[_i3], LoadOp.CLEAR, StoreOp.STORE, this._clearColorTransparentBlack);
  755. upPass.addTexture(this._bloomTexNames[_i3 + 1], 'bloomTexture');
  756. this._bloomTexSize.x = this._bloomWidths[_i3 + 1];
  757. this._bloomTexSize.y = this._bloomHeights[_i3 + 1];
  758. upPass.setVec4('g_platform', pplConfigs.platform);
  759. upPass.setVec4('bloomTexSize', this._bloomTexSize);
  760. upPass.addQueue(QueueHint.OPAQUE).addFullscreenQuad(bloomMaterial, 2);
  761. } // Combine pass
  762. var combinePass = ppl.addRenderPass(width, height, 'cc-bloom-combine');
  763. combinePass.addRenderTarget(radianceName, LoadOp.LOAD, StoreOp.STORE);
  764. combinePass.addTexture(this._bloomTexNames[0], 'bloomTexture');
  765. combinePass.setVec4('g_platform', pplConfigs.platform);
  766. combinePass.setVec4('bloomParams', this._bloomParams);
  767. combinePass.addQueue(QueueHint.BLEND).addFullscreenQuad(bloomMaterial, 3);
  768. if (cameraConfigs.remainingPasses === 0) {
  769. return addCopyToScreenPass(ppl, pplConfigs, cameraConfigs, radianceName);
  770. } else {
  771. return combinePass;
  772. }
  773. }
  774. });
  775. _export("BuiltinToneMappingPassBuilder", BuiltinToneMappingPassBuilder = class BuiltinToneMappingPassBuilder {
  776. constructor() {
  777. this._colorGradingTexSize = new Vec2(0, 0);
  778. }
  779. getConfigOrder() {
  780. return 0;
  781. }
  782. getRenderOrder() {
  783. return 300;
  784. }
  785. configCamera(camera, pplConfigs, cameraConfigs) {
  786. var settings = cameraConfigs.settings;
  787. cameraConfigs.enableColorGrading = settings.colorGrading.enabled && !!settings.colorGrading.material && !!settings.colorGrading.colorGradingMap;
  788. cameraConfigs.enableToneMapping = cameraConfigs.enableHDR // From Half to RGBA8
  789. || cameraConfigs.enableColorGrading; // Color grading
  790. if (cameraConfigs.enableToneMapping) {
  791. ++cameraConfigs.remainingPasses;
  792. }
  793. }
  794. windowResize(ppl, pplConfigs, cameraConfigs) {
  795. if (cameraConfigs.enableColorGrading) {
  796. assert(!!cameraConfigs.settings.colorGrading.material);
  797. cameraConfigs.settings.colorGrading.material.setProperty('colorGradingMap', cameraConfigs.settings.colorGrading.colorGradingMap);
  798. }
  799. }
  800. setup(ppl, pplConfigs, cameraConfigs, camera, context, prevRenderPass) {
  801. if (!cameraConfigs.enableToneMapping) {
  802. return prevRenderPass;
  803. }
  804. --cameraConfigs.remainingPasses;
  805. assert(cameraConfigs.remainingPasses >= 0);
  806. if (cameraConfigs.remainingPasses === 0) {
  807. return this._addCopyAndTonemapPass(ppl, pplConfigs, cameraConfigs, cameraConfigs.width, cameraConfigs.height, context.colorName, cameraConfigs.colorName);
  808. } else {
  809. var id = cameraConfigs.renderWindowId;
  810. var ldrColorPrefix = cameraConfigs.enableShadingScale ? "ScaledLdrColor" : "LdrColor";
  811. var ldrColorName = getPingPongRenderTarget(context.colorName, ldrColorPrefix, id);
  812. var radianceName = context.colorName;
  813. context.colorName = ldrColorName;
  814. return this._addCopyAndTonemapPass(ppl, pplConfigs, cameraConfigs, cameraConfigs.width, cameraConfigs.height, radianceName, ldrColorName);
  815. }
  816. }
  817. _addCopyAndTonemapPass(ppl, pplConfigs, cameraConfigs, width, height, radianceName, colorName) {
  818. var pass;
  819. var settings = cameraConfigs.settings;
  820. if (cameraConfigs.enableColorGrading) {
  821. assert(!!settings.colorGrading.material);
  822. assert(!!settings.colorGrading.colorGradingMap);
  823. var lutTex = settings.colorGrading.colorGradingMap;
  824. this._colorGradingTexSize.x = lutTex.width;
  825. this._colorGradingTexSize.y = lutTex.height;
  826. var isSquareMap = lutTex.width === lutTex.height;
  827. if (isSquareMap) {
  828. pass = ppl.addRenderPass(width, height, 'cc-color-grading-8x8');
  829. } else {
  830. pass = ppl.addRenderPass(width, height, 'cc-color-grading-nx1');
  831. }
  832. pass.addRenderTarget(colorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  833. pass.addTexture(radianceName, 'sceneColorMap');
  834. pass.setVec4('g_platform', pplConfigs.platform);
  835. pass.setVec2('lutTextureSize', this._colorGradingTexSize);
  836. pass.setFloat('contribute', settings.colorGrading.contribute);
  837. pass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(settings.colorGrading.material, isSquareMap ? 1 : 0);
  838. } else {
  839. pass = ppl.addRenderPass(width, height, 'cc-tone-mapping');
  840. pass.addRenderTarget(colorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  841. pass.addTexture(radianceName, 'inputTexture');
  842. pass.setVec4('g_platform', pplConfigs.platform);
  843. if (settings.toneMapping.material) {
  844. pass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(settings.toneMapping.material, 0);
  845. } else {
  846. assert(!!cameraConfigs.copyAndTonemapMaterial);
  847. pass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(cameraConfigs.copyAndTonemapMaterial, 0);
  848. }
  849. }
  850. return pass;
  851. }
  852. });
  853. _export("BuiltinFXAAPassBuilder", BuiltinFXAAPassBuilder = class BuiltinFXAAPassBuilder {
  854. constructor() {
  855. // FXAA
  856. this._fxaaParams = new Vec4(0, 0, 0, 0);
  857. }
  858. getConfigOrder() {
  859. return 0;
  860. }
  861. getRenderOrder() {
  862. return 400;
  863. }
  864. configCamera(camera, pplConfigs, cameraConfigs) {
  865. cameraConfigs.enableFXAA = cameraConfigs.settings.fxaa.enabled && !!cameraConfigs.settings.fxaa.material;
  866. if (cameraConfigs.enableFXAA) {
  867. ++cameraConfigs.remainingPasses;
  868. }
  869. }
  870. setup(ppl, pplConfigs, cameraConfigs, camera, context, prevRenderPass) {
  871. if (!cameraConfigs.enableFXAA) {
  872. return prevRenderPass;
  873. }
  874. --cameraConfigs.remainingPasses;
  875. assert(cameraConfigs.remainingPasses >= 0);
  876. var id = cameraConfigs.renderWindowId;
  877. var ldrColorPrefix = cameraConfigs.enableShadingScale ? "ScaledLdrColor" : "LdrColor";
  878. var ldrColorName = getPingPongRenderTarget(context.colorName, ldrColorPrefix, id);
  879. assert(!!cameraConfigs.settings.fxaa.material);
  880. if (cameraConfigs.remainingPasses === 0) {
  881. if (cameraConfigs.enableShadingScale) {
  882. this._addFxaaPass(ppl, pplConfigs, cameraConfigs.settings.fxaa.material, cameraConfigs.width, cameraConfigs.height, context.colorName, ldrColorName);
  883. return addCopyToScreenPass(ppl, pplConfigs, cameraConfigs, ldrColorName);
  884. } else {
  885. assert(cameraConfigs.width === cameraConfigs.nativeWidth);
  886. assert(cameraConfigs.height === cameraConfigs.nativeHeight);
  887. return this._addFxaaPass(ppl, pplConfigs, cameraConfigs.settings.fxaa.material, cameraConfigs.width, cameraConfigs.height, context.colorName, cameraConfigs.colorName);
  888. }
  889. } else {
  890. var inputColorName = context.colorName;
  891. context.colorName = ldrColorName;
  892. var lastPass = this._addFxaaPass(ppl, pplConfigs, cameraConfigs.settings.fxaa.material, cameraConfigs.width, cameraConfigs.height, inputColorName, ldrColorName);
  893. return lastPass;
  894. }
  895. }
  896. _addFxaaPass(ppl, pplConfigs, fxaaMaterial, width, height, ldrColorName, colorName) {
  897. this._fxaaParams.x = width;
  898. this._fxaaParams.y = height;
  899. this._fxaaParams.z = 1 / width;
  900. this._fxaaParams.w = 1 / height;
  901. var pass = ppl.addRenderPass(width, height, 'cc-fxaa');
  902. pass.addRenderTarget(colorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  903. pass.addTexture(ldrColorName, 'sceneColorMap');
  904. pass.setVec4('g_platform', pplConfigs.platform);
  905. pass.setVec4('texSize', this._fxaaParams);
  906. pass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(fxaaMaterial, 0);
  907. return pass;
  908. }
  909. });
  910. _export("BuiltinFsrPassBuilder", BuiltinFsrPassBuilder = class BuiltinFsrPassBuilder {
  911. constructor() {
  912. // FSR
  913. this._fsrParams = new Vec4(0, 0, 0, 0);
  914. this._fsrTexSize = new Vec4(0, 0, 0, 0);
  915. }
  916. getConfigOrder() {
  917. return 0;
  918. }
  919. getRenderOrder() {
  920. return 500;
  921. }
  922. configCamera(camera, pplConfigs, cameraConfigs) {
  923. // FSR (Depend on Shading scale)
  924. cameraConfigs.enableFSR = cameraConfigs.settings.fsr.enabled && !!cameraConfigs.settings.fsr.material && cameraConfigs.enableShadingScale && cameraConfigs.shadingScale < 1.0;
  925. if (cameraConfigs.enableFSR) {
  926. ++cameraConfigs.remainingPasses;
  927. }
  928. }
  929. setup(ppl, pplConfigs, cameraConfigs, camera, context, prevRenderPass) {
  930. if (!cameraConfigs.enableFSR) {
  931. return prevRenderPass;
  932. }
  933. --cameraConfigs.remainingPasses;
  934. var inputColorName = context.colorName;
  935. var outputColorName = cameraConfigs.remainingPasses === 0 ? cameraConfigs.colorName : getPingPongRenderTarget(context.colorName, 'UiColor', cameraConfigs.renderWindowId);
  936. context.colorName = outputColorName;
  937. assert(!!cameraConfigs.settings.fsr.material);
  938. return this._addFsrPass(ppl, pplConfigs, cameraConfigs, cameraConfigs.settings, cameraConfigs.settings.fsr.material, cameraConfigs.renderWindowId, cameraConfigs.width, cameraConfigs.height, inputColorName, cameraConfigs.nativeWidth, cameraConfigs.nativeHeight, outputColorName);
  939. }
  940. _addFsrPass(ppl, pplConfigs, cameraConfigs, settings, fsrMaterial, id, width, height, inputColorName, nativeWidth, nativeHeight, outputColorName) {
  941. this._fsrTexSize.x = width;
  942. this._fsrTexSize.y = height;
  943. this._fsrTexSize.z = nativeWidth;
  944. this._fsrTexSize.w = nativeHeight;
  945. this._fsrParams.x = clamp(1.0 - settings.fsr.sharpness, 0.02, 0.98);
  946. var uiColorPrefix = 'UiColor';
  947. var fsrColorName = getPingPongRenderTarget(outputColorName, uiColorPrefix, id);
  948. var easuPass = ppl.addRenderPass(nativeWidth, nativeHeight, 'cc-fsr-easu');
  949. easuPass.addRenderTarget(fsrColorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  950. easuPass.addTexture(inputColorName, 'outputResultMap');
  951. easuPass.setVec4('g_platform', pplConfigs.platform);
  952. easuPass.setVec4('fsrTexSize', this._fsrTexSize);
  953. easuPass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(fsrMaterial, 0);
  954. var rcasPass = ppl.addRenderPass(nativeWidth, nativeHeight, 'cc-fsr-rcas');
  955. rcasPass.addRenderTarget(outputColorName, LoadOp.CLEAR, StoreOp.STORE, sClearColorTransparentBlack);
  956. rcasPass.addTexture(fsrColorName, 'outputResultMap');
  957. rcasPass.setVec4('g_platform', pplConfigs.platform);
  958. rcasPass.setVec4('fsrTexSize', this._fsrTexSize);
  959. rcasPass.setVec4('fsrParams', this._fsrParams);
  960. rcasPass.addQueue(rendering.QueueHint.OPAQUE).addFullscreenQuad(fsrMaterial, 1);
  961. return rcasPass;
  962. }
  963. });
  964. _export("BuiltinUiPassBuilder", BuiltinUiPassBuilder = class BuiltinUiPassBuilder {
  965. getConfigOrder() {
  966. return 0;
  967. }
  968. getRenderOrder() {
  969. return 1000;
  970. }
  971. setup(ppl, pplConfigs, cameraConfigs, camera, context, prevRenderPass) {
  972. assert(!!prevRenderPass);
  973. var flags = rendering.SceneFlags.UI;
  974. if (cameraConfigs.enableProfiler) {
  975. flags |= rendering.SceneFlags.PROFILER;
  976. prevRenderPass.showStatistics = true;
  977. }
  978. prevRenderPass.addQueue(rendering.QueueHint.BLEND, 'default', 'default').addScene(camera, flags);
  979. return prevRenderPass;
  980. }
  981. });
  982. if (rendering) {
  983. ({
  984. QueueHint,
  985. SceneFlags
  986. } = rendering);
  987. class BuiltinPipelineBuilder {
  988. constructor() {
  989. this._pipelineEvent = cclegacy.director.root.pipelineEvent;
  990. this._forwardPass = new BuiltinForwardPassBuilder();
  991. this._bloomPass = new BuiltinBloomPassBuilder();
  992. this._toneMappingPass = new BuiltinToneMappingPassBuilder();
  993. this._fxaaPass = new BuiltinFXAAPassBuilder();
  994. this._fsrPass = new BuiltinFsrPassBuilder();
  995. this._uiPass = new BuiltinUiPassBuilder();
  996. // Internal cached resources
  997. this._clearColor = new Color(0, 0, 0, 1);
  998. this._viewport = new Viewport();
  999. this._configs = new PipelineConfigs();
  1000. this._cameraConfigs = new CameraConfigs();
  1001. // Materials
  1002. this._copyAndTonemapMaterial = new Material();
  1003. // Internal States
  1004. this._initialized = false;
  1005. // TODO(zhouzhenglong): Make default effect asset loading earlier and remove this flag
  1006. this._passBuilders = [];
  1007. }
  1008. _setupPipelinePreview(camera, cameraConfigs) {
  1009. var isEditorView = camera.cameraUsage === CameraUsage.SCENE_VIEW || camera.cameraUsage === CameraUsage.PREVIEW;
  1010. if (isEditorView) {
  1011. var editorSettings = rendering.getEditorPipelineSettings();
  1012. if (editorSettings) {
  1013. cameraConfigs.settings = editorSettings;
  1014. } else {
  1015. cameraConfigs.settings = defaultSettings;
  1016. }
  1017. } else {
  1018. if (camera.pipelineSettings) {
  1019. cameraConfigs.settings = camera.pipelineSettings;
  1020. } else {
  1021. cameraConfigs.settings = defaultSettings;
  1022. }
  1023. }
  1024. }
  1025. _preparePipelinePasses(cameraConfigs) {
  1026. var passBuilders = this._passBuilders;
  1027. passBuilders.length = 0;
  1028. var settings = cameraConfigs.settings;
  1029. if (settings._passes) {
  1030. for (var pass of settings._passes) {
  1031. passBuilders.push(pass);
  1032. }
  1033. assert(passBuilders.length === settings._passes.length);
  1034. }
  1035. passBuilders.push(this._forwardPass);
  1036. if (settings.bloom.enabled) {
  1037. passBuilders.push(this._bloomPass);
  1038. }
  1039. passBuilders.push(this._toneMappingPass);
  1040. if (settings.fxaa.enabled) {
  1041. passBuilders.push(this._fxaaPass);
  1042. }
  1043. if (settings.fsr.enabled) {
  1044. passBuilders.push(this._fsrPass);
  1045. }
  1046. passBuilders.push(this._uiPass);
  1047. }
  1048. _setupBuiltinCameraConfigs(camera, pipelineConfigs, cameraConfigs) {
  1049. var window = camera.window;
  1050. var isMainGameWindow = camera.cameraUsage === CameraUsage.GAME && !!window.swapchain; // Window
  1051. cameraConfigs.isMainGameWindow = isMainGameWindow;
  1052. cameraConfigs.renderWindowId = window.renderWindowId; // Camera
  1053. cameraConfigs.colorName = window.colorName;
  1054. cameraConfigs.depthStencilName = window.depthStencilName; // Pipeline
  1055. cameraConfigs.enableFullPipeline = (camera.visibility & Layers.Enum.DEFAULT) !== 0;
  1056. cameraConfigs.enableProfiler = DEBUG && isMainGameWindow;
  1057. cameraConfigs.remainingPasses = 0; // Shading scale
  1058. cameraConfigs.shadingScale = cameraConfigs.settings.shadingScale;
  1059. cameraConfigs.enableShadingScale = cameraConfigs.settings.enableShadingScale && cameraConfigs.shadingScale !== 1.0;
  1060. cameraConfigs.nativeWidth = Math.max(Math.floor(window.width), 1);
  1061. cameraConfigs.nativeHeight = Math.max(Math.floor(window.height), 1);
  1062. cameraConfigs.width = cameraConfigs.enableShadingScale ? Math.max(Math.floor(cameraConfigs.nativeWidth * cameraConfigs.shadingScale), 1) : cameraConfigs.nativeWidth;
  1063. cameraConfigs.height = cameraConfigs.enableShadingScale ? Math.max(Math.floor(cameraConfigs.nativeHeight * cameraConfigs.shadingScale), 1) : cameraConfigs.nativeHeight; // Radiance
  1064. cameraConfigs.enableHDR = cameraConfigs.enableFullPipeline && pipelineConfigs.useFloatOutput;
  1065. cameraConfigs.radianceFormat = cameraConfigs.enableHDR ? gfx.Format.RGBA16F : gfx.Format.RGBA8; // Tone Mapping
  1066. cameraConfigs.copyAndTonemapMaterial = this._copyAndTonemapMaterial; // Depth
  1067. cameraConfigs.enableStoreSceneDepth = false;
  1068. }
  1069. _setupCameraConfigs(camera, pipelineConfigs, cameraConfigs) {
  1070. this._setupPipelinePreview(camera, cameraConfigs);
  1071. this._preparePipelinePasses(cameraConfigs);
  1072. sortPipelinePassBuildersByConfigOrder(this._passBuilders);
  1073. this._setupBuiltinCameraConfigs(camera, pipelineConfigs, cameraConfigs);
  1074. for (var builder of this._passBuilders) {
  1075. if (builder.configCamera) {
  1076. builder.configCamera(camera, pipelineConfigs, cameraConfigs);
  1077. }
  1078. }
  1079. } // ----------------------------------------------------------------
  1080. // Interface
  1081. // ----------------------------------------------------------------
  1082. windowResize(ppl, window, camera, nativeWidth, nativeHeight) {
  1083. setupPipelineConfigs(ppl, this._configs);
  1084. this._setupCameraConfigs(camera, this._configs, this._cameraConfigs); // Render Window (UI)
  1085. var id = window.renderWindowId;
  1086. ppl.addRenderWindow(this._cameraConfigs.colorName, Format.RGBA8, nativeWidth, nativeHeight, window, this._cameraConfigs.depthStencilName);
  1087. var width = this._cameraConfigs.width;
  1088. var height = this._cameraConfigs.height;
  1089. if (this._cameraConfigs.enableShadingScale) {
  1090. ppl.addDepthStencil("ScaledSceneDepth_" + id, Format.DEPTH_STENCIL, width, height);
  1091. ppl.addRenderTarget("ScaledRadiance0_" + id, this._cameraConfigs.radianceFormat, width, height);
  1092. ppl.addRenderTarget("ScaledRadiance1_" + id, this._cameraConfigs.radianceFormat, width, height);
  1093. ppl.addRenderTarget("ScaledLdrColor0_" + id, Format.RGBA8, width, height);
  1094. ppl.addRenderTarget("ScaledLdrColor1_" + id, Format.RGBA8, width, height);
  1095. } else {
  1096. ppl.addDepthStencil("SceneDepth_" + id, Format.DEPTH_STENCIL, width, height);
  1097. ppl.addRenderTarget("Radiance0_" + id, this._cameraConfigs.radianceFormat, width, height);
  1098. ppl.addRenderTarget("Radiance1_" + id, this._cameraConfigs.radianceFormat, width, height);
  1099. ppl.addRenderTarget("LdrColor0_" + id, Format.RGBA8, width, height);
  1100. ppl.addRenderTarget("LdrColor1_" + id, Format.RGBA8, width, height);
  1101. }
  1102. ppl.addRenderTarget("UiColor0_" + id, Format.RGBA8, nativeWidth, nativeHeight);
  1103. ppl.addRenderTarget("UiColor1_" + id, Format.RGBA8, nativeWidth, nativeHeight);
  1104. for (var builder of this._passBuilders) {
  1105. if (builder.windowResize) {
  1106. builder.windowResize(ppl, this._configs, this._cameraConfigs, window, camera, nativeWidth, nativeHeight);
  1107. }
  1108. }
  1109. }
  1110. setup(cameras, ppl) {
  1111. // TODO(zhouzhenglong): Make default effect asset loading earlier and remove _initMaterials
  1112. if (this._initMaterials(ppl)) {
  1113. return;
  1114. } // Render cameras
  1115. // log(`==================== One Frame ====================`);
  1116. for (var camera of cameras) {
  1117. // Skip invalid camera
  1118. if (!camera.scene || !camera.window) {
  1119. continue;
  1120. } // Setup camera configs
  1121. this._setupCameraConfigs(camera, this._configs, this._cameraConfigs); // log(`Setup camera: ${camera.node!.name}, window: ${camera.window.renderWindowId}, isFull: ${this._cameraConfigs.enableFullPipeline}, `
  1122. // + `size: ${camera.window.width}x${camera.window.height}`);
  1123. this._pipelineEvent.emit(PipelineEventType.RENDER_CAMERA_BEGIN, camera); // Build pipeline
  1124. if (this._cameraConfigs.enableFullPipeline) {
  1125. this._buildForwardPipeline(ppl, camera, camera.scene, this._passBuilders);
  1126. } else {
  1127. this._buildSimplePipeline(ppl, camera);
  1128. }
  1129. this._pipelineEvent.emit(PipelineEventType.RENDER_CAMERA_END, camera);
  1130. }
  1131. } // ----------------------------------------------------------------
  1132. // Pipelines
  1133. // ----------------------------------------------------------------
  1134. _buildSimplePipeline(ppl, camera) {
  1135. var width = Math.max(Math.floor(camera.window.width), 1);
  1136. var height = Math.max(Math.floor(camera.window.height), 1);
  1137. var colorName = this._cameraConfigs.colorName;
  1138. var depthStencilName = this._cameraConfigs.depthStencilName;
  1139. var viewport = camera.viewport; // Reduce C++/TS interop
  1140. this._viewport.left = Math.round(viewport.x * width);
  1141. this._viewport.top = Math.round(viewport.y * height); // Here we must use camera.viewport.width instead of camera.viewport.z, which
  1142. // is undefined on native platform. The same as camera.viewport.height.
  1143. this._viewport.width = Math.max(Math.round(viewport.width * width), 1);
  1144. this._viewport.height = Math.max(Math.round(viewport.height * height), 1);
  1145. var clearColor = camera.clearColor; // Reduce C++/TS interop
  1146. this._clearColor.x = clearColor.x;
  1147. this._clearColor.y = clearColor.y;
  1148. this._clearColor.z = clearColor.z;
  1149. this._clearColor.w = clearColor.w;
  1150. var pass = ppl.addRenderPass(width, height, 'default'); // bind output render target
  1151. if (forwardNeedClearColor(camera)) {
  1152. pass.addRenderTarget(colorName, LoadOp.CLEAR, StoreOp.STORE, this._clearColor);
  1153. } else {
  1154. pass.addRenderTarget(colorName, LoadOp.LOAD, StoreOp.STORE);
  1155. } // bind depth stencil buffer
  1156. if (camera.clearFlag & ClearFlagBit.DEPTH_STENCIL) {
  1157. pass.addDepthStencil(depthStencilName, LoadOp.CLEAR, StoreOp.DISCARD, camera.clearDepth, camera.clearStencil, camera.clearFlag & ClearFlagBit.DEPTH_STENCIL);
  1158. } else {
  1159. pass.addDepthStencil(depthStencilName, LoadOp.LOAD, StoreOp.DISCARD);
  1160. }
  1161. pass.setViewport(this._viewport); // The opaque queue is used for Reflection probe preview
  1162. pass.addQueue(QueueHint.OPAQUE).addScene(camera, SceneFlags.OPAQUE); // The blend queue is used for UI and Gizmos
  1163. var flags = SceneFlags.BLEND | SceneFlags.UI;
  1164. if (this._cameraConfigs.enableProfiler) {
  1165. flags |= SceneFlags.PROFILER;
  1166. pass.showStatistics = true;
  1167. }
  1168. pass.addQueue(QueueHint.BLEND).addScene(camera, flags);
  1169. }
  1170. _buildForwardPipeline(ppl, camera, scene, passBuilders) {
  1171. sortPipelinePassBuildersByRenderOrder(passBuilders);
  1172. var context = {
  1173. colorName: '',
  1174. depthStencilName: ''
  1175. };
  1176. var lastPass = undefined;
  1177. for (var builder of passBuilders) {
  1178. if (builder.setup) {
  1179. lastPass = builder.setup(ppl, this._configs, this._cameraConfigs, camera, context, lastPass);
  1180. }
  1181. }
  1182. assert(this._cameraConfigs.remainingPasses === 0);
  1183. }
  1184. _initMaterials(ppl) {
  1185. if (this._initialized) {
  1186. return 0;
  1187. }
  1188. setupPipelineConfigs(ppl, this._configs); // When add new effect asset, please add its uuid to the dependentAssets in cc.config.json.
  1189. this._copyAndTonemapMaterial._uuid = "builtin-pipeline-tone-mapping-material";
  1190. this._copyAndTonemapMaterial.initialize({
  1191. effectName: 'pipeline/post-process/tone-mapping'
  1192. });
  1193. if (this._copyAndTonemapMaterial.effectAsset) {
  1194. this._initialized = true;
  1195. }
  1196. return this._initialized ? 0 : 1;
  1197. }
  1198. }
  1199. rendering.setCustomPipeline('Builtin', new BuiltinPipelineBuilder());
  1200. } // if (rendering)
  1201. _cclegacy._RF.pop();
  1202. _crd = false;
  1203. }
  1204. };
  1205. });
  1206. //# sourceMappingURL=60dfea53e1c17502cf4f0661946a964ad3ff0296.js.map