From 436b7fac02ad24424922e49235ad437a36ca81a0 Mon Sep 17 00:00:00 2001 From: Onek8 Date: Wed, 21 May 2025 16:21:05 +0000 Subject: [PATCH] Update leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx --- .../leenkx/renderpath/RenderPathDeferred.hx | 331 +++++++++++------- 1 file changed, 201 insertions(+), 130 deletions(-) diff --git a/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx b/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx index 75a519e..caf8b68 100644 --- a/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx +++ b/leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx @@ -15,6 +15,11 @@ class RenderPathDeferred { static var bloomUpsampler: Upsampler; #end + #if (rp_ssgi == "SSGI") + static var ssgitex = "singleb"; + static var ssgitexb = "singleb"; + #end + public static inline function setTargetMeshes() { //Always keep the order of render targets the same as defined in compiled.inc path.setTarget("gbuffer0", [ @@ -57,12 +62,11 @@ class RenderPathDeferred { Inc.initGI("voxels"); Inc.initGI("voxelsOut"); Inc.initGI("voxelsOutB"); - #if (lnx_voxelgi_shadows || rp_voxels == "Voxel GI") + #if (rp_voxels == "Voxel GI" || lnx_voxelgi_shadows) Inc.initGI("voxelsSDF"); Inc.initGI("voxelsSDFtmp"); #end #if (rp_voxels == "Voxel GI") - Inc.initGI("voxelsLight"); Inc.initGI("voxels_diffuse"); Inc.initGI("voxels_specular"); #else @@ -195,16 +199,26 @@ class RenderPathDeferred { path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x"); path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); } + #elseif (rp_ssgi == "SSGI") + { + path.loadShader("shader_datas/ssgi_pass/ssgi_pass"); + path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x"); + path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); + } #end - #if ((rp_ssgi != "Off") || rp_volumetriclight) + #if (rp_ssgi != "Off") { var t = new RenderTargetRaw(); t.name = "singlea"; t.width = 0; t.height = 0; t.displayp = Inc.getDisplayp(); + #if (rp_ssgi == "SSGI") + t.format = "RGBA32"; + #else t.format = "R8"; + #end t.scale = Inc.getSuperSampling(); #if rp_ssgi_half t.scale *= 0.5; @@ -216,6 +230,38 @@ class RenderPathDeferred { t.width = 0; t.height = 0; t.displayp = Inc.getDisplayp(); + #if (rp_ssgi == "SSGI") + t.format = "RGBA32"; + #else + t.format = "R8"; + #end + t.scale = Inc.getSuperSampling(); + #if rp_ssgi_half + t.scale *= 0.5; + #end + path.createRenderTarget(t); + } + #end + + #if rp_volumetriclight + { + var t = new RenderTargetRaw(); + t.name = "volumetrica"; + t.width = 0; + t.height = 0; + t.displayp = Inc.getDisplayp(); + t.format = "R8"; + t.scale = Inc.getSuperSampling(); + #if rp_ssgi_half // Do we keep this ? + t.scale *= 0.5; + #end + path.createRenderTarget(t); + + var t = new RenderTargetRaw(); + t.name = "volumetricb"; + t.width = 0; + t.height = 0; + t.displayp = Inc.getDisplayp(); t.format = "R8"; t.scale = Inc.getSuperSampling(); #if rp_ssgi_half @@ -358,6 +404,7 @@ class RenderPathDeferred { path.loadShader("shader_datas/ssrefr_pass/ssrefr_pass"); path.loadShader("shader_datas/copy_pass/copy_pass"); + path.createDepthBuffer("refraction", "DEPTH24"); // holds background depth var t = new RenderTargetRaw(); t.name = "gbufferD1"; @@ -473,13 +520,6 @@ class RenderPathDeferred { } #end - #if rp_ssrefr - { - path.setTarget("gbuffer_refraction"); - path.clearTarget(0xffffff00); - } - #end - RenderPathCreator.setTargetMeshes(); #if rp_dynres @@ -524,30 +564,16 @@ class RenderPathDeferred { path.drawShader("shader_datas/downsample_depth/downsample_depth"); #end - #if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO")) - { - if (leenkx.data.Config.raw.rp_ssgi != false) { - path.setTarget("singlea"); - #if rp_ssgi_half - path.bindTarget("half", "gbufferD"); - #else - path.bindTarget("_main", "gbufferD"); - #end - path.bindTarget("gbuffer0", "gbuffer0"); - path.drawShader("shader_datas/ssgi_pass/ssgi_pass"); + #if (rp_shadowmap) + // atlasing is exclusive for now + #if lnx_shadowmap_atlas + Inc.drawShadowMapAtlas(); + #else + Inc.drawShadowMap(); + #end + #end - path.setTarget("singleb"); - path.bindTarget("singlea", "tex"); - path.bindTarget("gbuffer0", "gbuffer0"); - path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x"); - - path.setTarget("singlea"); - path.bindTarget("singleb", "tex"); - path.bindTarget("gbuffer0", "gbuffer0"); - path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); - } - } - #elseif (rp_ssgi == "SSAO") + #if (rp_ssgi == "SSAO") { if (leenkx.data.Config.raw.rp_ssgi != false) { path.setTarget("singlea"); @@ -566,15 +592,43 @@ class RenderPathDeferred { path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); } } - #end + #elseif (rp_ssgi == "SSGI") + { + if (leenkx.data.Config.raw.rp_ssgi != false) { + path.setTarget("singlea"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("gbuffer1", "gbuffer1"); + #if rp_gbuffer_emission + { + path.bindTarget("gbuffer_emission", "gbufferEmission"); + } + #end + #if rp_gbuffer2 + path.bindTarget("gbuffer2", "sveloc"); + #end + #if rp_shadowmap + { + #if lnx_shadowmap_atlas + Inc.bindShadowMapAtlas(); + #else + Inc.bindShadowMap(); + #end + } + #end - #if (rp_shadowmap) - // atlasing is exclusive for now - #if lnx_shadowmap_atlas - Inc.drawShadowMapAtlas(); - #else - Inc.drawShadowMap(); - #end + path.drawShader("shader_datas/ssgi_pass/ssgi_pass"); + path.setTarget("singleb"); + path.bindTarget("singlea", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x"); + + path.setTarget("singlea"); + path.bindTarget("singleb", "tex"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); + } + } #end // Voxels @@ -587,9 +641,6 @@ class RenderPathDeferred { if (iron.RenderPath.pre_clear == true) { - #if (rp_voxels == "Voxel GI") - path.clearImage("voxelsLight", 0x00000000); - #end path.clearImage("voxels", 0x00000000); path.clearImage("voxelsOut", 0x00000000); path.clearImage("voxelsOutB", 0x00000000); @@ -601,22 +652,26 @@ class RenderPathDeferred { } else { - #if (rp_voxels == "Voxel GI") - path.clearImage("voxelsLight", 0x00000000); - #end path.clearImage("voxels", 0x00000000); Inc.computeVoxelsOffsetPrev(); } path.setTarget(""); + path.bindTarget("voxels", "voxels"); + #if rp_shadowmap + { + #if lnx_shadowmap_atlas + Inc.bindShadowMapAtlas(); + #else + Inc.bindShadowMap(); + #end + } + #end + var res = iron.RenderPath.getVoxelRes(); path.setViewport(res, res); - path.bindTarget("voxels", "voxels"); path.drawMeshes("voxel"); - #if (rp_voxels == "Voxel GI") - Inc.computeVoxelsLight(); - #end Inc.computeVoxelsTemporal(); @@ -632,6 +687,10 @@ class RenderPathDeferred { #else path.clearImage("voxels_ao", 0x00000000); #end + #if lnx_voxelgi_shadows + path.bindTarget("voxelsOut", "voxels"); + path.bindTarget("voxelsSDF", "voxelsSDF"); + #end } } #end @@ -767,15 +826,9 @@ class RenderPathDeferred { } #end - #if (rp_translucency && !rp_ssrefr) - { - Inc.drawTranslucency("tex"); - } - #end - #if rp_volumetriclight { - path.setTarget("singlea"); + path.setTarget("volumetrica"); path.bindTarget("_main", "gbufferD"); #if lnx_shadowmap_atlas Inc.bindShadowMapAtlas(); @@ -784,85 +837,16 @@ class RenderPathDeferred { #end path.drawShader("shader_datas/volumetric_light/volumetric_light"); - path.setTarget("singleb"); - path.bindTarget("singlea", "tex"); + path.setTarget("volumetricb"); + path.bindTarget("volumetrica", "tex"); path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x"); path.setTarget("tex"); - path.bindTarget("singleb", "tex"); + path.bindTarget("volumetricb", "tex"); path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y"); } #end - #if rp_bloom - { - inline Inc.drawBloom("tex", bloomDownsampler, bloomUpsampler); - } - #end - - #if rp_sss - { - #if (!kha_opengl) - path.setDepthFrom("tex", "gbuffer1"); // Unbind depth so we can read it - #end - - path.setTarget("buf"); - path.bindTarget("tex", "tex"); - path.bindTarget("_main", "gbufferD"); - path.bindTarget("gbuffer0", "gbuffer0"); - path.drawShader("shader_datas/sss_pass/sss_pass_x"); - - path.setTarget("tex"); - path.bindTarget("buf", "tex"); - path.bindTarget("_main", "gbufferD"); - path.bindTarget("gbuffer0", "gbuffer0"); - path.drawShader("shader_datas/sss_pass/sss_pass_y"); - - #if (!kha_opengl) - path.setDepthFrom("tex", "gbuffer0"); - #end - } - #end - - #if rp_ssrefr - { - if (leenkx.data.Config.raw.rp_ssrefr != false) - { - //save depth - path.setTarget("gbufferD1"); - path.bindTarget("_main", "tex"); - path.drawShader("shader_datas/copy_pass/copy_pass"); - - //save background color - path.setTarget("refr"); - path.bindTarget("tex", "tex"); - path.drawShader("shader_datas/copy_pass/copy_pass"); - - path.setTarget("gbuffer0", ["tex", "gbuffer_refraction"]); - - #if (rp_voxels != "Off") - { - path.bindTarget("voxelsOut", "voxels"); - path.bindTarget("voxelsSDF", "voxelsSDF"); - path.bindTarget("gbuffer2", "gbuffer2"); - } - #end - - path.drawMeshes("refraction"); - - path.setTarget("tex"); - path.bindTarget("tex", "tex"); - path.bindTarget("refr", "tex1"); - path.bindTarget("_main", "gbufferD"); - path.bindTarget("gbufferD1", "gbufferD1"); - path.bindTarget("gbuffer0", "gbuffer0"); - path.bindTarget("gbuffer_refraction", "gbuffer_refraction"); - - path.drawShader("shader_datas/ssrefr_pass/ssrefr_pass"); - } - } - #end - #if rp_ssr { if (leenkx.data.Config.raw.rp_ssr != false) { @@ -907,6 +891,87 @@ class RenderPathDeferred { } #end + #if rp_sss + { + #if (!kha_opengl) + path.setDepthFrom("tex", "gbuffer1"); // Unbind depth so we can read it + #end + + path.setTarget("buf"); + path.bindTarget("tex", "tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("shader_datas/sss_pass/sss_pass_x"); + + path.setTarget("tex"); + path.bindTarget("buf", "tex"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.drawShader("shader_datas/sss_pass/sss_pass_y"); + + #if (!kha_opengl) + path.setDepthFrom("tex", "gbuffer0"); + #end + } + #end + + #if (rp_translucency && !rp_ssrefr) + { + Inc.drawTranslucency("tex"); + } + #end + + #if rp_ssrefr + { + if (leenkx.data.Config.raw.rp_ssrefr != false) + { + //save depth + path.setTarget("gbufferD1"); + path.bindTarget("_main", "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + + //save background color + path.setTarget("refr"); + path.bindTarget("tex", "tex"); + path.drawShader("shader_datas/copy_pass/copy_pass"); + + path.setTarget("gbuffer0", ["tex", "gbuffer_refraction"]); + + #if rp_shadowmap + { + #if lnx_shadowmap_atlas + Inc.bindShadowMapAtlas(); + #else + Inc.bindShadowMap(); + #end + } + #end + + #if (rp_voxels != "Off") + { + path.bindTarget("voxelsOut", "voxels"); + path.bindTarget("voxelsSDF", "voxelsSDF"); + #if rp_gbuffer2 + path.bindTarget("gbuffer2", "gbuffer2"); + #end + } + #end + + path.drawMeshes("refraction"); + + path.setTarget("tex"); + path.bindTarget("tex", "tex"); + path.bindTarget("refr", "tex1"); + path.bindTarget("_main", "gbufferD"); + path.bindTarget("gbufferD1", "gbufferD1"); + path.bindTarget("gbuffer0", "gbuffer0"); + path.bindTarget("gbuffer_refraction", "gbuffer_refraction"); + + path.drawShader("shader_datas/ssrefr_pass/ssrefr_pass"); + } + } + #end + #if ((rp_motionblur == "Camera") || (rp_motionblur == "Object")) { if (leenkx.data.Config.raw.rp_motionblur != false) { @@ -971,6 +1036,12 @@ class RenderPathDeferred { } #end + #if rp_bloom + { + inline Inc.drawBloom("tex", bloomDownsampler, bloomUpsampler); + } + #end + #if (rp_supersampling == 4) var framebuffer = "buf"; #else