RenderPathDeferred.hx 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972
  1. package arm.renderpath;
  2. import iron.RenderPath;
  3. import armory.renderpath.Inc;
  4. class RenderPathDeferred {
  5. #if (rp_renderer == "Deferred")
  6. static var path:RenderPath;
  7. #if (rp_gi != "Off")
  8. static var voxels = "voxels";
  9. static var voxelsLast = "voxels";
  10. #end
  11. public static function init(_path:RenderPath) {
  12. path = _path;
  13. #if (rp_shadowmap && kha_webgl)
  14. Inc.initEmpty();
  15. #end
  16. #if (rp_background == "World")
  17. {
  18. path.loadShader("shader_datas/world_pass/world_pass");
  19. }
  20. #end
  21. #if (rp_translucency)
  22. {
  23. Inc.initTranslucency();
  24. }
  25. #end
  26. #if (rp_gi != "Off")
  27. {
  28. Inc.initGI();
  29. #if arm_voxelgi_temporal
  30. {
  31. Inc.initGI("voxelsB");
  32. }
  33. #end
  34. #if cpp
  35. #if (rp_gi == "Voxel GI")
  36. {
  37. Inc.initGI("voxelsOpac");
  38. Inc.initGI("voxelsNor");
  39. }
  40. #end
  41. #end //cpp
  42. }
  43. #end
  44. {
  45. path.createDepthBuffer("main", "DEPTH24");
  46. var t = new RenderTargetRaw();
  47. t.name = "tex";
  48. t.width = 0;
  49. t.height = 0;
  50. t.displayp = Inc.getDisplayp();
  51. t.format = Inc.getHdrFormat();
  52. var ss = Inc.getSuperSampling();
  53. if (ss != 1) t.scale = ss;
  54. t.depth_buffer = "main";
  55. #if rp_autoexposure
  56. t.mipmaps = true;
  57. #end
  58. path.createRenderTarget(t);
  59. #if rp_autoexposure
  60. // Texture lod is fetched manually, prevent mipmap filtering
  61. t.mipmaps = false;
  62. #end
  63. }
  64. {
  65. var t = new RenderTargetRaw();
  66. t.name = "buf";
  67. t.width = 0;
  68. t.height = 0;
  69. t.displayp = Inc.getDisplayp();
  70. t.format = Inc.getHdrFormat();
  71. var ss = Inc.getSuperSampling();
  72. if (ss != 1) t.scale = ss;
  73. path.createRenderTarget(t);
  74. }
  75. {
  76. path.createDepthBuffer("main", "DEPTH24");
  77. var t = new RenderTargetRaw();
  78. t.name = "gbuffer0";
  79. t.width = 0;
  80. t.height = 0;
  81. t.displayp = Inc.getDisplayp();
  82. t.format = "RGBA64";
  83. var ss = Inc.getSuperSampling();
  84. if (ss != 1) t.scale = ss;
  85. t.depth_buffer = "main";
  86. path.createRenderTarget(t);
  87. }
  88. {
  89. var t = new RenderTargetRaw();
  90. t.name = "gbuffer1";
  91. t.width = 0;
  92. t.height = 0;
  93. t.displayp = Inc.getDisplayp();
  94. t.format = "RGBA64";
  95. var ss = Inc.getSuperSampling();
  96. if (ss != 1) t.scale = ss;
  97. path.createRenderTarget(t);
  98. }
  99. #if arm_veloc
  100. {
  101. var t = new RenderTargetRaw();
  102. t.name = "gbuffer2";
  103. t.width = 0;
  104. t.height = 0;
  105. t.displayp = Inc.getDisplayp();
  106. t.format = "RGBA64";
  107. var ss = Inc.getSuperSampling();
  108. if (ss != 1) t.scale = ss;
  109. path.createRenderTarget(t);
  110. }
  111. {
  112. var t = new RenderTargetRaw();
  113. t.name = "taa";
  114. t.width = 0;
  115. t.height = 0;
  116. t.displayp = Inc.getDisplayp();
  117. t.format = "RGBA32";
  118. var ss = Inc.getSuperSampling();
  119. if (ss != 1) t.scale = ss;
  120. path.createRenderTarget(t);
  121. }
  122. #end
  123. path.loadShader("shader_datas/deferred_indirect/deferred_indirect");
  124. path.loadShader("shader_datas/deferred_light/deferred_light");
  125. path.loadShader("shader_datas/deferred_light_quad/deferred_light_quad");
  126. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  127. {
  128. path.loadShader("shader_datas/ssgi_pass/ssgi_pass");
  129. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  130. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  131. }
  132. #elseif (rp_ssgi == "SSAO")
  133. {
  134. path.loadShader("shader_datas/ssao_pass/ssao_pass");
  135. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  136. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  137. }
  138. #end
  139. #if ((rp_ssgi != "Off") || (rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  140. {
  141. var t = new RenderTargetRaw();
  142. t.name = "bufa";
  143. t.width = 0;
  144. t.height = 0;
  145. t.displayp = Inc.getDisplayp();
  146. t.format = "RGBA32";
  147. var ss = Inc.getSuperSampling();
  148. if (ss != 1) t.scale = ss;
  149. path.createRenderTarget(t);
  150. }
  151. {
  152. var t = new RenderTargetRaw();
  153. t.name = "bufb";
  154. t.width = 0;
  155. t.height = 0;
  156. t.displayp = Inc.getDisplayp();
  157. t.format = "RGBA32";
  158. var ss = Inc.getSuperSampling();
  159. if (ss != 1) t.scale = ss;
  160. path.createRenderTarget(t);
  161. }
  162. #end
  163. #if rp_rendercapture
  164. {
  165. var t = new RenderTargetRaw();
  166. t.name = "capture";
  167. t.width = 0;
  168. t.height = 0;
  169. t.format = getRenderCaptureFormat();
  170. path.createRenderTarget(t);
  171. }
  172. #end
  173. #if rp_compositornodes
  174. {
  175. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  176. }
  177. #end
  178. #if ((!rp_compositornodes) || (rp_antialiasing == "TAA") || (rp_rendercapture) || (rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  179. {
  180. path.loadShader("shader_datas/copy_pass/copy_pass");
  181. }
  182. #end
  183. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  184. {
  185. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  186. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  187. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  188. #if (rp_antialiasing == "TAA")
  189. {
  190. path.loadShader("shader_datas/taa_pass/taa_pass");
  191. }
  192. #end
  193. }
  194. #end
  195. #if (rp_supersampling == 4)
  196. {
  197. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  198. }
  199. #end
  200. #if rp_volumetriclight
  201. {
  202. path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  203. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  204. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  205. path.loadShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  206. {
  207. var t = new RenderTargetRaw();
  208. t.name = "bufvola";
  209. t.width = 0;
  210. t.height = 0;
  211. t.displayp = Inc.getDisplayp();
  212. t.format = "R8";
  213. var ss = Inc.getSuperSampling();
  214. if (ss != 1) t.scale = ss;
  215. // t.scale = 0.5;
  216. path.createRenderTarget(t);
  217. }
  218. {
  219. var t = new RenderTargetRaw();
  220. t.name = "bufvolb";
  221. t.width = 0;
  222. t.height = 0;
  223. t.displayp = Inc.getDisplayp();
  224. t.format = "R8";
  225. var ss = Inc.getSuperSampling();
  226. if (ss != 1) t.scale = ss;
  227. // t.scale = 0.5;
  228. path.createRenderTarget(t);
  229. }
  230. }
  231. #end
  232. #if rp_ocean
  233. {
  234. path.loadShader("shader_datas/water_pass/water_pass");
  235. }
  236. #end
  237. #if rp_bloom
  238. {
  239. var t = new RenderTargetRaw();
  240. t.name = "bloomtex";
  241. t.width = 0;
  242. t.height = 0;
  243. t.scale = 0.25;
  244. t.format = Inc.getHdrFormat();
  245. path.createRenderTarget(t);
  246. }
  247. {
  248. var t = new RenderTargetRaw();
  249. t.name = "bloomtex2";
  250. t.width = 0;
  251. t.height = 0;
  252. t.scale = 0.25;
  253. t.format = Inc.getHdrFormat();
  254. path.createRenderTarget(t);
  255. }
  256. {
  257. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  258. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  259. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  260. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  261. }
  262. #end
  263. #if rp_sss
  264. {
  265. path.loadShader("shader_datas/sss_pass/sss_pass_x");
  266. path.loadShader("shader_datas/sss_pass/sss_pass_y");
  267. }
  268. #end
  269. #if rp_ssr
  270. {
  271. path.loadShader("shader_datas/ssr_pass/ssr_pass");
  272. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  273. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  274. #if rp_ssr_half
  275. {
  276. var t = new RenderTargetRaw();
  277. t.name = "ssra";
  278. t.width = 0;
  279. t.height = 0;
  280. t.scale = 0.5;
  281. t.format = Inc.getHdrFormat();
  282. path.createRenderTarget(t);
  283. }
  284. {
  285. var t = new RenderTargetRaw();
  286. t.name = "ssrb";
  287. t.width = 0;
  288. t.height = 0;
  289. t.scale = 0.5;
  290. t.format = Inc.getHdrFormat();
  291. path.createRenderTarget(t);
  292. }
  293. #end
  294. }
  295. #end
  296. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  297. {
  298. #if (rp_motionblur == "Camera")
  299. {
  300. path.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
  301. }
  302. #else
  303. {
  304. path.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  305. }
  306. #end
  307. }
  308. #end
  309. #if rp_soft_shadows
  310. {
  311. path.loadShader("shader_datas/dilate_pass/dilate_pass_x");
  312. path.loadShader("shader_datas/dilate_pass/dilate_pass_y");
  313. path.loadShader("shader_datas/visibility_pass/visibility_pass");
  314. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_x");
  315. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_y");
  316. {
  317. var t = new RenderTargetRaw();
  318. t.name = "visa";
  319. t.width = 0;
  320. t.height = 0;
  321. t.format = 'R16';
  322. path.createRenderTarget(t);
  323. }
  324. {
  325. var t = new RenderTargetRaw();
  326. t.name = "visb";
  327. t.width = 0;
  328. t.height = 0;
  329. t.format = 'R16';
  330. path.createRenderTarget(t);
  331. }
  332. {
  333. var t = new RenderTargetRaw();
  334. t.name = "dist";
  335. t.width = 0;
  336. t.height = 0;
  337. t.format = 'R16';
  338. path.createRenderTarget(t);
  339. }
  340. }
  341. #end
  342. // Paint
  343. {
  344. path.createDepthBuffer("paintdb", "DEPTH16");
  345. }
  346. var w = 1;
  347. for (i in 0...8)
  348. {
  349. var t = new RenderTargetRaw();
  350. t.name = "texpaint_colorid" + i;
  351. t.width = w;
  352. t.height = w;
  353. t.format = 'RGBA32';
  354. path.createRenderTarget(t);
  355. w *= 2;
  356. }
  357. path.loadShader("shader_datas/max_luminance_pass/max_luminance_pass");
  358. //
  359. }
  360. // Paint
  361. static var initVoxels = true;
  362. //
  363. @:access(iron.RenderPath)
  364. public static function commands() {
  365. if (arm.UITrait.inst.redraw()) { //
  366. // Paint
  367. var tid = arm.UITrait.inst.selectedLayer.id;
  368. if (arm.UITrait.inst.depthDirty()) {
  369. path.setTarget("texpaint" + tid);
  370. path.clearTarget(null, 1.0);
  371. path.drawMeshes("depth"); // TODO: CHECK DEPTH EXPORT
  372. }
  373. if (arm.UITrait.inst.paintDirty()) {
  374. if (arm.UITrait.inst.brushType == 4) { // Pick Color Id
  375. path.setTarget("texpaint_colorid7");
  376. path.clearTarget(0xff000000);
  377. path.bindTarget("_paintdb", "paintdb");
  378. path.drawMeshes("paint");
  379. // Extract picked color to 1x1 texture
  380. for (i in 0...7) {
  381. var j = 7 - i;
  382. path.setTarget("texpaint_colorid" + (j - 1));
  383. path.bindTarget("texpaint_colorid" + j, "tex");
  384. path.drawShader("shader_datas/max_luminance_pass/max_luminance_pass");
  385. }
  386. }
  387. else {
  388. if (arm.UITrait.inst.brushType == 3) { // Bake AO
  389. if (initVoxels) {
  390. initVoxels = false;
  391. var t = new RenderTargetRaw();
  392. t.name = "voxels";
  393. t.format = "R8";
  394. t.width = 256;
  395. t.height = 256;
  396. t.depth = 256;
  397. t.is_image = true;
  398. t.mipmaps = true;
  399. path.createRenderTarget(t);
  400. }
  401. path.clearImage("voxels", 0x00000000);
  402. path.setTarget("");
  403. path.setViewport(256, 256);
  404. path.bindTarget("voxels", "voxels");
  405. path.drawMeshes("voxel");
  406. path.generateMipmaps("voxels");
  407. }
  408. path.setTarget("texpaint" + tid, ["texpaint_nor" + tid, "texpaint_pack" + tid]);
  409. path.bindTarget("_paintdb", "paintdb");
  410. if (arm.UITrait.inst.brushType == 3) { // Bake AO
  411. path.bindTarget("voxels", "voxels");
  412. }
  413. if (arm.UITrait.inst.colorIdPicked) {
  414. path.bindTarget("texpaint_colorid0", "texpaint_colorid0");
  415. }
  416. path.drawMeshes("paint");
  417. }
  418. }
  419. //
  420. #if rp_dynres
  421. {
  422. DynamicResolutionScale.run(path);
  423. }
  424. #end
  425. #if arm_veloc
  426. {
  427. path.setTarget("gbuffer2");
  428. path.clearTarget(0xff000000);
  429. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  430. }
  431. #else
  432. {
  433. path.setTarget("gbuffer0", ["gbuffer1"]);
  434. }
  435. #end
  436. #if (rp_background == "Clear")
  437. {
  438. path.clearTarget(-1, 1.0);
  439. }
  440. #else
  441. {
  442. if (!UITrait.drawWorld) { //
  443. path.clearTarget(UITrait.worldColor, 1.0);//
  444. } //
  445. else { //
  446. path.clearTarget(null, 1.0);
  447. } //
  448. }
  449. #end
  450. // Paint
  451. tid = arm.UITrait.inst.layers[0].id;
  452. path.bindTarget("texpaint" + tid, "texpaint");
  453. path.bindTarget("texpaint_nor" + tid, "texpaint_nor");
  454. path.bindTarget("texpaint_pack" + tid, "texpaint_pack");
  455. if (arm.UITrait.inst.layers.length > 1) {
  456. tid = arm.UITrait.inst.layers[1].id;
  457. path.bindTarget("texpaint" + tid, "texpaint1");
  458. path.bindTarget("texpaint_nor" + tid, "texpaint_nor1");
  459. path.bindTarget("texpaint_pack" + tid, "texpaint_pack1");
  460. }
  461. //
  462. path.drawMeshes("mesh");
  463. #if rp_decals
  464. {
  465. // path.setTarget("gbuffer0", ["gbuffer1"]);
  466. path.bindTarget("_main", "gbufferD");
  467. path.drawDecals("decal");
  468. }
  469. #end
  470. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  471. {
  472. path.setTarget("bufa");
  473. path.bindTarget("_main", "gbufferD");
  474. path.bindTarget("gbuffer0", "gbuffer0");
  475. #if (rp_ssgi == "RTGI")
  476. path.bindTarget("gbuffer1", "gbuffer1");
  477. #end
  478. path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
  479. path.setTarget("bufb");
  480. path.bindTarget("gbuffer0", "gbuffer0");
  481. path.bindTarget("bufa", "tex");
  482. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  483. path.setTarget("bufa");
  484. path.bindTarget("gbuffer0", "gbuffer0");
  485. path.bindTarget("bufb", "tex");
  486. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  487. }
  488. #elseif (rp_ssgi == "SSAO")
  489. {
  490. path.setTarget("bufa");
  491. path.bindTarget("_main", "gbufferD");
  492. path.bindTarget("gbuffer0", "gbuffer0");
  493. path.drawShader("shader_datas/ssao_pass/ssao_pass");
  494. path.setTarget("bufb");
  495. path.bindTarget("bufa", "tex");
  496. path.bindTarget("gbuffer0", "gbuffer0");
  497. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  498. path.setTarget("bufa");
  499. path.bindTarget("bufb", "tex");
  500. path.bindTarget("gbuffer0", "gbuffer0");
  501. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  502. }
  503. #end
  504. // Voxels
  505. #if (rp_gi != "Off")
  506. {
  507. var voxelize = path.voxelize();
  508. #if arm_voxelgi_temporal
  509. voxelize = ++RenderPathCreator.voxelFrame % RenderPathCreator.voxelFreq == 0;
  510. if (voxelize) {
  511. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  512. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  513. }
  514. #end
  515. #if cpp
  516. if (voxelize) {
  517. var res = Inc.getVoxelRes();
  518. #if (rp_gi == "Voxel GI")
  519. var voxtex = "voxelsOpac";
  520. #else
  521. var voxtex = voxels;
  522. #end
  523. path.clearImage(voxtex, 0x00000000);
  524. path.setTarget("");
  525. path.setViewport(res, res);
  526. path.bindTarget(voxtex, "voxels");
  527. path.drawMeshes("voxel");
  528. #if (rp_gi == "Voxel GI")
  529. Inc.computeVoxels();
  530. #if (rp_gi_bounces)
  531. voxels = "voxelsOpac";
  532. #end
  533. #else
  534. path.generateMipmaps(voxels);
  535. #end
  536. }
  537. #else
  538. if (voxelize) {
  539. path.clearImage(voxels, 0x00000000);
  540. path.setTarget("");
  541. var res = Inc.getVoxelRes();
  542. path.setViewport(res, res);
  543. path.bindTarget(voxels, "voxels");
  544. #if ((rp_shadowmap) && (rp_gi == "Voxel GI"))
  545. {
  546. Inc.bindShadowMap();
  547. }
  548. #end
  549. path.drawMeshes("voxel");
  550. path.generateMipmaps(voxels);
  551. }
  552. #end //cpp
  553. }
  554. #end
  555. // Indirect
  556. path.setTarget("tex");
  557. // path.bindTarget("_main", "gbufferD");
  558. path.bindTarget("gbuffer0", "gbuffer0");
  559. path.bindTarget("gbuffer1", "gbuffer1");
  560. #if (rp_ssgi != "Off")
  561. {
  562. path.bindTarget("bufa", "ssaotex");
  563. }
  564. #end
  565. #if (rp_gi != "Off")
  566. {
  567. path.bindTarget(voxels, "voxels");
  568. #if arm_voxelgi_temporal
  569. {
  570. path.bindTarget(voxelsLast, "voxelsLast");
  571. }
  572. #end
  573. }
  574. #end
  575. path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
  576. // Direct
  577. var lamps = iron.Scene.active.lamps;
  578. for (i in 0...lamps.length) {
  579. var l = lamps[i];
  580. if (!l.visible) continue;
  581. path.currentLampIndex = i;
  582. #if (rp_shadowmap)
  583. {
  584. if (path.lampCastShadow()) {
  585. Inc.drawShadowMap(l);
  586. }
  587. }
  588. #end
  589. path.setTarget("tex");
  590. // path.bindTarget("_main", "gbufferD");
  591. path.bindTarget("gbuffer0", "gbuffer0");
  592. path.bindTarget("gbuffer1", "gbuffer1");
  593. #if rp_shadowmap
  594. {
  595. if (path.lampCastShadow()) {
  596. #if rp_soft_shadows
  597. path.bindTarget("visa", "svisibility");
  598. #else
  599. Inc.bindShadowMap();
  600. #end
  601. }
  602. }
  603. #end
  604. #if ((rp_voxelgi_shadows) || (rp_voxelgi_refraction))
  605. {
  606. path.bindTarget(voxels, "voxels");
  607. }
  608. #end
  609. if (path.lampIsSun()) {
  610. path.drawShader("shader_datas/deferred_light_quad/deferred_light_quad");
  611. }
  612. else {
  613. path.drawLampVolume("shader_datas/deferred_light/deferred_light");
  614. }
  615. #if rp_volumetriclight
  616. {
  617. path.setTarget("bufvola");
  618. path.bindTarget("_main", "gbufferD");
  619. Inc.bindShadowMap();
  620. if (path.lampIsSun()) {
  621. path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  622. }
  623. else {
  624. path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
  625. }
  626. path.setTarget("bufvolb");
  627. path.bindTarget("bufvola", "tex");
  628. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  629. path.setTarget("tex");
  630. path.bindTarget("bufvolb", "tex");
  631. path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  632. }
  633. #end
  634. }
  635. path.currentLampIndex = 0;
  636. #if (rp_background == "World")
  637. {
  638. if (UITrait.drawWorld) { //
  639. path.drawSkydome("shader_datas/world_pass/world_pass");
  640. } //
  641. }
  642. #end
  643. #if rp_ocean
  644. {
  645. path.setTarget("tex");
  646. path.bindTarget("_main", "gbufferD");
  647. path.drawShader("shader_datas/water_pass/water_pass");
  648. }
  649. #end
  650. #if rp_blending
  651. {
  652. path.drawMeshes("blend");
  653. }
  654. #end
  655. #if rp_translucency
  656. {
  657. var hasLamp = iron.Scene.active.lamps.length > 0;
  658. if (hasLamp) Inc.drawTranslucency("tex");
  659. }
  660. #end
  661. #if rp_bloom
  662. {
  663. path.setTarget("bloomtex");
  664. path.bindTarget("tex", "tex");
  665. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  666. path.setTarget("bloomtex2");
  667. path.bindTarget("bloomtex", "tex");
  668. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  669. path.setTarget("bloomtex");
  670. path.bindTarget("bloomtex2", "tex");
  671. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  672. path.setTarget("bloomtex2");
  673. path.bindTarget("bloomtex", "tex");
  674. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  675. path.setTarget("bloomtex");
  676. path.bindTarget("bloomtex2", "tex");
  677. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  678. path.setTarget("bloomtex2");
  679. path.bindTarget("bloomtex", "tex");
  680. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  681. path.setTarget("bloomtex");
  682. path.bindTarget("bloomtex2", "tex");
  683. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  684. path.setTarget("bloomtex2");
  685. path.bindTarget("bloomtex", "tex");
  686. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  687. path.setTarget("tex");
  688. path.bindTarget("bloomtex2", "tex");
  689. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  690. }
  691. #end
  692. #if rp_sss
  693. {
  694. path.setTarget("buf");
  695. path.bindTarget("tex", "tex");
  696. path.bindTarget("_main", "gbufferD");
  697. path.bindTarget("gbuffer1", "gbuffer1");
  698. path.drawShader("shader_datas/sss_pass/sss_pass_x");
  699. path.setTarget("tex");
  700. // TODO: can not bind tex
  701. path.bindTarget("tex", "tex");
  702. path.bindTarget("_main", "gbufferD");
  703. path.bindTarget("gbuffer1", "gbuffer1");
  704. path.drawShader("shader_datas/sss_pass/sss_pass_y");
  705. }
  706. #end
  707. #if rp_ssr
  708. {
  709. #if rp_ssr_half
  710. var targeta = "ssra";
  711. var targetb = "ssrb";
  712. #else
  713. var targeta = "buf";
  714. var targetb = "gbuffer1";
  715. #end
  716. path.setTarget(targeta);
  717. path.bindTarget("tex", "tex");
  718. path.bindTarget("_main", "gbufferD");
  719. path.bindTarget("gbuffer0", "gbuffer0");
  720. path.drawShader("shader_datas/ssr_pass/ssr_pass");
  721. path.setTarget(targetb);
  722. path.bindTarget(targeta, "tex");
  723. path.bindTarget("gbuffer0", "gbuffer0");
  724. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  725. path.setTarget("tex");
  726. path.bindTarget(targetb, "tex");
  727. path.bindTarget("gbuffer0", "gbuffer0");
  728. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  729. }
  730. #end
  731. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  732. {
  733. path.setTarget("buf");
  734. path.bindTarget("tex", "tex");
  735. path.bindTarget("gbuffer0", "gbuffer0");
  736. #if (rp_motionblur == "Camera")
  737. {
  738. path.bindTarget("_main", "gbufferD");
  739. path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
  740. }
  741. #else
  742. {
  743. path.bindTarget("gbuffer2", "sveloc");
  744. path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  745. }
  746. #end
  747. path.setTarget("tex");
  748. path.bindTarget("buf", "tex");
  749. path.drawShader("shader_datas/copy_pass/copy_pass");
  750. }
  751. #end
  752. // We are just about to enter compositing, add more custom passes here
  753. // #if rp_custom_pass
  754. // {
  755. // }
  756. // #end
  757. // Begin compositor
  758. #if rp_autoexposure
  759. {
  760. path.generateMipmaps("tex");
  761. }
  762. #end
  763. } // redraw
  764. #if ((rp_supersampling == 4) || (rp_rendercapture))
  765. var framebuffer = "buf";
  766. #else
  767. var framebuffer = "";
  768. #end
  769. if (arm.UITrait.inst.redraw()) { //
  770. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA"))
  771. {
  772. path.setTarget(framebuffer);
  773. }
  774. #else
  775. {
  776. path.setTarget("buf");
  777. }
  778. #end
  779. path.bindTarget("tex", "tex");
  780. #if rp_compositordepth
  781. {
  782. path.bindTarget("_main", "gbufferD");
  783. }
  784. #end
  785. #if rp_compositornodes
  786. {
  787. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  788. }
  789. #else
  790. {
  791. path.drawShader("shader_datas/copy_pass/copy_pass");
  792. }
  793. #end
  794. // End compositor
  795. #if rp_overlays
  796. {
  797. path.clearTarget(null, 1.0);
  798. path.drawMeshes("overlay");
  799. }
  800. #end
  801. } // redraw
  802. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  803. {
  804. path.setTarget("bufa");
  805. path.clearTarget(0x00000000);
  806. path.bindTarget("buf", "colorTex");
  807. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  808. path.setTarget("bufb");
  809. path.clearTarget(0x00000000);
  810. path.bindTarget("bufa", "edgesTex");
  811. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  812. #if (rp_antialiasing == "TAA")
  813. path.setTarget("bufa");
  814. #else
  815. path.setTarget(framebuffer);
  816. #end
  817. path.bindTarget("buf", "colorTex");
  818. path.bindTarget("bufb", "blendTex");
  819. #if (rp_antialiasing == "TAA")
  820. {
  821. path.bindTarget("gbuffer2", "sveloc");
  822. }
  823. #end
  824. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  825. #if (rp_antialiasing == "TAA")
  826. {
  827. path.setTarget(framebuffer);
  828. path.bindTarget("bufa", "tex");
  829. path.bindTarget("taa", "tex2");
  830. path.bindTarget("gbuffer2", "sveloc");
  831. path.drawShader("shader_datas/taa_pass/taa_pass");
  832. path.setTarget("taa");
  833. path.bindTarget("bufa", "tex");
  834. path.drawShader("shader_datas/copy_pass/copy_pass");
  835. }
  836. #end
  837. }
  838. #end
  839. #if (rp_supersampling == 4)
  840. {
  841. #if rp_rendercapture
  842. // TODO: ss4 + capture broken
  843. var final = "capture";
  844. #else
  845. var final = "";
  846. #end
  847. path.setTarget(final);
  848. path.bindTarget(framebuffer, "tex");
  849. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  850. }
  851. #elseif (rp_rendercapture)
  852. {
  853. path.setTarget("capture");
  854. path.bindTarget(framebuffer, "tex");
  855. path.drawShader("shader_datas/copy_pass/copy_pass");
  856. }
  857. #end
  858. arm.UITrait.inst.dirty = false; //
  859. }
  860. #end
  861. }