RenderPathForward.hx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. package arm.renderpath;
  2. import iron.RenderPath;
  3. import armory.renderpath.Inc;
  4. class RenderPathForward {
  5. #if (rp_renderer == "Forward")
  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_render_to_texture
  22. {
  23. path.createDepthBuffer("main", "DEPTH24");
  24. var t = new RenderTargetRaw();
  25. t.name = "lbuf";
  26. t.width = 0;
  27. t.height = 0;
  28. t.format = Inc.getHdrFormat();
  29. t.displayp = Inc.getDisplayp();
  30. var ss = Inc.getSuperSampling();
  31. if (ss != 1) t.scale = ss;
  32. t.depth_buffer = "main";
  33. path.createRenderTarget(t);
  34. #if rp_compositornodes
  35. {
  36. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  37. }
  38. #else
  39. {
  40. path.loadShader("shader_datas/copy_pass/copy_pass");
  41. }
  42. #end
  43. #if ((rp_supersampling == 4) || (rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  44. {
  45. var t = new RenderTargetRaw();
  46. t.name = "buf";
  47. t.width = 0;
  48. t.height = 0;
  49. t.format = 'RGBA32';
  50. t.displayp = Inc.getDisplayp();
  51. var ss = Inc.getSuperSampling();
  52. if (ss != 1) t.scale = ss;
  53. t.depth_buffer = "main";
  54. path.createRenderTarget(t);
  55. }
  56. #end
  57. #if (rp_supersampling == 4)
  58. {
  59. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  60. }
  61. #end
  62. }
  63. #end
  64. #if (rp_translucency)
  65. {
  66. Inc.initTranslucency();
  67. }
  68. #end
  69. #if (rp_gi != "Off")
  70. {
  71. Inc.initGI();
  72. #if arm_voxelgi_temporal
  73. {
  74. Inc.initGI("voxelsB");
  75. }
  76. #end
  77. #if cpp
  78. #if (rp_gi == "Voxel GI")
  79. {
  80. Inc.initGI("voxelsOpac");
  81. Inc.initGI("voxelsNor");
  82. }
  83. #end
  84. #end //cpp
  85. }
  86. #end
  87. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  88. {
  89. var t = new RenderTargetRaw();
  90. t.name = "bufa";
  91. t.width = 0;
  92. t.height = 0;
  93. t.displayp = Inc.getDisplayp();
  94. t.format = "RGBA32";
  95. var ss = Inc.getSuperSampling();
  96. if (ss != 1) t.scale = ss;
  97. path.createRenderTarget(t);
  98. }
  99. {
  100. var t = new RenderTargetRaw();
  101. t.name = "bufb";
  102. t.width = 0;
  103. t.height = 0;
  104. t.displayp = Inc.getDisplayp();
  105. t.format = "RGBA32";
  106. var ss = Inc.getSuperSampling();
  107. if (ss != 1) t.scale = ss;
  108. path.createRenderTarget(t);
  109. }
  110. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  111. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  112. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  113. #if (rp_antialiasing == "TAA")
  114. {
  115. path.loadShader("shader_datas/taa_pass/taa_pass");
  116. }
  117. #end
  118. #end
  119. #if rp_volumetriclight
  120. {
  121. path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  122. path.loadShader("shader_datas/volumetric_light/volumetric_light");
  123. path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  124. path.loadShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  125. {
  126. var t = new RenderTargetRaw();
  127. t.name = "bufvola";
  128. t.width = 0;
  129. t.height = 0;
  130. t.displayp = Inc.getDisplayp();
  131. t.format = "R8";
  132. var ss = Inc.getSuperSampling();
  133. if (ss != 1) t.scale = ss;
  134. path.createRenderTarget(t);
  135. }
  136. {
  137. var t = new RenderTargetRaw();
  138. t.name = "bufvolb";
  139. t.width = 0;
  140. t.height = 0;
  141. t.displayp = Inc.getDisplayp();
  142. t.format = "R8";
  143. var ss = Inc.getSuperSampling();
  144. if (ss != 1) t.scale = ss;
  145. path.createRenderTarget(t);
  146. }
  147. }
  148. #end
  149. #if rp_bloom
  150. {
  151. var t = new RenderTargetRaw();
  152. t.name = "bloomtex";
  153. t.width = 0;
  154. t.height = 0;
  155. t.scale = 0.25;
  156. t.format = Inc.getHdrFormat();
  157. path.createRenderTarget(t);
  158. }
  159. {
  160. var t = new RenderTargetRaw();
  161. t.name = "bloomtex2";
  162. t.width = 0;
  163. t.height = 0;
  164. t.scale = 0.25;
  165. t.format = Inc.getHdrFormat();
  166. path.createRenderTarget(t);
  167. }
  168. {
  169. path.loadShader("shader_datas/bloom_pass/bloom_pass");
  170. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  171. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  172. path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  173. }
  174. #end
  175. }
  176. public static function commands() {
  177. var hasLamp = iron.Scene.active.lamps.length > 0;
  178. #if rp_shadowmap
  179. {
  180. if (hasLamp) {
  181. Inc.drawShadowMap(iron.Scene.active.lamps[0]);
  182. }
  183. }
  184. #end
  185. #if (rp_gi != "Off")
  186. {
  187. var voxelize = path.voxelize();
  188. #if arm_voxelgi_temporal
  189. voxelize = ++RenderPathCreator.voxelFrame % RenderPathCreator.voxelFreq == 0;
  190. if (voxelize) {
  191. voxels = voxels == "voxels" ? "voxelsB" : "voxels";
  192. voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
  193. }
  194. #end
  195. #if cpp
  196. if (voxelize) {
  197. var res = Inc.getVoxelRes();
  198. #if (rp_gi == "Voxel GI")
  199. var voxtex = "voxelsOpac";
  200. #else
  201. var voxtex = voxels;
  202. #end
  203. path.clearImage(voxtex, 0x00000000);
  204. path.setTarget("");
  205. path.setViewport(res, res);
  206. path.bindTarget(voxtex, "voxels");
  207. path.drawMeshes("voxel");
  208. #if (rp_gi == "Voxel GI")
  209. Inc.computeVoxels();
  210. #if (rp_gi_bounces)
  211. voxels = "voxelsOpac";
  212. #end
  213. #else
  214. path.generateMipmaps(voxels);
  215. #end
  216. }
  217. #else
  218. if (voxelize) {
  219. path.clearImage(voxels, 0x00000000);
  220. path.setTarget("");
  221. var res = Inc.getVoxelRes();
  222. path.setViewport(res, res);
  223. path.bindTarget(voxels, "voxels");
  224. #if ((rp_shadowmap) && (rp_gi == "Voxel GI"))
  225. {
  226. Inc.bindShadowMap();
  227. }
  228. #end
  229. path.drawMeshes("voxel");
  230. path.generateMipmaps(voxels);
  231. }
  232. #end // cpp
  233. }
  234. #end
  235. #if rp_render_to_texture
  236. {
  237. path.setTarget("lbuf");
  238. }
  239. #else
  240. {
  241. path.setTarget("");
  242. }
  243. #end
  244. #if (rp_background == "Clear")
  245. {
  246. path.clearTarget(-1, 1.0);
  247. }
  248. #else
  249. {
  250. path.clearTarget(null, 1.0);
  251. }
  252. #end
  253. #if rp_depthprepass
  254. {
  255. path.drawMeshes("depth");
  256. }
  257. #end
  258. #if rp_shadowmap
  259. {
  260. if (hasLamp) Inc.bindShadowMap();
  261. }
  262. #end
  263. #if (rp_gi != "Off")
  264. {
  265. path.bindTarget(voxels, "voxels");
  266. #if arm_voxelgi_temporal
  267. {
  268. path.bindTarget(voxelsLast, "voxelsLast");
  269. }
  270. #end
  271. }
  272. #end
  273. function drawMeshes() {
  274. path.drawMeshes("mesh");
  275. #if (rp_background == "World")
  276. {
  277. path.drawSkydome("shader_datas/world_pass/world_pass");
  278. }
  279. #end
  280. #if rp_translucency
  281. {
  282. if (hasLamp) Inc.drawTranslucency("lbuf");
  283. }
  284. #end
  285. }
  286. #if rp_stereo
  287. {
  288. path.drawStereo(drawMeshes);
  289. }
  290. #else
  291. {
  292. drawMeshes();
  293. }
  294. #end
  295. #if rp_render_to_texture
  296. {
  297. #if rp_volumetriclight
  298. {
  299. path.setTarget("bufvola");
  300. path.bindTarget("_main", "gbufferD");
  301. Inc.bindShadowMap();
  302. if (path.lampIsSun()) {
  303. path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
  304. }
  305. else {
  306. path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
  307. }
  308. path.setTarget("bufvolb");
  309. path.bindTarget("bufvola", "tex");
  310. path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
  311. path.setTarget("lbuf");
  312. path.bindTarget("bufvolb", "tex");
  313. path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
  314. }
  315. #end
  316. #if rp_bloom
  317. {
  318. path.setTarget("bloomtex");
  319. path.bindTarget("lbuf", "tex");
  320. path.drawShader("shader_datas/bloom_pass/bloom_pass");
  321. path.setTarget("bloomtex2");
  322. path.bindTarget("bloomtex", "tex");
  323. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  324. path.setTarget("bloomtex");
  325. path.bindTarget("bloomtex2", "tex");
  326. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  327. path.setTarget("bloomtex2");
  328. path.bindTarget("bloomtex", "tex");
  329. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  330. path.setTarget("bloomtex");
  331. path.bindTarget("bloomtex2", "tex");
  332. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  333. path.setTarget("bloomtex2");
  334. path.bindTarget("bloomtex", "tex");
  335. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  336. path.setTarget("bloomtex");
  337. path.bindTarget("bloomtex2", "tex");
  338. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
  339. path.setTarget("bloomtex2");
  340. path.bindTarget("bloomtex", "tex");
  341. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
  342. path.setTarget("lbuf");
  343. path.bindTarget("bloomtex2", "tex");
  344. path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
  345. }
  346. #end
  347. #if (rp_supersampling == 4)
  348. var framebuffer = "buf";
  349. #else
  350. var framebuffer = "";
  351. #end
  352. #if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA"))
  353. {
  354. path.setTarget(framebuffer);
  355. }
  356. #else
  357. {
  358. path.setTarget("buf");
  359. }
  360. #end
  361. path.bindTarget("lbuf", "tex");
  362. #if rp_compositordepth
  363. {
  364. path.bindTarget("_main", "gbufferD");
  365. }
  366. #end
  367. #if rp_compositornodes
  368. {
  369. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  370. }
  371. #else
  372. {
  373. path.drawShader("shader_datas/copy_pass/copy_pass");
  374. }
  375. #end
  376. #if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
  377. {
  378. path.setTarget("bufa");
  379. path.clearTarget(0x00000000);
  380. path.bindTarget("buf", "colorTex");
  381. path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  382. path.setTarget("bufb");
  383. path.clearTarget(0x00000000);
  384. path.bindTarget("bufa", "edgesTex");
  385. path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  386. // #if (rp_antialiasing == "TAA")
  387. // path.setTarget("bufa");
  388. // #else
  389. path.setTarget(framebuffer);
  390. // #end
  391. path.bindTarget("buf", "colorTex");
  392. path.bindTarget("bufb", "blendTex");
  393. // #if (rp_antialiasing == "TAA")
  394. // {
  395. // path.bindTarget("gbuffer2", "sveloc");
  396. // }
  397. // #end
  398. path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  399. // #if (rp_antialiasing == "TAA")
  400. // {
  401. // path.setTarget(framebuffer);
  402. // path.bindTarget("bufa", "tex");
  403. // path.bindTarget("taa", "tex2");
  404. // path.bindTarget("gbuffer2", "sveloc");
  405. // path.drawShader("shader_datas/taa_pass/taa_pass");
  406. // path.setTarget("taa");
  407. // path.bindTarget("bufa", "tex");
  408. // path.drawShader("shader_datas/copy_pass/copy_pass");
  409. // }
  410. // #end
  411. }
  412. #end
  413. #if (rp_supersampling == 4)
  414. {
  415. var final = "";
  416. path.setTarget(final);
  417. path.bindTarget(framebuffer, "tex");
  418. path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
  419. }
  420. #end
  421. }
  422. #end
  423. #if rp_overlays
  424. {
  425. path.clearTarget(null, 1.0);
  426. path.drawMeshes("overlay");
  427. }
  428. #end
  429. }
  430. #end
  431. }