RenderPathDeferred.hx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package arm.render;
  2. import iron.RenderPath;
  3. class RenderPathDeferred {
  4. public static var path: RenderPath;
  5. public static function init(_path: RenderPath) {
  6. path = _path;
  7. path.createDepthBuffer("main", "DEPTH24");
  8. {
  9. var t = new RenderTargetRaw();
  10. t.name = "gbuffer0";
  11. t.width = 0;
  12. t.height = 0;
  13. t.format = "RGBA64";
  14. t.scale = RenderPathBase.getSuperSampling();
  15. t.depth_buffer = "main";
  16. path.createRenderTarget(t);
  17. }
  18. {
  19. var t = new RenderTargetRaw();
  20. t.name = "gbuffer1";
  21. t.width = 0;
  22. t.height = 0;
  23. t.format = "RGBA64";
  24. t.scale = RenderPathBase.getSuperSampling();
  25. path.createRenderTarget(t);
  26. }
  27. {
  28. var t = new RenderTargetRaw();
  29. t.name = "gbuffer2";
  30. t.width = 0;
  31. t.height = 0;
  32. t.format = "RGBA64";
  33. t.scale = RenderPathBase.getSuperSampling();
  34. path.createRenderTarget(t);
  35. }
  36. {
  37. var t = new RenderTargetRaw();
  38. t.name = "tex";
  39. t.width = 0;
  40. t.height = 0;
  41. t.format = "RGBA64";
  42. t.scale = RenderPathBase.getSuperSampling();
  43. #if kha_opengl
  44. t.depth_buffer = "main";
  45. #end
  46. path.createRenderTarget(t);
  47. }
  48. {
  49. var t = new RenderTargetRaw();
  50. t.name = "buf";
  51. t.width = 0;
  52. t.height = 0;
  53. #if (kha_direct3d12 || kha_vulkan)// || kha_metal)
  54. // Match raytrace_target format
  55. // Will cause "The render target format in slot 0 does not match that specified by the current pipeline state"
  56. t.format = "RGBA64";
  57. #else
  58. t.format = "RGBA32";
  59. #end
  60. t.scale = RenderPathBase.getSuperSampling();
  61. path.createRenderTarget(t);
  62. }
  63. {
  64. var t = new RenderTargetRaw();
  65. t.name = "buf2";
  66. t.width = 0;
  67. t.height = 0;
  68. t.format = "RGBA32";
  69. t.scale = RenderPathBase.getSuperSampling();
  70. path.createRenderTarget(t);
  71. }
  72. {
  73. var t = new RenderTargetRaw();
  74. t.name = "taa";
  75. t.width = 0;
  76. t.height = 0;
  77. t.format = "RGBA32";
  78. t.scale = RenderPathBase.getSuperSampling();
  79. path.createRenderTarget(t);
  80. }
  81. {
  82. var t = new RenderTargetRaw();
  83. t.name = "taa2";
  84. t.width = 0;
  85. t.height = 0;
  86. t.format = "RGBA32";
  87. t.scale = RenderPathBase.getSuperSampling();
  88. path.createRenderTarget(t);
  89. }
  90. {
  91. var t = new RenderTargetRaw();
  92. t.name = "empty_white";
  93. t.width = 1;
  94. t.height = 1;
  95. t.format = "R8";
  96. var rt = new RenderTarget(t);
  97. var b = haxe.io.Bytes.alloc(1);
  98. b.set(0, 255);
  99. rt.image = kha.Image.fromBytes(b, t.width, t.height, kha.graphics4.TextureFormat.L8);
  100. path.renderTargets.set(t.name, rt);
  101. }
  102. {
  103. var t = new RenderTargetRaw();
  104. t.name = "empty_black";
  105. t.width = 1;
  106. t.height = 1;
  107. t.format = "RGBA32";
  108. var rt = new RenderTarget(t);
  109. var b = haxe.io.Bytes.alloc(4);
  110. b.set(0, 0);
  111. b.set(1, 0);
  112. b.set(2, 0);
  113. b.set(3, 0);
  114. rt.image = kha.Image.fromBytes(b, t.width, t.height, kha.graphics4.TextureFormat.RGBA32);
  115. path.renderTargets.set(t.name, rt);
  116. }
  117. #if is_sculpt
  118. {
  119. var t = new RenderTargetRaw();
  120. t.name = "gbuffer0_undo";
  121. t.width = 0;
  122. t.height = 0;
  123. t.format = "RGBA64";
  124. t.scale = RenderPathBase.getSuperSampling();
  125. path.createRenderTarget(t);
  126. }
  127. {
  128. var t = new RenderTargetRaw();
  129. t.name = "gbufferD_undo";
  130. t.width = 0;
  131. t.height = 0;
  132. t.format = "R32";
  133. t.scale = RenderPathBase.getSuperSampling();
  134. path.createRenderTarget(t);
  135. }
  136. #end
  137. if (Config.raw.rp_ssao) {
  138. RenderPathBase.initSSAO();
  139. }
  140. path.loadShader("shader_datas/world_pass/world_pass");
  141. path.loadShader("shader_datas/deferred_light/deferred_light");
  142. path.loadShader("shader_datas/compositor_pass/compositor_pass");
  143. path.loadShader("shader_datas/copy_pass/copy_pass");
  144. path.loadShader("shader_datas/copy_pass/copyR8_pass");
  145. path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
  146. path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
  147. path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
  148. path.loadShader("shader_datas/taa_pass/taa_pass");
  149. path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
  150. // path.loadShader("shader_datas/motion_blur_pass/motion_blur_pass");
  151. // path.loadShader("shader_datas/motion_blur_veloc_pass/motion_blur_veloc_pass");
  152. #if rp_voxels
  153. {
  154. RenderPathBase.initVoxels();
  155. path.loadShader("shader_datas/deferred_light/deferred_light_voxel");
  156. }
  157. #end
  158. RenderPathPaint.init(path);
  159. #if (is_paint || is_sculpt)
  160. RenderPathPreview.init(path);
  161. #end
  162. #if (kha_direct3d12 || kha_vulkan || kha_metal)
  163. RenderPathRaytrace.init(path);
  164. #end
  165. }
  166. public static function commands() {
  167. #if is_paint
  168. RenderPathPaint.liveBrushDirty();
  169. #end
  170. RenderPathBase.commands(drawDeferred);
  171. }
  172. public static function drawDeferred() {
  173. RenderPathBase.drawSSAO();
  174. #if rp_voxels
  175. RenderPathBase.drawVoxels();
  176. #end
  177. RenderPathBase.drawDeferredLight();
  178. RenderPathBase.drawBloom();
  179. RenderPathBase.drawSSR();
  180. // RenderPathBase.drawMotionBlur();
  181. // RenderPathBase.drawHistogram();
  182. path.setTarget("buf");
  183. path.bindTarget("tex", "tex");
  184. // path.bindTarget("histogram", "histogram");
  185. path.drawShader("shader_datas/compositor_pass/compositor_pass");
  186. path.setTarget("buf");
  187. RenderPathBase.drawCompass(path.currentG);
  188. path.drawMeshes("overlay");
  189. RenderPathBase.drawTAA();
  190. }
  191. }