RenderPathCreator.hx 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635
  1. // Reference: https://github.com/armory3d/armory_docs/blob/master/dev/renderpath.md
  2. package arm.renderpath;
  3. import iron.RenderPath;
  4. class RenderPathCreator {
  5. static var path:RenderPath;
  6. public static function get():RenderPath {
  7. path = new RenderPath();
  8. init();
  9. path.commands = commands;
  10. return path;
  11. }
  12. #if (rp_gi != "Off")
  13. static var voxels = "voxels";
  14. static var voxelsLast = "voxels";
  15. public static var voxelFrame = 0;
  16. public static var voxelFreq = 6; // Revoxelizing frequency
  17. #end
  18. #if (rp_renderer == "Forward")
  19. static function init() {
  20. #if (rp_shadowmap && kha_webgl)
  21. initEmpty();
  22. #end
  23. #if (rp_background == "World")
  24. {
  25. path.loadShader("shader_datas/world_pass/world_pass");
  26. }
  27. #end
  28. #if rp_render_to_texture
  29. {
  30. path.createDepthBuffer("main", "DEPTH24");
  31. var t = new RenderTargetRaw();
  32. t.name = "lbuf";
  33. t.width = 0;
  34. t.height = 0;
  35. t.format = getHdrFormat();
  36. t.displayp = getDisplayp();
  37. var ss = getSuperSampling();
  38. if (ss != 1) t.scale = ss;
  39. t.depth_buffer = "main";
  40. path.createRenderTarget(t);
  41. #if rp_compositornodes
  42. {
  43. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  44. }
  45. #else
  46. {
  47. path.loadShader("shader_datas/copy_pass/copy_pass");
  48. }
  49. #end
  50. #if (rp_supersampling == 4)
  51. {
  52. var t = new RenderTargetRaw();
  53. t.name = "buf";
  54. t.width = 0;
  55. t.height = 0;
  56. t.format = 'RGBA32';
  57. t.displayp = getDisplayp();
  58. var ss = getSuperSampling();
  59. if (ss != 1) t.scale = ss;
  60. t.depth_buffer = "main";
  61. path.createRenderTarget(t);
  62. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  63. }
  64. #end
  65. }
  66. #end
  67. #if (rp_translucency)
  68. {
  69. initTranslucency();
  70. }
  71. #end
  72. #if (rp_gi != "Off")
  73. {
  74. initGI();
  75. #if arm_voxelgi_temporal
  76. {
  77. initGI("voxelsB");
  78. }
  79. #end
  80. }
  81. #end
  82. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  83. {
  84. var t = new RenderTargetRaw();
  85. t.name = "bufa";
  86. t.width = 0;
  87. t.height = 0;
  88. t.displayp = getDisplayp();
  89. t.format = "RGBA32";
  90. var ss = getSuperSampling();
  91. if (ss != 1) t.scale = ss;
  92. path.createRenderTarget(t);
  93. }
  94. {
  95. var t = new RenderTargetRaw();
  96. t.name = "bufb";
  97. t.width = 0;
  98. t.height = 0;
  99. t.displayp = getDisplayp();
  100. t.format = "RGBA32";
  101. var ss = getSuperSampling();
  102. if (ss != 1) t.scale = ss;
  103. path.createRenderTarget(t);
  104. }
  105. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  106. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  107. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  108. #if (rp_antialiasing == "TAA")
  109. {
  110. path.loadShader("shader_datas/taa_pass/taa_pass");
  111. }
  112. #end
  113. #end
  114. #if rp_volumetriclight
  115. {
  116. path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  117. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  118. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  119. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
  120. {
  121. var t = new RenderTargetRaw();
  122. t.name = "bufvola";
  123. t.width = 0;
  124. t.height = 0;
  125. t.displayp = getDisplayp();
  126. t.format = "R8";
  127. var ss = getSuperSampling();
  128. if (ss != 1) t.scale = ss;
  129. path.createRenderTarget(t);
  130. }
  131. {
  132. var t = new RenderTargetRaw();
  133. t.name = "bufvolb";
  134. t.width = 0;
  135. t.height = 0;
  136. t.displayp = getDisplayp();
  137. t.format = "R8";
  138. var ss = getSuperSampling();
  139. if (ss != 1) t.scale = ss;
  140. path.createRenderTarget(t);
  141. }
  142. }
  143. #end
  144. #if rp_bloom
  145. {
  146. var t = new RenderTargetRaw();
  147. t.name = "bloomtex";
  148. t.width = 0;
  149. t.height = 0;
  150. t.scale = 0.25;
  151. t.format = getHdrFormat();
  152. path.createRenderTarget(t);
  153. }
  154. {
  155. var t = new RenderTargetRaw();
  156. t.name = "bloomtex2";
  157. t.width = 0;
  158. t.height = 0;
  159. t.scale = 0.25;
  160. t.format = getHdrFormat();
  161. path.createRenderTarget(t);
  162. }
  163. {
  164. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  165. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  166. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  167. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  168. }
  169. #end
  170. }
  171. static function commands() {
  172. #if rp_shadowmap
  173. {
  174. var faces = path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube ? 6 : 1;
  175. for (i in 0...faces) {
  176. if (faces > 1) path.currentFace = i;
  177. path.setTarget(getShadowMap());
  178. path.clearTarget(null, 1.0);
  179. path.drawMeshes("shadowmap");
  180. }
  181. path.currentFace = -1;
  182. }
  183. #end
  184. #if (rp_gi != "Off")
  185. {
  186. var voxelize = path.voxelize();
  187. #if arm_voxelgi_temporal
  188. voxelize = ++voxelFrame % voxelFreq == 0;
  189. if (voxelize) {
  190. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  191. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  192. }
  193. #end
  194. if (voxelize) {
  195. path.clearImage(voxels, 0x00000000);
  196. path.setTarget("");
  197. var res = getVoxelRes();
  198. path.setViewport(res, res);
  199. path.bindTarget(voxels, "voxels");
  200. #if rp_shadowmap
  201. {
  202. bindShadowMap();
  203. }
  204. #end
  205. path.drawMeshes("voxel");
  206. path.generateMipmaps(voxels);
  207. }
  208. }
  209. #end
  210. #if rp_render_to_texture
  211. {
  212. path.setTarget("lbuf");
  213. }
  214. #else
  215. {
  216. path.setTarget("");
  217. }
  218. #end
  219. #if (rp_background == "Clear")
  220. {
  221. path.clearTarget(-1, 1.0);
  222. }
  223. #else
  224. {
  225. path.clearTarget(null, 1.0);
  226. }
  227. #end
  228. #if rp_depthprepass
  229. {
  230. path.drawMeshes("depth");
  231. }
  232. #end
  233. #if rp_shadowmap
  234. {
  235. bindShadowMap();
  236. }
  237. #end
  238. #if (rp_gi != "Off")
  239. {
  240. path.bindTarget(voxels, "voxels");
  241. #if arm_voxelgi_temporal
  242. {
  243. path.bindTarget(voxelsLast, "voxelsLast");
  244. }
  245. #end
  246. }
  247. #end
  248. function drawMeshes() {
  249. path.drawMeshes("mesh");
  250. #if (rp_background == "World")
  251. {
  252. path.drawSkydome("shader_datas/world_pass/world_pass");
  253. }
  254. #end
  255. #if rp_translucency
  256. {
  257. drawTranslucency("lbuf");
  258. }
  259. #end
  260. }
  261. #if rp_stereo
  262. {
  263. path.drawStereo(drawMeshes);
  264. }
  265. #else
  266. {
  267. drawMeshes();
  268. }
  269. #end
  270. #if rp_render_to_texture
  271. {
  272. #if rp_volumetriclight
  273. {
  274. path.setTarget("bufvola");
  275. path.bindTarget("_main", "gbufferD");
  276. bindShadowMap();
  277. if (path.lampIsSun()) {
  278. path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  279. }
  280. else {
  281. path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
  282. }
  283. path.setTarget("bufvolb");
  284. path.bindTarget("bufvola", "tex");
  285. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  286. path.setTarget("lbuf");
  287. path.bindTarget("bufvolb", "tex");
  288. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
  289. }
  290. #end
  291. #if rp_bloom
  292. {
  293. path.setTarget("bloomtex");
  294. path.bindTarget("lbuf", "tex");
  295. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  296. path.setTarget("bloomtex2");
  297. path.bindTarget("bloomtex", "tex");
  298. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  299. path.setTarget("bloomtex");
  300. path.bindTarget("bloomtex2", "tex");
  301. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  302. path.setTarget("bloomtex2");
  303. path.bindTarget("bloomtex", "tex");
  304. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  305. path.setTarget("bloomtex");
  306. path.bindTarget("bloomtex2", "tex");
  307. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  308. path.setTarget("bloomtex2");
  309. path.bindTarget("bloomtex", "tex");
  310. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  311. path.setTarget("bloomtex");
  312. path.bindTarget("bloomtex2", "tex");
  313. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  314. path.setTarget("bloomtex2");
  315. path.bindTarget("bloomtex", "tex");
  316. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  317. path.setTarget("lbuf");
  318. path.bindTarget("bloomtex2", "tex");
  319. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  320. }
  321. #end
  322. #if (rp_supersampling == 4)
  323. var framebuffer = "buf";
  324. #else
  325. var framebuffer = "";
  326. #end
  327. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA"))
  328. {
  329. path.setTarget(framebuffer);
  330. }
  331. #else
  332. {
  333. path.setTarget("buf");
  334. }
  335. #end
  336. path.bindTarget("lbuf", "tex");
  337. #if rp_compositordepth
  338. {
  339. path.bindTarget("_main", "gbufferD");
  340. }
  341. #end
  342. #if rp_compositornodes
  343. {
  344. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  345. }
  346. #else
  347. {
  348. path.drawShader("shader_datas/copy_pass/copy_pass");
  349. }
  350. #end
  351. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  352. {
  353. path.setTarget("bufa");
  354. path.clearTarget(0x00000000);
  355. path.bindTarget("lbuf", "colorTex");
  356. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  357. path.setTarget("bufb");
  358. path.clearTarget(0x00000000);
  359. path.bindTarget("bufa", "edgesTex");
  360. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  361. // #if (rp_antialiasing == "TAA")
  362. // path.setTarget("bufa");
  363. // #else
  364. path.setTarget(framebuffer);
  365. // #end
  366. path.bindTarget("lbuf", "colorTex");
  367. path.bindTarget("bufb", "blendTex");
  368. // #if (rp_antialiasing == "TAA")
  369. // {
  370. // path.bindTarget("gbuffer2", "sveloc");
  371. // }
  372. // #end
  373. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  374. // #if (rp_antialiasing == "TAA")
  375. // {
  376. // path.setTarget(framebuffer);
  377. // path.bindTarget("bufa", "tex");
  378. // path.bindTarget("taa", "tex2");
  379. // path.bindTarget("gbuffer2", "sveloc");
  380. // path.drawShader("shader_datas/taa_pass/taa_pass");
  381. // path.setTarget("taa");
  382. // path.bindTarget("bufa", "tex");
  383. // path.drawShader("shader_datas/copy_pass/copy_pass");
  384. // }
  385. // #end
  386. }
  387. #end
  388. #if (rp_supersampling == 4)
  389. {
  390. var final = "";
  391. path.setTarget(final);
  392. path.bindTarget(framebuffer, "tex");
  393. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  394. }
  395. #end
  396. }
  397. #end
  398. #if rp_overlays
  399. {
  400. path.clearTarget(null, 1.0);
  401. path.drawMeshes("overlay");
  402. }
  403. #end
  404. }
  405. #end
  406. #if (rp_renderer == "Deferred")
  407. static function init() {
  408. #if (rp_shadowmap && kha_webgl)
  409. initEmpty();
  410. #end
  411. #if (rp_background == "World")
  412. {
  413. path.loadShader("shader_datas/world_pass/world_pass");
  414. }
  415. #end
  416. #if (rp_translucency)
  417. {
  418. initTranslucency();
  419. }
  420. #end
  421. #if (rp_gi != "Off")
  422. {
  423. initGI();
  424. #if arm_voxelgi_temporal
  425. {
  426. initGI("voxelsB");
  427. }
  428. #end
  429. }
  430. #end
  431. {
  432. path.createDepthBuffer("main", "DEPTH24");
  433. var t = new RenderTargetRaw();
  434. t.name = "tex";
  435. t.width = 0;
  436. t.height = 0;
  437. t.displayp = getDisplayp();
  438. t.format = getHdrFormat();
  439. var ss = getSuperSampling();
  440. if (ss != 1) t.scale = ss;
  441. t.depth_buffer = "main";
  442. #if rp_autoexposure
  443. t.mipmaps = true;
  444. #end
  445. path.createRenderTarget(t);
  446. }
  447. {
  448. var t = new RenderTargetRaw();
  449. t.name = "buf";
  450. t.width = 0;
  451. t.height = 0;
  452. t.displayp = getDisplayp();
  453. t.format = getHdrFormat();
  454. var ss = getSuperSampling();
  455. if (ss != 1) t.scale = ss;
  456. path.createRenderTarget(t);
  457. }
  458. {
  459. path.createDepthBuffer("main", "DEPTH24");
  460. var t = new RenderTargetRaw();
  461. t.name = "gbuffer0";
  462. t.width = 0;
  463. t.height = 0;
  464. t.displayp = getDisplayp();
  465. t.format = "RGBA64";
  466. var ss = getSuperSampling();
  467. if (ss != 1) t.scale = ss;
  468. t.depth_buffer = "main";
  469. path.createRenderTarget(t);
  470. }
  471. {
  472. var t = new RenderTargetRaw();
  473. t.name = "gbuffer1";
  474. t.width = 0;
  475. t.height = 0;
  476. t.displayp = getDisplayp();
  477. t.format = "RGBA64";
  478. var ss = getSuperSampling();
  479. if (ss != 1) t.scale = ss;
  480. path.createRenderTarget(t);
  481. }
  482. #if arm_veloc
  483. {
  484. var t = new RenderTargetRaw();
  485. t.name = "gbuffer2";
  486. t.width = 0;
  487. t.height = 0;
  488. t.displayp = getDisplayp();
  489. t.format = "RGBA64";
  490. var ss = getSuperSampling();
  491. if (ss != 1) t.scale = ss;
  492. path.createRenderTarget(t);
  493. }
  494. {
  495. var t = new RenderTargetRaw();
  496. t.name = "taa";
  497. t.width = 0;
  498. t.height = 0;
  499. t.displayp = getDisplayp();
  500. t.format = "RGBA32";
  501. var ss = getSuperSampling();
  502. if (ss != 1) t.scale = ss;
  503. path.createRenderTarget(t);
  504. }
  505. #end
  506. path.loadShader("shader_datas/deferred_indirect/deferred_indirect");
  507. path.loadShader("shader_datas/deferred_light/deferred_light");
  508. path.loadShader("shader_datas/deferred_light_quad/deferred_light_quad");
  509. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  510. {
  511. path.loadShader("shader_datas/ssgi_pass/ssgi_pass");
  512. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  513. path.loadShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  514. }
  515. #elseif (rp_ssgi == "SSAO")
  516. {
  517. path.loadShader("shader_datas/ssao_pass/ssao_pass");
  518. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  519. path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  520. }
  521. #end
  522. #if ((rp_ssgi != "Off") || (rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  523. {
  524. var t = new RenderTargetRaw();
  525. t.name = "bufa";
  526. t.width = 0;
  527. t.height = 0;
  528. t.displayp = getDisplayp();
  529. t.format = "RGBA32";
  530. var ss = getSuperSampling();
  531. if (ss != 1) t.scale = ss;
  532. path.createRenderTarget(t);
  533. }
  534. {
  535. var t = new RenderTargetRaw();
  536. t.name = "bufb";
  537. t.width = 0;
  538. t.height = 0;
  539. t.displayp = getDisplayp();
  540. t.format = "RGBA32";
  541. var ss = getSuperSampling();
  542. if (ss != 1) t.scale = ss;
  543. path.createRenderTarget(t);
  544. }
  545. #end
  546. #if rp_rendercapture
  547. {
  548. var t = new RenderTargetRaw();
  549. t.name = "capture";
  550. t.width = 0;
  551. t.height = 0;
  552. t.format = getRenderCaptureFormat();
  553. path.createRenderTarget(t);
  554. }
  555. #end
  556. #if rp_compositornodes
  557. {
  558. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  559. }
  560. #end
  561. #if ((!rp_compositornodes) || (rp_antialiasing == "TAA") || (rp_rendercapture) || (rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  562. {
  563. path.loadShader("shader_datas/copy_pass/copy_pass");
  564. }
  565. #end
  566. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  567. {
  568. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  569. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  570. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  571. #if (rp_antialiasing == "TAA")
  572. {
  573. path.loadShader("shader_datas/taa_pass/taa_pass");
  574. }
  575. #end
  576. }
  577. #end
  578. #if (rp_supersampling == 4)
  579. {
  580. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  581. }
  582. #end
  583. #if rp_volumetriclight
  584. {
  585. path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  586. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  587. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  588. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
  589. {
  590. var t = new RenderTargetRaw();
  591. t.name = "bufvola";
  592. t.width = 0;
  593. t.height = 0;
  594. t.displayp = getDisplayp();
  595. t.format = "R8";
  596. // var ss = getSuperSampling();
  597. t.scale = 0.5;
  598. path.createRenderTarget(t);
  599. }
  600. {
  601. var t = new RenderTargetRaw();
  602. t.name = "bufvolb";
  603. t.width = 0;
  604. t.height = 0;
  605. t.displayp = getDisplayp();
  606. t.format = "R8";
  607. // var ss = getSuperSampling();
  608. t.scale = 0.5;
  609. path.createRenderTarget(t);
  610. }
  611. }
  612. #end
  613. #if rp_ocean
  614. {
  615. path.loadShader("shader_datas/water_pass/water_pass");
  616. }
  617. #end
  618. #if rp_bloom
  619. {
  620. var t = new RenderTargetRaw();
  621. t.name = "bloomtex";
  622. t.width = 0;
  623. t.height = 0;
  624. t.scale = 0.25;
  625. t.format = getHdrFormat();
  626. path.createRenderTarget(t);
  627. }
  628. {
  629. var t = new RenderTargetRaw();
  630. t.name = "bloomtex2";
  631. t.width = 0;
  632. t.height = 0;
  633. t.scale = 0.25;
  634. t.format = getHdrFormat();
  635. path.createRenderTarget(t);
  636. }
  637. {
  638. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  639. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  640. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  641. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  642. }
  643. #end
  644. #if rp_sss
  645. {
  646. path.loadShader("shader_datas/sss_pass/sss_pass_x");
  647. path.loadShader("shader_datas/sss_pass/sss_pass_y");
  648. }
  649. #end
  650. #if rp_ssr
  651. {
  652. path.loadShader("shader_datas/ssr_pass/ssr_pass");
  653. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  654. path.loadShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  655. #if rp_ssr_half
  656. {
  657. var t = new RenderTargetRaw();
  658. t.name = "ssra";
  659. t.width = 0;
  660. t.height = 0;
  661. t.scale = 0.5;
  662. t.format = getHdrFormat();
  663. path.createRenderTarget(t);
  664. }
  665. {
  666. var t = new RenderTargetRaw();
  667. t.name = "ssrb";
  668. t.width = 0;
  669. t.height = 0;
  670. t.scale = 0.5;
  671. t.format = getHdrFormat();
  672. path.createRenderTarget(t);
  673. }
  674. #end
  675. }
  676. #end
  677. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  678. {
  679. #if (rp_motionblur == "Camera")
  680. {
  681. path.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
  682. }
  683. #else
  684. {
  685. path.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  686. }
  687. #end
  688. }
  689. #end
  690. #if rp_soft_shadows
  691. {
  692. path.loadShader("shader_datas/dilate_pass/dilate_pass_x");
  693. path.loadShader("shader_datas/dilate_pass/dilate_pass_y");
  694. path.loadShader("shader_datas/visibility_pass/visibility_pass");
  695. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_x");
  696. path.loadShader("shader_datas/blur_shadow_pass/blur_shadow_pass_y");
  697. {
  698. var t = new RenderTargetRaw();
  699. t.name = "visa";
  700. t.width = 0;
  701. t.height = 0;
  702. t.format = 'R16';
  703. path.createRenderTarget(t);
  704. }
  705. {
  706. var t = new RenderTargetRaw();
  707. t.name = "visb";
  708. t.width = 0;
  709. t.height = 0;
  710. t.format = 'R16';
  711. path.createRenderTarget(t);
  712. }
  713. {
  714. var t = new RenderTargetRaw();
  715. t.name = "dist";
  716. t.width = 0;
  717. t.height = 0;
  718. t.format = 'R16';
  719. path.createRenderTarget(t);
  720. }
  721. }
  722. #end
  723. // Paint
  724. {
  725. path.createDepthBuffer("paintdb", "DEPTH16");
  726. var t = new RenderTargetRaw();
  727. t.name = "texpaint";
  728. t.width = 4096;
  729. t.height = 4096;
  730. t.format = 'RGBA32';
  731. t.depth_buffer = "paintdb";
  732. path.createRenderTarget(t);
  733. }
  734. {
  735. var t = new RenderTargetRaw();
  736. t.name = "texpaint_nor";
  737. t.width = 4096;
  738. t.height = 4096;
  739. t.format = 'RGBA32';
  740. path.createRenderTarget(t);
  741. }
  742. {
  743. var t = new RenderTargetRaw();
  744. t.name = "texpaint_pack";
  745. t.width = 4096;
  746. t.height = 4096;
  747. t.format = 'RGBA32';
  748. path.createRenderTarget(t);
  749. }
  750. //
  751. }
  752. static function drawShadowMap(l:iron.object.LampObject) {
  753. var faces = l.data.raw.shadowmap_cube ? 6 : 1;
  754. for (j in 0...faces) {
  755. if (faces > 1) path.currentFace = j;
  756. path.setTarget(getShadowMap());
  757. path.clearTarget(null, 1.0);
  758. path.drawMeshes("shadowmap");
  759. }
  760. path.currentFace = -1;
  761. // One lamp at a time for now, precompute all lamps for tiled
  762. #if rp_soft_shadows
  763. path.setTarget("visa"); // Merge using min blend
  764. bindShadowMap();
  765. path.drawShader("shader_datas/dilate_pass/dilate_pass_x");
  766. path.setTarget("visb");
  767. path.bindTarget("visa", "shadowMap");
  768. path.drawShader("shader_datas/dilate_pass/dilate_pass_y");
  769. path.setTarget("visa", ["dist"]);
  770. //if (i == 0) path.clearTarget(0x00000000);
  771. path.bindTarget("visb", "dilate");
  772. bindShadowMap();
  773. //path.bindTarget("_main", "gbufferD");
  774. path.bindTarget("gbuffer0", "gbuffer0");
  775. path.drawShader("shader_datas/visibility_pass/visibility_pass");
  776. path.setTarget("visb");
  777. path.bindTarget("visa", "tex");
  778. path.bindTarget("gbuffer0", "gbuffer0");
  779. path.bindTarget("dist", "dist");
  780. path.drawShader("shader_datas/blur_shadow_pass/blur_shadow_pass_x");
  781. path.setTarget("visa");
  782. path.bindTarget("visb", "tex");
  783. path.bindTarget("gbuffer0", "gbuffer0");
  784. path.bindTarget("dist", "dist");
  785. path.drawShader("shader_datas/blur_shadow_pass/blur_shadow_pass_y");
  786. #end
  787. }
  788. static function commands() {
  789. // Paint
  790. if (arm.UITrait.depthDirty()) {
  791. path.setTarget("texpaint");
  792. path.clearTarget(null, 1.0);
  793. path.drawMeshes("depth"); // TODO: CHECK DEPTH EXPORT
  794. }
  795. if (arm.UITrait.paintDirty()) {
  796. path.setTarget("texpaint", ["texpaint_nor", "texpaint_pack"]);
  797. path.bindTarget("_paintdb", "paintdb");
  798. path.drawMeshes("paint");
  799. }
  800. //
  801. #if rp_dynres
  802. {
  803. DynamicResolutionScale.run(path);
  804. }
  805. #end
  806. #if arm_veloc
  807. {
  808. path.setTarget("gbuffer2");
  809. path.clearTarget(0xff000000);
  810. path.setTarget("gbuffer0", ["gbuffer1", "gbuffer2"]);
  811. }
  812. #else
  813. {
  814. path.setTarget("gbuffer0", ["gbuffer1"]);
  815. }
  816. #end
  817. #if (rp_background == "Clear")
  818. {
  819. path.clearTarget(-1, 1.0);
  820. }
  821. #else
  822. {
  823. path.clearTarget(null, 1.0);
  824. }
  825. #end
  826. // Paint
  827. path.bindTarget("texpaint", "texpaint");
  828. path.bindTarget("texpaint_nor", "texpaint_nor");
  829. path.bindTarget("texpaint_pack", "texpaint_pack");
  830. //
  831. path.drawMeshes("mesh");
  832. #if rp_decals
  833. {
  834. // path.setTarget("gbuffer0", ["gbuffer1"]);
  835. path.bindTarget("_main", "gbufferD");
  836. path.drawDecals("decal");
  837. }
  838. #end
  839. #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO"))
  840. {
  841. path.setTarget("bufa");
  842. path.bindTarget("_main", "gbufferD");
  843. path.bindTarget("gbuffer0", "gbuffer0");
  844. #if ((rp_ssgi == "RTGI"))
  845. path.bindTarget("gbuffer1", "gbuffer1");
  846. #end
  847. path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
  848. path.setTarget("bufb");
  849. path.bindTarget("gbuffer0", "gbuffer0");
  850. path.bindTarget("bufa", "tex");
  851. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_x");
  852. path.setTarget("bufa");
  853. path.bindTarget("gbuffer0", "gbuffer0");
  854. path.bindTarget("bufb", "tex");
  855. path.drawShader("shader_datas/ssgi_blur_pass/ssgi_blur_pass_y");
  856. }
  857. #elseif (rp_ssgi == "SSAO")
  858. {
  859. path.setTarget("bufa");
  860. path.bindTarget("_main", "gbufferD");
  861. path.bindTarget("gbuffer0", "gbuffer0");
  862. path.drawShader("shader_datas/ssao_pass/ssao_pass");
  863. path.setTarget("bufb");
  864. path.bindTarget("bufa", "tex");
  865. path.bindTarget("gbuffer0", "gbuffer0");
  866. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
  867. path.setTarget("bufa");
  868. path.bindTarget("bufb", "tex");
  869. path.bindTarget("gbuffer0", "gbuffer0");
  870. path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
  871. }
  872. #end
  873. // Voxels
  874. #if (rp_gi != "Off")
  875. {
  876. #if ((rp_shadowmap) && (rp_gi == "Voxel GI"))
  877. {
  878. if (path.lampCastShadow() && iron.Scene.active.lamps.length > 0) {
  879. drawShadowMap(iron.Scene.active.lamps[0]);
  880. }
  881. }
  882. #end
  883. var voxelize = path.voxelize();
  884. #if arm_voxelgi_temporal
  885. voxelize = ++voxelFrame % voxelFreq == 0;
  886. if (voxelize) {
  887. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  888. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  889. }
  890. #end
  891. if (voxelize) {
  892. path.clearImage(voxels, 0x00000000);
  893. path.setTarget("");
  894. var res = getVoxelRes();
  895. path.setViewport(res, res);
  896. path.bindTarget(voxels, "voxels");
  897. #if ((rp_shadowmap) && (rp_gi == "Voxel GI"))
  898. {
  899. bindShadowMap();
  900. }
  901. #end
  902. path.drawMeshes("voxel");
  903. path.generateMipmaps(voxels);
  904. }
  905. }
  906. #end
  907. // Indirect
  908. path.setTarget("tex");
  909. path.bindTarget("_main", "gbufferD");
  910. path.bindTarget("gbuffer0", "gbuffer0");
  911. path.bindTarget("gbuffer1", "gbuffer1");
  912. #if (rp_ssgi != "Off")
  913. {
  914. path.bindTarget("bufa", "ssaotex");
  915. }
  916. #end
  917. #if (rp_gi != "Off")
  918. {
  919. path.bindTarget(voxels, "voxels");
  920. #if arm_voxelgi_temporal
  921. {
  922. path.bindTarget(voxelsLast, "voxelsLast");
  923. }
  924. #end
  925. }
  926. #end
  927. path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
  928. // Direct
  929. var lamps = iron.Scene.active.lamps;
  930. for (i in 0...lamps.length) {
  931. var l = lamps[i];
  932. if (!l.visible) continue;
  933. path.currentLampIndex = i;
  934. #if ((rp_shadowmap) && (rp_gi != "Voxel GI"))
  935. {
  936. if (path.lampCastShadow()) {
  937. drawShadowMap(l);
  938. }
  939. }
  940. #end
  941. path.setTarget("tex");
  942. path.bindTarget("_main", "gbufferD");
  943. path.bindTarget("gbuffer0", "gbuffer0");
  944. path.bindTarget("gbuffer1", "gbuffer1");
  945. #if rp_shadowmap
  946. {
  947. if (path.lampCastShadow()) {
  948. #if rp_soft_shadows
  949. path.bindTarget("visa", "svisibility");
  950. #else
  951. bindShadowMap();
  952. #end
  953. }
  954. }
  955. #end
  956. #if ((rp_voxelgi_shadows) || (rp_voxelgi_refraction))
  957. {
  958. path.bindTarget(voxels, "voxels");
  959. }
  960. #end
  961. if (path.lampIsSun()) {
  962. path.drawShader("shader_datas/deferred_light_quad/deferred_light_quad");
  963. }
  964. else {
  965. path.drawLampVolume("shader_datas/deferred_light/deferred_light");
  966. }
  967. #if rp_volumetriclight
  968. {
  969. path.setTarget("bufvola");
  970. path.bindTarget("_main", "gbufferD");
  971. bindShadowMap();
  972. if (path.lampIsSun()) {
  973. path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  974. }
  975. else {
  976. path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
  977. }
  978. path.setTarget("bufvolb");
  979. path.bindTarget("bufvola", "tex");
  980. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  981. path.setTarget("tex");
  982. path.bindTarget("bufvolb", "tex");
  983. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
  984. }
  985. #end
  986. }
  987. path.currentLampIndex = 0;
  988. #if (rp_background == "World")
  989. {
  990. path.drawSkydome("shader_datas/world_pass/world_pass");
  991. }
  992. #end
  993. #if rp_ocean
  994. {
  995. path.setTarget("tex");
  996. path.bindTarget("_main", "gbufferD");
  997. path.drawShader("shader_datas/water_pass/water_pass");
  998. }
  999. #end
  1000. #if rp_blending
  1001. {
  1002. path.drawMeshes("blend");
  1003. }
  1004. #end
  1005. #if rp_translucency
  1006. {
  1007. drawTranslucency("tex");
  1008. }
  1009. #end
  1010. #if rp_bloom
  1011. {
  1012. path.setTarget("bloomtex");
  1013. path.bindTarget("tex", "tex");
  1014. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  1015. path.setTarget("bloomtex2");
  1016. path.bindTarget("bloomtex", "tex");
  1017. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  1018. path.setTarget("bloomtex");
  1019. path.bindTarget("bloomtex2", "tex");
  1020. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  1021. path.setTarget("bloomtex2");
  1022. path.bindTarget("bloomtex", "tex");
  1023. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  1024. path.setTarget("bloomtex");
  1025. path.bindTarget("bloomtex2", "tex");
  1026. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  1027. path.setTarget("bloomtex2");
  1028. path.bindTarget("bloomtex", "tex");
  1029. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  1030. path.setTarget("bloomtex");
  1031. path.bindTarget("bloomtex2", "tex");
  1032. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  1033. path.setTarget("bloomtex2");
  1034. path.bindTarget("bloomtex", "tex");
  1035. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  1036. path.setTarget("tex");
  1037. path.bindTarget("bloomtex2", "tex");
  1038. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  1039. }
  1040. #end
  1041. #if rp_sss
  1042. {
  1043. path.setTarget("buf");
  1044. path.bindTarget("tex", "tex");
  1045. path.bindTarget("_main", "gbufferD");
  1046. path.bindTarget("gbuffer1", "gbuffer1");
  1047. path.drawShader("shader_datas/sss_pass/sss_pass_x");
  1048. path.setTarget("tex");
  1049. // TODO: can not bind tex
  1050. path.bindTarget("tex", "tex");
  1051. path.bindTarget("_main", "gbufferD");
  1052. path.bindTarget("gbuffer1", "gbuffer1");
  1053. path.drawShader("shader_datas/sss_pass/sss_pass_y");
  1054. }
  1055. #end
  1056. #if rp_ssr
  1057. {
  1058. #if rp_ssr_half
  1059. var targeta = "ssra";
  1060. var targetb = "ssrb";
  1061. #else
  1062. var targeta = "buf";
  1063. var targetb = "gbuffer1";
  1064. #end
  1065. path.setTarget(targeta);
  1066. path.bindTarget("tex", "tex");
  1067. path.bindTarget("_main", "gbufferD");
  1068. path.bindTarget("gbuffer0", "gbuffer0");
  1069. path.drawShader("shader_datas/ssr_pass/ssr_pass");
  1070. path.setTarget(targetb);
  1071. path.bindTarget(targeta, "tex");
  1072. path.bindTarget("gbuffer0", "gbuffer0");
  1073. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_x");
  1074. path.setTarget("tex");
  1075. path.bindTarget(targetb, "tex");
  1076. path.bindTarget("gbuffer0", "gbuffer0");
  1077. path.drawShader("shader_datas/blur_adaptive_pass/blur_adaptive_pass_y3_blend");
  1078. }
  1079. #end
  1080. #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
  1081. {
  1082. path.setTarget("buf");
  1083. path.bindTarget("tex", "tex");
  1084. path.bindTarget("gbuffer0", "gbuffer0");
  1085. #if (rp_motionblur == "Camera")
  1086. {
  1087. path.bindTarget("_main", "gbufferD");
  1088. path.drawShader("shader_datas/motion_blur_pass/motion_blur_pass");
  1089. }
  1090. #else
  1091. {
  1092. path.bindTarget("gbuffer2", "sveloc");
  1093. path.drawShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  1094. }
  1095. #end
  1096. path.setTarget("tex");
  1097. path.bindTarget("buf", "tex");
  1098. path.drawShader("shader_datas/copy_pass/copy_pass");
  1099. }
  1100. #end
  1101. // We are just about to enter compositing, add more custom passes here
  1102. // #if rp_custom_pass
  1103. // {
  1104. // }
  1105. // #end
  1106. // Begin compositor
  1107. #if rp_autoexposure
  1108. {
  1109. path.generateMipmaps("tex");
  1110. }
  1111. #end
  1112. #if ((rp_supersampling == 4) || (rp_rendercapture))
  1113. var framebuffer = "buf";
  1114. #else
  1115. var framebuffer = "";
  1116. #end
  1117. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA"))
  1118. {
  1119. path.setTarget(framebuffer);
  1120. }
  1121. #else
  1122. {
  1123. path.setTarget("buf");
  1124. }
  1125. #end
  1126. path.bindTarget("tex", "tex");
  1127. #if rp_compositordepth
  1128. {
  1129. path.bindTarget("_main", "gbufferD");
  1130. }
  1131. #end
  1132. #if rp_compositornodes
  1133. {
  1134. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  1135. }
  1136. #else
  1137. {
  1138. path.drawShader("shader_datas/copy_pass/copy_pass");
  1139. }
  1140. #end
  1141. // End compositor
  1142. #if rp_overlays
  1143. {
  1144. path.clearTarget(null, 1.0);
  1145. path.drawMeshes("overlay");
  1146. }
  1147. #end
  1148. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  1149. {
  1150. path.setTarget("bufa");
  1151. path.clearTarget(0x00000000);
  1152. path.bindTarget("buf", "colorTex");
  1153. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  1154. path.setTarget("bufb");
  1155. path.clearTarget(0x00000000);
  1156. path.bindTarget("bufa", "edgesTex");
  1157. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  1158. #if (rp_antialiasing == "TAA")
  1159. path.setTarget("bufa");
  1160. #else
  1161. path.setTarget(framebuffer);
  1162. #end
  1163. path.bindTarget("buf", "colorTex");
  1164. path.bindTarget("bufb", "blendTex");
  1165. #if (rp_antialiasing == "TAA")
  1166. {
  1167. path.bindTarget("gbuffer2", "sveloc");
  1168. }
  1169. #end
  1170. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  1171. #if (rp_antialiasing == "TAA")
  1172. {
  1173. path.setTarget(framebuffer);
  1174. path.bindTarget("bufa", "tex");
  1175. path.bindTarget("taa", "tex2");
  1176. path.bindTarget("gbuffer2", "sveloc");
  1177. path.drawShader("shader_datas/taa_pass/taa_pass");
  1178. path.setTarget("taa");
  1179. path.bindTarget("bufa", "tex");
  1180. path.drawShader("shader_datas/copy_pass/copy_pass");
  1181. }
  1182. #end
  1183. }
  1184. #end
  1185. #if (rp_supersampling == 4)
  1186. {
  1187. #if rp_rendercapture
  1188. // TODO: ss4 + capture broken
  1189. var final = "capture";
  1190. #else
  1191. var final = "";
  1192. #end
  1193. path.setTarget(final);
  1194. path.bindTarget(framebuffer, "tex");
  1195. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  1196. }
  1197. #elseif (rp_rendercapture)
  1198. {
  1199. path.setTarget("capture");
  1200. path.bindTarget(framebuffer, "tex");
  1201. path.drawShader("shader_datas/copy_pass/copy_pass");
  1202. }
  1203. #end
  1204. }
  1205. #end
  1206. // #if (rp_renderer == "Deferred Plus")
  1207. // static function init() {
  1208. // }
  1209. // static function commands() {
  1210. // }
  1211. // #end
  1212. static function bindShadowMap() {
  1213. var target = shadowMapName();
  1214. if (target == "shadowMapCube") {
  1215. #if kha_webgl
  1216. // Bind empty map to non-cubemap sampler to keep webgl happy
  1217. path.bindTarget("arm_empty", "shadowMap");
  1218. #end
  1219. path.bindTarget("shadowMapCube", "shadowMapCube");
  1220. }
  1221. else {
  1222. #if kha_webgl
  1223. // Bind empty map to cubemap sampler
  1224. path.bindTarget("arm_empty_cube", "shadowMapCube");
  1225. #end
  1226. path.bindTarget("shadowMap", "shadowMap");
  1227. }
  1228. }
  1229. static function shadowMapName():String {
  1230. return path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube ? "shadowMapCube" : "shadowMap";
  1231. }
  1232. static function getShadowMap():String {
  1233. var target = shadowMapName();
  1234. var rt = path.renderTargets.get(target);
  1235. // Create shadowmap on the fly
  1236. if (rt == null) {
  1237. if (path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube) {
  1238. // Cubemap size
  1239. var size = Std.int(path.getLamp(path.currentLampIndex).data.raw.shadowmap_size);
  1240. var t = new RenderTargetRaw();
  1241. t.name = target;
  1242. t.width = size;
  1243. t.height = size;
  1244. t.format = "DEPTH16";
  1245. t.is_cubemap = true;
  1246. rt = path.createRenderTarget(t);
  1247. }
  1248. else { // Non-cube sm
  1249. var sizew = path.getLamp(path.currentLampIndex).data.raw.shadowmap_size;
  1250. var sizeh = sizew;
  1251. #if arm_csm // Cascades - atlas on x axis
  1252. sizew = sizeh * iron.object.LampObject.cascadeCount;
  1253. #end
  1254. var t = new RenderTargetRaw();
  1255. t.name = target;
  1256. t.width = sizew;
  1257. t.height = sizeh;
  1258. t.format = "DEPTH16";
  1259. rt = path.createRenderTarget(t);
  1260. }
  1261. }
  1262. return target;
  1263. }
  1264. #if (rp_shadowmap && kha_webgl)
  1265. static function initEmpty() {
  1266. // Bind empty when requested target is not found
  1267. var tempty = new RenderTargetRaw();
  1268. tempty.name = "arm_empty";
  1269. tempty.width = 1;
  1270. tempty.height = 1;
  1271. tempty.format = "DEPTH16";
  1272. path.createRenderTarget(tempty);
  1273. var temptyCube = new RenderTargetRaw();
  1274. temptyCube.name = "arm_empty_cube";
  1275. temptyCube.width = 1;
  1276. temptyCube.height = 1;
  1277. temptyCube.format = "DEPTH16";
  1278. temptyCube.is_cubemap = true;
  1279. path.createRenderTarget(temptyCube);
  1280. }
  1281. #end
  1282. #if (rp_translucency)
  1283. static function initTranslucency() {
  1284. path.createDepthBuffer("main", "DEPTH24");
  1285. var t = new RenderTargetRaw();
  1286. t.name = "accum";
  1287. t.width = 0;
  1288. t.height = 0;
  1289. t.displayp = getDisplayp();
  1290. t.format = "RGBA64";
  1291. var ss = getSuperSampling();
  1292. if (ss != 1) t.scale = ss;
  1293. t.depth_buffer = "main";
  1294. path.createRenderTarget(t);
  1295. var t = new RenderTargetRaw();
  1296. t.name = "revealage";
  1297. t.width = 0;
  1298. t.height = 0;
  1299. t.displayp = getDisplayp();
  1300. t.format = "RGBA64";
  1301. var ss = getSuperSampling();
  1302. if (ss != 1) t.scale = ss;
  1303. t.depth_buffer = "main";
  1304. path.createRenderTarget(t);
  1305. path.loadShader("shader_datas/translucent_resolve/translucent_resolve");
  1306. }
  1307. static function drawTranslucency(target:String) {
  1308. path.setTarget("accum");
  1309. path.clearTarget(0xff000000);
  1310. path.setTarget("revealage");
  1311. path.clearTarget(0xffffffff);
  1312. path.setTarget("accum", ["revealage"]);
  1313. #if rp_shadowmap
  1314. {
  1315. bindShadowMap();
  1316. }
  1317. #end
  1318. path.drawMeshes("translucent");
  1319. #if rp_render_to_texture
  1320. {
  1321. path.setTarget(target);
  1322. }
  1323. #else
  1324. {
  1325. path.setTarget("");
  1326. }
  1327. #end
  1328. path.bindTarget("accum", "gbuffer0");
  1329. path.bindTarget("revealage", "gbuffer1");
  1330. path.drawShader("shader_datas/translucent_resolve/translucent_resolve");
  1331. }
  1332. #end
  1333. #if (rp_gi != "Off")
  1334. static function initGI(tname = "voxels") {
  1335. var t = new RenderTargetRaw();
  1336. t.name = tname;
  1337. #if (rp_gi == "Voxel AO")
  1338. {
  1339. t.format = "R8";
  1340. }
  1341. #elseif (rp_voxelgi_hdr)
  1342. {
  1343. t.format = "RGBA64";
  1344. }
  1345. #else
  1346. {
  1347. t.format = "RGBA32";
  1348. }
  1349. #end
  1350. var res = getVoxelRes();
  1351. var resZ = getVoxelResZ();
  1352. t.width = res;
  1353. t.height = res;
  1354. t.depth = Std.int(res * resZ);
  1355. t.is_image = true;
  1356. t.mipmaps = true;
  1357. path.createRenderTarget(t);
  1358. }
  1359. #end
  1360. static inline function getShadowmapSize():Int {
  1361. #if (rp_shadowmap_size == 512)
  1362. return 512;
  1363. #elseif (rp_shadowmap_size == 1024)
  1364. return 1024;
  1365. #elseif (rp_shadowmap_size == 2048)
  1366. return 2048;
  1367. #elseif (rp_shadowmap_size == 4096)
  1368. return 4096;
  1369. #elseif (rp_shadowmap_size == 8192)
  1370. return 8192;
  1371. #elseif (rp_shadowmap_size == 16384)
  1372. return 16384;
  1373. #else
  1374. return 0;
  1375. #end
  1376. }
  1377. static inline function getVoxelRes():Int {
  1378. #if (rp_voxelgi_resolution == 512)
  1379. return 512;
  1380. #elseif (rp_voxelgi_resolution == 256)
  1381. return 256;
  1382. #elseif (rp_voxelgi_resolution == 128)
  1383. return 128;
  1384. #elseif (rp_voxelgi_resolution == 64)
  1385. return 64;
  1386. #elseif (rp_voxelgi_resolution == 32)
  1387. return 32;
  1388. #else
  1389. return 0;
  1390. #end
  1391. }
  1392. static inline function getVoxelResZ():Float {
  1393. #if (rp_voxelgi_resolution_z == 1.0)
  1394. return 1.0;
  1395. #elseif (rp_voxelgi_resolution_z == 0.5)
  1396. return 0.5;
  1397. #elseif (rp_voxelgi_resolution_z == 0.25)
  1398. return 0.25;
  1399. #else
  1400. return 0.0;
  1401. #end
  1402. }
  1403. static inline function getSuperSampling():Float {
  1404. #if (rp_supersampling == 1.5)
  1405. return 1.5;
  1406. #elseif (rp_supersampling == 2)
  1407. return 2;
  1408. #elseif (rp_supersampling == 4)
  1409. return 4;
  1410. #else
  1411. return 1;
  1412. #end
  1413. }
  1414. static inline function getHdrFormat():String {
  1415. #if rp_hdr
  1416. return "RGBA64";
  1417. #else
  1418. return "RGBA32";
  1419. #end
  1420. }
  1421. static inline function getDisplayp():Null<Int> {
  1422. #if (rp_resolution == 480)
  1423. return 480;
  1424. #elseif (rp_resolution == 720)
  1425. return 720;
  1426. #elseif (rp_resolution == 1080)
  1427. return 1080;
  1428. #elseif (rp_resolution == 1440)
  1429. return 1440;
  1430. #elseif (rp_resolution == 2160)
  1431. return 2160;
  1432. #else
  1433. return null;
  1434. #end
  1435. }
  1436. static inline function getRenderCaptureFormat():String {
  1437. #if (rp_rendercapture_format == "8bit")
  1438. return "RGBA32";
  1439. #elseif (rp_rendercapture_format == "16bit")
  1440. return "RGBA64";
  1441. #elseif (rp_rendercapture_format == "32bit")
  1442. return "RGBA128";
  1443. #else
  1444. return "RGBA32";
  1445. #end
  1446. }
  1447. }