SceneEffect.qml 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. // Copyright (C) 2022 The Qt Company Ltd.
  2. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
  3. import QtQuick
  4. import QtQuick3D
  5. import QtQuick3D.Helpers.impl
  6. MainSceneEffect {
  7. id: sceneEffect
  8. property int tonemapMode: SceneEnvironment.TonemapModeLinear
  9. property real exposure: 1.0
  10. property real white: 1.0
  11. property bool applyFXAA: false
  12. property bool ditheringEnabled: false
  13. property real sharpnessAmount: 0.0 // 0.0 - 1.0
  14. property bool colorAdjustmentsEnabled: false
  15. property real adjustmentBrightness: 1.0
  16. property real adjustmentContrast: 1.0
  17. property real adjustmentSaturation: 1.0
  18. // Lens Flare
  19. property bool lensFlareEnabled: false
  20. property real lensFlareBloomScale: 10 // 0 - 20
  21. property real lensFlareBloomBias: 0.95 // 0 - x (basically maximum color value)
  22. property real lensFlareGhostDispersal: 0.5 // 0 - 1
  23. property int lensFlareGhostCount: 4 // 0 - 20
  24. property real lensFlareHaloWidth: 0.25 // 0 - 1
  25. property real lensFlareStretchToAspect: 0.5 // 0 - 1
  26. property real lensFlareDistortion: 5 // 0.0 - 20.0
  27. property real lensFlareBlurAmount: 3 // 0.0 - 5.0
  28. property bool lensFlareApplyDirtTexture: false
  29. property bool lensFlareApplyStarburstTexture: false
  30. property vector3d lensFlareCameraDirection: Qt.vector3d(0, 0, -1)
  31. property bool lensFlareDebug: false
  32. property TextureInput lensColorTexture: TextureInput {
  33. id: lensColorTextureInput
  34. texture: defaultLensColorTexture
  35. }
  36. property alias lensColorTextureAlias: lensColorTextureInput.texture
  37. Texture {
  38. id: defaultLensColorTexture
  39. source: "qrc:/qtquick3d_helpers/images/gradientTexture.png"
  40. tilingModeHorizontal: Texture.ClampToEdge
  41. tilingModeVertical: Texture.ClampToEdge
  42. }
  43. property TextureInput lensDirtTexture: TextureInput {
  44. id: lensDirtTextureInput
  45. texture: defaultLensDirtTexture
  46. }
  47. property alias lensDirtTextureAlias: lensDirtTextureInput.texture
  48. Texture {
  49. id: defaultLensDirtTexture
  50. source: "qrc:/qtquick3d_helpers/images/lens_dirt_default.jpeg"
  51. }
  52. property TextureInput starburstTexture: TextureInput {
  53. id: lensStarburstTextureInput
  54. texture: defaultLensStarburstTexture
  55. }
  56. property alias starburstTextureAlias: lensStarburstTextureInput.texture
  57. Texture {
  58. id: defaultLensStarburstTexture
  59. source: "qrc:/qtquick3d_helpers/images/noiseTexture.png"
  60. }
  61. // Glow data
  62. readonly property bool isFirstPass: true
  63. property bool isGlowEnabled: false
  64. property bool glowQualityHigh: false
  65. property bool glowUseBicubicUpscale: false
  66. property real glowStrength : 1.0 // 0.0 - 2.0
  67. property real glowIntensity : 0.8 // 0.0 - 8.0
  68. property real glowBloom : 0.0 // 0.0 - 1.0
  69. property int glowBlendMode : 2 // Additive,Screen,Softlight,Replace
  70. property real glowHDRMaximumValue: 12.0 // 0.0 - 256.0
  71. property real glowHDRScale: 2.0 // 0.0 - 4.0
  72. property real glowHDRMinimumValue: 1.0 // 0.0 - 4.0
  73. property int glowLevel: 1 // 1 - 7
  74. // Color Grading (LUT)
  75. property bool enableLut: false
  76. property alias lutTextureAlias: lutTextureInput.texture
  77. property TextureInput lut: TextureInput {
  78. id: lutTextureInput
  79. texture: defaultLutTexture
  80. }
  81. property real lutSize: 16.0 // size of texture, textures are 3d in 2d, so width = lutSize * lutSize, height = lutSize
  82. property real lutFilterAlpha: 1.0 // 0.0 - 1.0
  83. Texture {
  84. id: defaultLutTexture
  85. source: "qrc:/qtquick3d_helpers/luts/identity.png"
  86. }
  87. // Vignette
  88. property bool vignetteEnabled: false
  89. property real vignetteStrength: 15 // 0 - 15
  90. property color vignetteColor: "gray"
  91. property real vignetteRadius: 0.35 // 0 - 5
  92. readonly property TextureInput glowBuffer1: TextureInput {
  93. texture: Texture {}
  94. }
  95. readonly property TextureInput glowBuffer2: TextureInput {
  96. texture: Texture {}
  97. }
  98. readonly property TextureInput glowBuffer3: TextureInput {
  99. texture: Texture {}
  100. }
  101. readonly property TextureInput glowBuffer4: TextureInput {
  102. texture: Texture {}
  103. }
  104. readonly property TextureInput glowBuffer5: TextureInput {
  105. texture: Texture {}
  106. }
  107. readonly property TextureInput glowBuffer6: TextureInput {
  108. texture: Texture {}
  109. }
  110. readonly property TextureInput glowBuffer7: TextureInput {
  111. texture: Texture {}
  112. }
  113. readonly property TextureInput lensFlareDownsampleBuffer: TextureInput {
  114. texture: Texture {}
  115. }
  116. readonly property TextureInput lensFlareFeaturesBuffer: TextureInput {
  117. texture: Texture {}
  118. }
  119. readonly property TextureInput lensFlareTexture: TextureInput {
  120. texture: Texture {}
  121. }
  122. Component.onCompleted: buildPasses()
  123. onIsGlowEnabledChanged: buildPasses()
  124. onLensFlareEnabledChanged: buildPasses()
  125. function buildPasses() {
  126. let passList = [];
  127. if (lensFlareEnabled) {
  128. passList.push(lensFlareDownsamplePass)
  129. passList.push(lensFlareFeaturesPass)
  130. passList.push(lensFlareBlurHorizontalPass)
  131. passList.push(lensFlareBlurVerticalPass)
  132. }
  133. if (isGlowEnabled) {
  134. passList.push(horizontalBlurPass1)
  135. passList.push(verticalBlurPass1)
  136. passList.push(horizontalBlurPass2)
  137. passList.push(verticalBlurPass2)
  138. passList.push(horizontalBlurPass3)
  139. passList.push(verticalBlurPass3)
  140. passList.push(horizontalBlurPass4)
  141. passList.push(verticalBlurPass4)
  142. passList.push(horizontalBlurPass5)
  143. passList.push(verticalBlurPass5)
  144. passList.push(horizontalBlurPass6)
  145. passList.push(verticalBlurPass6)
  146. passList.push(horizontalBlurPass7)
  147. passList.push(verticalBlurPass7)
  148. }
  149. passList.push(tonemapPass)
  150. tonemapPass.rebuildCommands();
  151. sceneEffect.passes = passList // qmllint disable read-only-property
  152. }
  153. Shader {
  154. id: tonemapperFrag
  155. stage: Shader.Fragment
  156. shader: "qrc:/qtquick3d_helpers/shaders/tonemapper.frag"
  157. }
  158. Shader {
  159. id: glowHorizontalBlur
  160. stage: Shader.Fragment
  161. shader: "qrc:/qtquick3d_helpers/shaders/glowhorizontalblur.frag"
  162. }
  163. Shader {
  164. id: glowVerticalBlur
  165. stage: Shader.Fragment
  166. shader: "qrc:/qtquick3d_helpers/shaders/glowverticalblur.frag"
  167. }
  168. Shader {
  169. id: lensFlareDownsample
  170. stage: Shader.Fragment
  171. shader: "qrc:/qtquick3d_helpers/shaders/lensflaredownsample.frag"
  172. }
  173. Shader {
  174. id: lensFlareFeatures
  175. stage: Shader.Fragment
  176. shader: "qrc:/qtquick3d_helpers/shaders/lensflarefeatures.frag"
  177. }
  178. Shader {
  179. id: lensFlareVerticalBlurVert
  180. stage: Shader.Vertex
  181. shader: "qrc:/qtquick3d_helpers/shaders/lensflareblurvertical.vert"
  182. }
  183. Shader {
  184. id: lensFlareHorizontalVert
  185. stage: Shader.Vertex
  186. shader: "qrc:/qtquick3d_helpers/shaders/lensflareblurhorizontal.vert"
  187. }
  188. Shader {
  189. id: lensFlareGaussianBlur
  190. stage: Shader.Fragment
  191. shader: "qrc:/qtquick3d_helpers/shaders/lensflaregaussianblur.frag"
  192. }
  193. Buffer {
  194. id: tempBuffer1
  195. name: "tempBuffer1"
  196. format: Buffer.RGBA16F
  197. textureFilterOperation: Buffer.Linear
  198. textureCoordOperation: Buffer.ClampToEdge
  199. bufferFlags: Buffer.None
  200. sizeMultiplier: 0.5
  201. }
  202. Buffer {
  203. id: tempBuffer2
  204. name: "tempBuffer2"
  205. format: Buffer.RGBA16F
  206. textureFilterOperation: Buffer.Linear
  207. textureCoordOperation: Buffer.ClampToEdge
  208. bufferFlags: Buffer.None
  209. sizeMultiplier: 0.25
  210. }
  211. Buffer {
  212. id: tempBuffer3
  213. name: "tempBuffer3"
  214. format: Buffer.RGBA16F
  215. textureFilterOperation: Buffer.Linear
  216. textureCoordOperation: Buffer.ClampToEdge
  217. bufferFlags: Buffer.None
  218. sizeMultiplier: 0.125
  219. }
  220. Buffer {
  221. id: tempBuffer4
  222. name: "tempBuffer4"
  223. format: Buffer.RGBA16F
  224. textureFilterOperation: Buffer.Linear
  225. textureCoordOperation: Buffer.ClampToEdge
  226. bufferFlags: Buffer.None
  227. sizeMultiplier: 0.0625
  228. }
  229. Buffer {
  230. id: tempBuffer5
  231. name: "tempBuffer5"
  232. format: Buffer.RGBA16F
  233. textureFilterOperation: Buffer.Linear
  234. textureCoordOperation: Buffer.ClampToEdge
  235. bufferFlags: Buffer.None
  236. sizeMultiplier: 0.03125
  237. }
  238. Buffer {
  239. id: tempBuffer6
  240. name: "tempBuffer6"
  241. format: Buffer.RGBA16F
  242. textureFilterOperation: Buffer.Linear
  243. textureCoordOperation: Buffer.ClampToEdge
  244. bufferFlags: Buffer.None
  245. sizeMultiplier: 0.015625
  246. }
  247. Buffer {
  248. id: tempBuffer7
  249. name: "tempBuffer7"
  250. format: Buffer.RGBA16F
  251. textureFilterOperation: Buffer.Linear
  252. textureCoordOperation: Buffer.ClampToEdge
  253. bufferFlags: Buffer.None
  254. sizeMultiplier: 0.0078125
  255. }
  256. Buffer {
  257. id: glowBuffer1
  258. name: "glowBuffer1"
  259. format: Buffer.RGBA16F
  260. textureFilterOperation: Buffer.Linear
  261. textureCoordOperation: Buffer.ClampToEdge
  262. bufferFlags: Buffer.None
  263. sizeMultiplier: 0.5
  264. }
  265. Buffer {
  266. id: glowBuffer2
  267. name: "glowBuffer2"
  268. format: Buffer.RGBA16F
  269. textureFilterOperation: Buffer.Linear
  270. textureCoordOperation: Buffer.ClampToEdge
  271. bufferFlags: Buffer.None
  272. sizeMultiplier: 0.25
  273. }
  274. Buffer {
  275. id: glowBuffer3
  276. name: "glowBuffer3"
  277. format: Buffer.RGBA16F
  278. textureFilterOperation: Buffer.Linear
  279. textureCoordOperation: Buffer.ClampToEdge
  280. bufferFlags: Buffer.None
  281. sizeMultiplier: 0.125
  282. }
  283. Buffer {
  284. id: glowBuffer4
  285. name: "glowBuffer4"
  286. format: Buffer.RGBA16F
  287. textureFilterOperation: Buffer.Linear
  288. textureCoordOperation: Buffer.ClampToEdge
  289. bufferFlags: Buffer.None
  290. sizeMultiplier: 0.0625
  291. }
  292. Buffer {
  293. id: glowBuffer5
  294. name: "glowBuffer5"
  295. format: Buffer.RGBA16F
  296. textureFilterOperation: Buffer.Linear
  297. textureCoordOperation: Buffer.ClampToEdge
  298. bufferFlags: Buffer.None
  299. sizeMultiplier: 0.03125
  300. }
  301. Buffer {
  302. id: glowBuffer6
  303. name: "glowBuffer6"
  304. format: Buffer.RGBA16F
  305. textureFilterOperation: Buffer.Linear
  306. textureCoordOperation: Buffer.ClampToEdge
  307. bufferFlags: Buffer.None
  308. sizeMultiplier: 0.015625
  309. }
  310. Buffer {
  311. id: glowBuffer7
  312. name: "glowBuffer7"
  313. format: Buffer.RGBA16F
  314. textureFilterOperation: Buffer.Linear
  315. textureCoordOperation: Buffer.ClampToEdge
  316. bufferFlags: Buffer.None
  317. sizeMultiplier: 0.0078125
  318. }
  319. Buffer {
  320. id: lensFlareDownsampleBuffer
  321. name: "lensFlareDownsampleBuffer"
  322. format: Buffer.RGBA16F
  323. textureFilterOperation: Buffer.Linear
  324. textureCoordOperation: Buffer.ClampToEdge
  325. bufferFlags: Buffer.None
  326. sizeMultiplier: 0.5
  327. }
  328. Buffer {
  329. id: lensFlareFeaturesBuffer
  330. name: "lensFlareFeaturesBuffer"
  331. format: Buffer.RGBA16F
  332. textureFilterOperation: Buffer.Linear
  333. textureCoordOperation: Buffer.ClampToEdge
  334. bufferFlags: Buffer.None
  335. sizeMultiplier: 0.5
  336. }
  337. Buffer {
  338. id: lensFlareBlurTempBuffer
  339. name: "lensFlareBlurTempBuffer"
  340. format: Buffer.RGBA16F
  341. textureFilterOperation: Buffer.Linear
  342. textureCoordOperation: Buffer.ClampToEdge
  343. bufferFlags: Buffer.None
  344. sizeMultiplier: 0.5
  345. }
  346. Buffer {
  347. id: lensFlareBlurBuffer
  348. name: "lensFlareBlurBuffer"
  349. format: Buffer.RGBA16F
  350. textureFilterOperation: Buffer.Linear
  351. textureCoordOperation: Buffer.ClampToEdge
  352. bufferFlags: Buffer.None
  353. sizeMultiplier: 0.5
  354. }
  355. Pass {
  356. id: horizontalBlurPass1
  357. shaders: [glowHorizontalBlur]
  358. commands: [
  359. SetUniformValue {
  360. target: "isFirstPass"
  361. value: true
  362. }
  363. ]
  364. output: tempBuffer1
  365. }
  366. Pass {
  367. id: verticalBlurPass1
  368. shaders: [glowVerticalBlur]
  369. commands: [
  370. SetUniformValue {
  371. target: "isFirstPass"
  372. value: false
  373. },
  374. BufferInput {
  375. buffer: tempBuffer1
  376. }
  377. ]
  378. output: glowBuffer1
  379. }
  380. Pass {
  381. id: horizontalBlurPass2
  382. shaders: [glowHorizontalBlur]
  383. commands: [
  384. SetUniformValue {
  385. target: "isFirstPass"
  386. value: false
  387. },
  388. BufferInput {
  389. buffer: glowBuffer1
  390. }
  391. ]
  392. output: tempBuffer2
  393. }
  394. Pass {
  395. id: verticalBlurPass2
  396. shaders: [glowVerticalBlur]
  397. commands: [
  398. SetUniformValue {
  399. target: "isFirstPass"
  400. value: false
  401. },
  402. BufferInput {
  403. buffer: tempBuffer2
  404. }
  405. ]
  406. output: glowBuffer2
  407. }
  408. Pass {
  409. id: horizontalBlurPass3
  410. shaders: [glowHorizontalBlur]
  411. commands: [
  412. SetUniformValue {
  413. target: "isFirstPass"
  414. value: false
  415. },
  416. BufferInput {
  417. buffer: glowBuffer2
  418. }
  419. ]
  420. output: tempBuffer3
  421. }
  422. Pass {
  423. id: verticalBlurPass3
  424. shaders: [glowVerticalBlur]
  425. commands: [
  426. SetUniformValue {
  427. target: "isFirstPass"
  428. value: false
  429. },
  430. BufferInput {
  431. buffer: tempBuffer3
  432. }
  433. ]
  434. output: glowBuffer3
  435. }
  436. Pass {
  437. id: horizontalBlurPass4
  438. shaders: [glowHorizontalBlur]
  439. commands: [
  440. SetUniformValue {
  441. target: "isFirstPass"
  442. value: false
  443. },
  444. BufferInput {
  445. buffer: glowBuffer3
  446. }
  447. ]
  448. output: tempBuffer4
  449. }
  450. Pass {
  451. id: verticalBlurPass4
  452. shaders: [glowVerticalBlur]
  453. commands: [
  454. SetUniformValue {
  455. target: "isFirstPass"
  456. value: false
  457. },
  458. BufferInput {
  459. buffer: tempBuffer4
  460. }
  461. ]
  462. output: glowBuffer4
  463. }
  464. Pass {
  465. id: horizontalBlurPass5
  466. shaders: [glowHorizontalBlur]
  467. commands: [
  468. SetUniformValue {
  469. target: "isFirstPass"
  470. value: false
  471. },
  472. BufferInput {
  473. buffer: glowBuffer4
  474. }
  475. ]
  476. output: tempBuffer5
  477. }
  478. Pass {
  479. id: verticalBlurPass5
  480. shaders: [glowVerticalBlur]
  481. commands: [
  482. SetUniformValue {
  483. target: "isFirstPass"
  484. value: false
  485. },
  486. BufferInput {
  487. buffer: tempBuffer5
  488. }
  489. ]
  490. output: glowBuffer5
  491. }
  492. Pass {
  493. id: horizontalBlurPass6
  494. shaders: [glowHorizontalBlur]
  495. commands: [
  496. SetUniformValue {
  497. target: "isFirstPass"
  498. value: false
  499. },
  500. BufferInput {
  501. buffer: glowBuffer5
  502. }
  503. ]
  504. output: tempBuffer6
  505. }
  506. Pass {
  507. id: verticalBlurPass6
  508. shaders: [glowVerticalBlur]
  509. commands: [
  510. SetUniformValue {
  511. target: "isFirstPass"
  512. value: false
  513. },
  514. BufferInput {
  515. buffer: tempBuffer6
  516. }
  517. ]
  518. output: glowBuffer6
  519. }
  520. Pass {
  521. id: horizontalBlurPass7
  522. shaders: [glowHorizontalBlur]
  523. commands: [
  524. SetUniformValue {
  525. target: "isFirstPass"
  526. value: false
  527. },
  528. BufferInput {
  529. buffer: glowBuffer6
  530. }
  531. ]
  532. output: tempBuffer7
  533. }
  534. Pass {
  535. id: verticalBlurPass7
  536. shaders: [glowVerticalBlur]
  537. commands: [
  538. SetUniformValue {
  539. target: "isFirstPass"
  540. value: false
  541. },
  542. BufferInput {
  543. buffer: tempBuffer7
  544. }
  545. ]
  546. output: glowBuffer7
  547. }
  548. Pass {
  549. id: lensFlareDownsamplePass
  550. shaders: [lensFlareDownsample]
  551. output: lensFlareDownsampleBuffer
  552. }
  553. Pass {
  554. id: lensFlareFeaturesPass
  555. shaders: [lensFlareFeatures]
  556. commands: [
  557. BufferInput {
  558. buffer: lensFlareDownsampleBuffer
  559. sampler: "lensFlareDownsampleBuffer"
  560. }
  561. ]
  562. output: lensFlareFeaturesBuffer
  563. }
  564. Pass {
  565. id: lensFlareBlurHorizontalPass
  566. shaders: [lensFlareHorizontalVert, lensFlareGaussianBlur]
  567. commands: [
  568. BufferInput {
  569. buffer: lensFlareFeaturesBuffer
  570. sampler: "lensFlareTexture"
  571. }
  572. ]
  573. output: lensFlareBlurTempBuffer
  574. }
  575. Pass {
  576. id: lensFlareBlurVerticalPass
  577. shaders: [lensFlareVerticalBlurVert, lensFlareGaussianBlur]
  578. commands: [
  579. BufferInput {
  580. buffer: lensFlareBlurTempBuffer
  581. sampler: "lensFlareTexture"
  582. }
  583. ]
  584. output: lensFlareBlurBuffer
  585. }
  586. Connections {
  587. target: sceneEffect
  588. function onIsGlowEnabledChanged() { tonemapPass.rebuildCommands() }
  589. function onLensFlareEnabledChanged() { tonemapPass.rebuildCommands() }
  590. }
  591. BufferInput {
  592. id: glowBufferInput1
  593. buffer: glowBuffer1
  594. sampler: "glowBuffer1"
  595. }
  596. BufferInput {
  597. id: glowBufferInput2
  598. buffer: glowBuffer2
  599. sampler: "glowBuffer2"
  600. }
  601. BufferInput {
  602. id: glowBufferInput3
  603. buffer: glowBuffer3
  604. sampler: "glowBuffer3"
  605. }
  606. BufferInput {
  607. id: glowBufferInput4
  608. buffer: glowBuffer4
  609. sampler: "glowBuffer4"
  610. }
  611. BufferInput {
  612. id: glowBufferInput5
  613. buffer: glowBuffer5
  614. sampler: "glowBuffer5"
  615. }
  616. BufferInput {
  617. id: glowBufferInput6
  618. buffer: glowBuffer6
  619. sampler: "glowBuffer6"
  620. }
  621. BufferInput {
  622. id: glowBufferInput7
  623. buffer: glowBuffer7
  624. sampler: "glowBuffer7"
  625. }
  626. BufferInput {
  627. id: lensFlareBufferInput
  628. buffer: lensFlareBlurBuffer
  629. sampler: "lensFlareTexture"
  630. }
  631. Pass {
  632. id: tonemapPass;
  633. shaders: [tonemapperFrag]
  634. function rebuildCommands() {
  635. let dynamicCommands = []
  636. if (sceneEffect.isGlowEnabled) {
  637. dynamicCommands.push(glowBufferInput1)
  638. dynamicCommands.push(glowBufferInput2)
  639. dynamicCommands.push(glowBufferInput3)
  640. dynamicCommands.push(glowBufferInput4)
  641. dynamicCommands.push(glowBufferInput5)
  642. dynamicCommands.push(glowBufferInput6)
  643. dynamicCommands.push(glowBufferInput7)
  644. }
  645. if (sceneEffect.lensFlareEnabled) {
  646. dynamicCommands.push(lensFlareBufferInput)
  647. }
  648. tonemapPass.commands = dynamicCommands; // qmllint disable read-only-property
  649. }
  650. }
  651. }