Update leenkx/Sources/leenkx/renderpath/RenderPathDeferred.hx

This commit is contained in:
2025-05-21 16:21:05 +00:00
parent 9ef9f5a637
commit 436b7fac02

View File

@ -15,6 +15,11 @@ class RenderPathDeferred {
static var bloomUpsampler: Upsampler; static var bloomUpsampler: Upsampler;
#end #end
#if (rp_ssgi == "SSGI")
static var ssgitex = "singleb";
static var ssgitexb = "singleb";
#end
public static inline function setTargetMeshes() { public static inline function setTargetMeshes() {
//Always keep the order of render targets the same as defined in compiled.inc //Always keep the order of render targets the same as defined in compiled.inc
path.setTarget("gbuffer0", [ path.setTarget("gbuffer0", [
@ -57,12 +62,11 @@ class RenderPathDeferred {
Inc.initGI("voxels"); Inc.initGI("voxels");
Inc.initGI("voxelsOut"); Inc.initGI("voxelsOut");
Inc.initGI("voxelsOutB"); Inc.initGI("voxelsOutB");
#if (lnx_voxelgi_shadows || rp_voxels == "Voxel GI") #if (rp_voxels == "Voxel GI" || lnx_voxelgi_shadows)
Inc.initGI("voxelsSDF"); Inc.initGI("voxelsSDF");
Inc.initGI("voxelsSDFtmp"); Inc.initGI("voxelsSDFtmp");
#end #end
#if (rp_voxels == "Voxel GI") #if (rp_voxels == "Voxel GI")
Inc.initGI("voxelsLight");
Inc.initGI("voxels_diffuse"); Inc.initGI("voxels_diffuse");
Inc.initGI("voxels_specular"); Inc.initGI("voxels_specular");
#else #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_x");
path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); 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 #end
#if ((rp_ssgi != "Off") || rp_volumetriclight) #if (rp_ssgi != "Off")
{ {
var t = new RenderTargetRaw(); var t = new RenderTargetRaw();
t.name = "singlea"; t.name = "singlea";
t.width = 0; t.width = 0;
t.height = 0; t.height = 0;
t.displayp = Inc.getDisplayp(); t.displayp = Inc.getDisplayp();
#if (rp_ssgi == "SSGI")
t.format = "RGBA32";
#else
t.format = "R8"; t.format = "R8";
#end
t.scale = Inc.getSuperSampling(); t.scale = Inc.getSuperSampling();
#if rp_ssgi_half #if rp_ssgi_half
t.scale *= 0.5; t.scale *= 0.5;
@ -216,6 +230,38 @@ class RenderPathDeferred {
t.width = 0; t.width = 0;
t.height = 0; t.height = 0;
t.displayp = Inc.getDisplayp(); 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.format = "R8";
t.scale = Inc.getSuperSampling(); t.scale = Inc.getSuperSampling();
#if rp_ssgi_half #if rp_ssgi_half
@ -358,6 +404,7 @@ class RenderPathDeferred {
path.loadShader("shader_datas/ssrefr_pass/ssrefr_pass"); path.loadShader("shader_datas/ssrefr_pass/ssrefr_pass");
path.loadShader("shader_datas/copy_pass/copy_pass"); path.loadShader("shader_datas/copy_pass/copy_pass");
path.createDepthBuffer("refraction", "DEPTH24");
// holds background depth // holds background depth
var t = new RenderTargetRaw(); var t = new RenderTargetRaw();
t.name = "gbufferD1"; t.name = "gbufferD1";
@ -473,13 +520,6 @@ class RenderPathDeferred {
} }
#end #end
#if rp_ssrefr
{
path.setTarget("gbuffer_refraction");
path.clearTarget(0xffffff00);
}
#end
RenderPathCreator.setTargetMeshes(); RenderPathCreator.setTargetMeshes();
#if rp_dynres #if rp_dynres
@ -524,30 +564,16 @@ class RenderPathDeferred {
path.drawShader("shader_datas/downsample_depth/downsample_depth"); path.drawShader("shader_datas/downsample_depth/downsample_depth");
#end #end
#if ((rp_ssgi == "RTGI") || (rp_ssgi == "RTAO")) #if (rp_shadowmap)
{ // atlasing is exclusive for now
if (leenkx.data.Config.raw.rp_ssgi != false) { #if lnx_shadowmap_atlas
path.setTarget("singlea"); Inc.drawShadowMapAtlas();
#if rp_ssgi_half #else
path.bindTarget("half", "gbufferD"); Inc.drawShadowMap();
#else #end
path.bindTarget("_main", "gbufferD"); #end
#end
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
path.setTarget("singleb"); #if (rp_ssgi == "SSAO")
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 (leenkx.data.Config.raw.rp_ssgi != false) { if (leenkx.data.Config.raw.rp_ssgi != false) {
path.setTarget("singlea"); path.setTarget("singlea");
@ -566,15 +592,43 @@ class RenderPathDeferred {
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y"); 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) path.drawShader("shader_datas/ssgi_pass/ssgi_pass");
// atlasing is exclusive for now path.setTarget("singleb");
#if lnx_shadowmap_atlas path.bindTarget("singlea", "tex");
Inc.drawShadowMapAtlas(); path.bindTarget("gbuffer0", "gbuffer0");
#else path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
Inc.drawShadowMap();
#end path.setTarget("singlea");
path.bindTarget("singleb", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y");
}
}
#end #end
// Voxels // Voxels
@ -587,9 +641,6 @@ class RenderPathDeferred {
if (iron.RenderPath.pre_clear == true) if (iron.RenderPath.pre_clear == true)
{ {
#if (rp_voxels == "Voxel GI")
path.clearImage("voxelsLight", 0x00000000);
#end
path.clearImage("voxels", 0x00000000); path.clearImage("voxels", 0x00000000);
path.clearImage("voxelsOut", 0x00000000); path.clearImage("voxelsOut", 0x00000000);
path.clearImage("voxelsOutB", 0x00000000); path.clearImage("voxelsOutB", 0x00000000);
@ -601,22 +652,26 @@ class RenderPathDeferred {
} }
else else
{ {
#if (rp_voxels == "Voxel GI")
path.clearImage("voxelsLight", 0x00000000);
#end
path.clearImage("voxels", 0x00000000); path.clearImage("voxels", 0x00000000);
Inc.computeVoxelsOffsetPrev(); Inc.computeVoxelsOffsetPrev();
} }
path.setTarget(""); 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(); var res = iron.RenderPath.getVoxelRes();
path.setViewport(res, res); path.setViewport(res, res);
path.bindTarget("voxels", "voxels");
path.drawMeshes("voxel"); path.drawMeshes("voxel");
#if (rp_voxels == "Voxel GI")
Inc.computeVoxelsLight();
#end
Inc.computeVoxelsTemporal(); Inc.computeVoxelsTemporal();
@ -632,6 +687,10 @@ class RenderPathDeferred {
#else #else
path.clearImage("voxels_ao", 0x00000000); path.clearImage("voxels_ao", 0x00000000);
#end #end
#if lnx_voxelgi_shadows
path.bindTarget("voxelsOut", "voxels");
path.bindTarget("voxelsSDF", "voxelsSDF");
#end
} }
} }
#end #end
@ -767,15 +826,9 @@ class RenderPathDeferred {
} }
#end #end
#if (rp_translucency && !rp_ssrefr)
{
Inc.drawTranslucency("tex");
}
#end
#if rp_volumetriclight #if rp_volumetriclight
{ {
path.setTarget("singlea"); path.setTarget("volumetrica");
path.bindTarget("_main", "gbufferD"); path.bindTarget("_main", "gbufferD");
#if lnx_shadowmap_atlas #if lnx_shadowmap_atlas
Inc.bindShadowMapAtlas(); Inc.bindShadowMapAtlas();
@ -784,85 +837,16 @@ class RenderPathDeferred {
#end #end
path.drawShader("shader_datas/volumetric_light/volumetric_light"); path.drawShader("shader_datas/volumetric_light/volumetric_light");
path.setTarget("singleb"); path.setTarget("volumetricb");
path.bindTarget("singlea", "tex"); path.bindTarget("volumetrica", "tex");
path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x"); path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
path.setTarget("tex"); path.setTarget("tex");
path.bindTarget("singleb", "tex"); path.bindTarget("volumetricb", "tex");
path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y"); path.drawShader("shader_datas/blur_bilat_blend_pass/blur_bilat_blend_pass_y");
} }
#end #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 rp_ssr
{ {
if (leenkx.data.Config.raw.rp_ssr != false) { if (leenkx.data.Config.raw.rp_ssr != false) {
@ -907,6 +891,87 @@ class RenderPathDeferred {
} }
#end #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 ((rp_motionblur == "Camera") || (rp_motionblur == "Object"))
{ {
if (leenkx.data.Config.raw.rp_motionblur != false) { if (leenkx.data.Config.raw.rp_motionblur != false) {
@ -971,6 +1036,12 @@ class RenderPathDeferred {
} }
#end #end
#if rp_bloom
{
inline Inc.drawBloom("tex", bloomDownsampler, bloomUpsampler);
}
#end
#if (rp_supersampling == 4) #if (rp_supersampling == 4)
var framebuffer = "buf"; var framebuffer = "buf";
#else #else