Update renderpath

This commit is contained in:
Lubos Lenco
2018-01-16 17:58:09 +01:00
parent dd83daf6e6
commit 8fdceaed1d
5 changed files with 447 additions and 61 deletions
+445 -50
View File
@@ -14,20 +14,20 @@ class RenderPathCreator {
return path;
}
#if (rp_gi != "Off")
static var voxels = "voxels";
static var voxelsLast = "voxels";
public static var voxelFrame = 0;
public static var voxelFreq = 6; // Revoxelizing frequency
#end
#if (rp_renderer == "Forward")
static function init() {
// #if rp_shadowmap // Auto-created
// {
// var size = getShadowmapSize();
// var t = new RenderTargetRaw();
// t.name = "shadowMap";
// t.width = size;
// t.height = size;
// t.format = "DEPTH16";
// path.createRenderTarget(t);
// }
// #end
#if (rp_shadowmap && kha_webgl)
initEmpty();
#end
#if (rp_background == "World")
{
path.loadShader("shader_datas/world_pass/world_pass");
@@ -58,6 +58,23 @@ class RenderPathCreator {
path.loadShader("shader_datas/copy_pass/copy_pass");
}
#end
#if (rp_supersampling == 4)
{
var t = new RenderTargetRaw();
t.name = "buf";
t.width = 0;
t.height = 0;
t.format = 'RGBA32';
t.displayp = getDisplayp();
var ss = getSuperSampling();
if (ss != 1) t.scale = ss;
t.depth_buffer = "main";
path.createRenderTarget(t);
path.loadShader("shader_datas/supersample_resolve/supersample_resolve");
}
#end
}
#end
@@ -70,6 +87,105 @@ class RenderPathCreator {
#if (rp_gi != "Off")
{
initGI();
#if arm_voxelgi_temporal
{
initGI("voxelsB");
}
#end
}
#end
#if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
{
var t = new RenderTargetRaw();
t.name = "bufa";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "RGBA32";
var ss = getSuperSampling();
if (ss != 1) t.scale = ss;
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "bufb";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "RGBA32";
var ss = getSuperSampling();
if (ss != 1) t.scale = ss;
path.createRenderTarget(t);
}
path.loadShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
path.loadShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
path.loadShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
#if (rp_antialiasing == "TAA")
{
path.loadShader("shader_datas/taa_pass/taa_pass");
}
#end
#end
#if rp_volumetriclight
{
path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
path.loadShader("shader_datas/volumetric_light/volumetric_light");
path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
{
var t = new RenderTargetRaw();
t.name = "bufvola";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "R8";
var ss = getSuperSampling();
if (ss != 1) t.scale = ss;
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "bufvolb";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "R8";
var ss = getSuperSampling();
if (ss != 1) t.scale = ss;
path.createRenderTarget(t);
}
}
#end
#if rp_bloom
{
var t = new RenderTargetRaw();
t.name = "bloomtex";
t.width = 0;
t.height = 0;
t.scale = 0.25;
t.format = getHdrFormat();
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "bloomtex2";
t.width = 0;
t.height = 0;
t.scale = 0.25;
t.format = getHdrFormat();
path.createRenderTarget(t);
}
{
path.loadShader("shader_datas/bloom_pass/bloom_pass");
path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.loadShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
}
#end
}
@@ -81,7 +197,7 @@ class RenderPathCreator {
var faces = path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube ? 6 : 1;
for (i in 0...faces) {
if (faces > 1) path.currentFace = i;
path.setTarget("shadowMap");
path.setTarget(getShadowMap());
path.clearTarget(null, 1.0);
path.drawMeshes("shadowmap");
}
@@ -91,19 +207,30 @@ class RenderPathCreator {
#if (rp_gi != "Off")
{
if (path.voxelize()) {
path.clearImage("voxels", 0x00000000);
var voxelize = path.voxelize();
#if arm_voxelgi_temporal
voxelize = ++voxelFrame % voxelFreq == 0;
if (voxelize) {
voxels = voxels == "voxels" ? "voxelsB" : "voxels";
voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
}
#end
if (voxelize) {
path.clearImage(voxels, 0x00000000);
path.setTarget("");
var res = getVoxelRes();
path.setViewport(res, res);
path.bindTarget("voxels", "voxels");
path.bindTarget(voxels, "voxels");
#if rp_shadowmap
{
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
}
#end
path.drawMeshes("voxel");
path.generateMipmaps("voxels");
path.generateMipmaps(voxels);
}
}
#end
@@ -136,13 +263,18 @@ class RenderPathCreator {
#if rp_shadowmap
{
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
}
#end
#if (rp_gi != "Off")
{
path.bindTarget("voxels", "voxels");
path.bindTarget(voxels, "voxels");
#if arm_voxelgi_temporal
{
path.bindTarget(voxelsLast, "voxelsLast");
}
#end
}
#end
@@ -173,9 +305,92 @@ class RenderPathCreator {
#if rp_render_to_texture
{
path.setTarget("");
#if rp_volumetriclight
{
path.setTarget("bufvola");
path.bindTarget("_main", "gbufferD");
bindShadowMap();
if (path.lampIsSun()) {
path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
}
else {
path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
}
path.setTarget("bufvolb");
path.bindTarget("bufvola", "tex");
path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
path.setTarget("lbuf");
path.bindTarget("bufvolb", "tex");
path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
}
#end
#if rp_bloom
{
path.setTarget("bloomtex");
path.bindTarget("lbuf", "tex");
path.drawShader("shader_datas/bloom_pass/bloom_pass");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("bloomtex");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y");
path.setTarget("bloomtex2");
path.bindTarget("bloomtex", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_x");
path.setTarget("lbuf");
path.bindTarget("bloomtex2", "tex");
path.drawShader("shader_datas/blur_gaus_pass/blur_gaus_pass_y_blend");
}
#end
#if (rp_supersampling == 4)
var framebuffer = "buf";
#else
var framebuffer = "";
#end
#if ((rp_antialiasing == "Off") || (rp_antialiasing == "FXAA"))
{
path.setTarget(framebuffer);
}
#else
{
path.setTarget("buf");
}
#end
path.bindTarget("lbuf", "tex");
#if rp_compositordepth
{
path.bindTarget("_main", "gbufferD");
}
#end
#if rp_compositornodes
{
path.drawShader("shader_datas/compositor_pass/compositor_pass");
@@ -185,6 +400,57 @@ class RenderPathCreator {
path.drawShader("shader_datas/copy_pass/copy_pass");
}
#end
#if ((rp_antialiasing == "SMAA") || (rp_antialiasing == "TAA"))
{
path.setTarget("bufa");
path.clearTarget(0x00000000);
path.bindTarget("lbuf", "colorTex");
path.drawShader("shader_datas/smaa_edge_detect/smaa_edge_detect");
path.setTarget("bufb");
path.clearTarget(0x00000000);
path.bindTarget("bufa", "edgesTex");
path.drawShader("shader_datas/smaa_blend_weight/smaa_blend_weight");
// #if (rp_antialiasing == "TAA")
// path.setTarget("bufa");
// #else
path.setTarget(framebuffer);
// #end
path.bindTarget("lbuf", "colorTex");
path.bindTarget("bufb", "blendTex");
// #if (rp_antialiasing == "TAA")
// {
// path.bindTarget("gbuffer2", "sveloc");
// }
// #end
path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
// #if (rp_antialiasing == "TAA")
// {
// path.setTarget(framebuffer);
// path.bindTarget("bufa", "tex");
// path.bindTarget("taa", "tex2");
// path.bindTarget("gbuffer2", "sveloc");
// path.drawShader("shader_datas/taa_pass/taa_pass");
// path.setTarget("taa");
// path.bindTarget("bufa", "tex");
// path.drawShader("shader_datas/copy_pass/copy_pass");
// }
// #end
}
#end
#if (rp_supersampling == 4)
{
var final = "";
path.setTarget(final);
path.bindTarget(framebuffer, "tex");
path.drawShader("shader_datas/supersample_resolve/supersample_resolve");
}
#end
}
#end
@@ -203,6 +469,11 @@ class RenderPathCreator {
#if (rp_renderer == "Deferred")
static function init() {
#if (rp_shadowmap && kha_webgl)
initEmpty();
#end
#if (rp_background == "World")
{
path.loadShader("shader_datas/world_pass/world_pass");
@@ -218,6 +489,11 @@ class RenderPathCreator {
#if (rp_gi != "Off")
{
initGI();
#if arm_voxelgi_temporal
{
initGI("voxelsB");
}
#end
}
#end
@@ -394,8 +670,30 @@ class RenderPathCreator {
{
path.loadShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
path.loadShader("shader_datas/volumetric_light/volumetric_light");
path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
path.loadShader("shader_datas/blur_edge_pass/blur_edge_pass_y_blend_add");
path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
path.loadShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
{
var t = new RenderTargetRaw();
t.name = "bufvola";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "R8";
// var ss = getSuperSampling();
t.scale = 0.5;
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "bufvolb";
t.width = 0;
t.height = 0;
t.displayp = getDisplayp();
t.format = "R8";
// var ss = getSuperSampling();
t.scale = 0.5;
path.createRenderTarget(t);
}
}
#end
@@ -553,7 +851,7 @@ class RenderPathCreator {
var faces = l.data.raw.shadowmap_cube ? 6 : 1;
for (j in 0...faces) {
if (faces > 1) path.currentFace = j;
path.setTarget("shadowMap");
path.setTarget(getShadowMap());
path.clearTarget(null, 1.0);
path.drawMeshes("shadowmap");
}
@@ -563,7 +861,7 @@ class RenderPathCreator {
#if rp_soft_shadows
path.setTarget("visa"); // Merge using min blend
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
path.drawShader("shader_datas/dilate_pass/dilate_pass_x");
path.setTarget("visb");
@@ -573,7 +871,7 @@ class RenderPathCreator {
path.setTarget("visa", ["dist"]);
//if (i == 0) path.clearTarget(0x00000000);
path.bindTarget("visb", "dilate");
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
//path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/visibility_pass/visibility_pass");
@@ -702,19 +1000,30 @@ class RenderPathCreator {
}
#end
if (path.voxelize()) {
path.clearImage("voxels", 0x00000000);
var voxelize = path.voxelize();
#if arm_voxelgi_temporal
voxelize = ++voxelFrame % voxelFreq == 0;
if (voxelize) {
voxels = voxels == "voxels" ? "voxelsB" : "voxels";
voxelsLast = voxels == "voxels" ? "voxelsB" : "voxels";
}
#end
if (voxelize) {
path.clearImage(voxels, 0x00000000);
path.setTarget("");
var res = getVoxelRes();
path.setViewport(res, res);
path.bindTarget("voxels", "voxels");
path.bindTarget(voxels, "voxels");
#if ((rp_shadowmap) && (rp_gi == "Voxel GI"))
{
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
}
#end
path.drawMeshes("voxel");
path.generateMipmaps("voxels");
path.generateMipmaps(voxels);
}
}
#end
@@ -731,7 +1040,12 @@ class RenderPathCreator {
#end
#if (rp_gi != "Off")
{
path.bindTarget("voxels", "voxels");
path.bindTarget(voxels, "voxels");
#if arm_voxelgi_temporal
{
path.bindTarget(voxelsLast, "voxelsLast");
}
#end
}
#end
path.drawShader("shader_datas/deferred_indirect/deferred_indirect");
@@ -762,7 +1076,7 @@ class RenderPathCreator {
#if rp_soft_shadows
path.bindTarget("visa", "svisibility");
#else
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
#end
}
}
@@ -770,7 +1084,7 @@ class RenderPathCreator {
#if ((rp_voxelgi_shadows) || (rp_voxelgi_refraction))
{
path.bindTarget("voxels", "voxels");
path.bindTarget(voxels, "voxels");
}
#end
@@ -783,24 +1097,23 @@ class RenderPathCreator {
#if rp_volumetriclight
{
path.setTarget("buf");
path.setTarget("bufvola");
path.bindTarget("_main", "gbufferD");
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
if (path.lampIsSun()) {
path.drawShader("shader_datas/volumetric_light_quad/volumetric_light_quad");
}
else {
path.drawLampVolume("shader_datas/volumetric_light/volumetric_light");
}
path.setTarget("gbuffer1");
path.bindTarget("buf", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_x");
path.setTarget("bufvolb");
path.bindTarget("bufvola", "tex");
path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_x");
path.setTarget("tex");
path.bindTarget("gbuffer1", "tex");
path.bindTarget("gbuffer0", "gbuffer0");
path.drawShader("shader_datas/blur_edge_pass/blur_edge_pass_y_blend_add");
path.bindTarget("bufvolb", "tex");
path.drawShader("shader_datas/blur_bilat_pass/blur_bilat_pass_y_blend");
}
#end
}
@@ -966,7 +1279,13 @@ class RenderPathCreator {
path.setTarget("buf");
}
#end
path.bindTarget("tex", "tex");
#if rp_compositordepth
{
path.bindTarget("_main", "gbufferD");
}
#end
#if rp_compositornodes
{
@@ -1005,6 +1324,11 @@ class RenderPathCreator {
#end
path.bindTarget("buf", "colorTex");
path.bindTarget("bufb", "blendTex");
#if (rp_antialiasing == "TAA")
{
path.bindTarget("gbuffer2", "sveloc");
}
#end
path.drawShader("shader_datas/smaa_neighborhood_blend/smaa_neighborhood_blend");
#if (rp_antialiasing == "TAA")
@@ -1046,9 +1370,6 @@ class RenderPathCreator {
#end
// #if (rp_renderer == "Deferred Plus")
// static function init() {
@@ -1060,8 +1381,79 @@ class RenderPathCreator {
// #end
static function bindShadowMap() {
var target = shadowMapName();
if (target == "shadowMapCube") {
#if kha_webgl
// Bind empty map to non-cubemap sampler to keep webgl happy
path.bindTarget("arm_empty", "shadowMap");
#end
path.bindTarget("shadowMapCube", "shadowMapCube");
}
else {
#if kha_webgl
// Bind empty map to cubemap sampler
path.bindTarget("arm_empty_cube", "shadowMapCube");
#end
path.bindTarget("shadowMap", "shadowMap");
}
}
static function shadowMapName():String {
return path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube ? "shadowMapCube" : "shadowMap";
}
static function getShadowMap():String {
var target = shadowMapName();
var rt = path.renderTargets.get(target);
// Create shadowmap on the fly
if (rt == null) {
if (path.getLamp(path.currentLampIndex).data.raw.shadowmap_cube) {
// Cubemap size
var size = Std.int(path.getLamp(path.currentLampIndex).data.raw.shadowmap_size);
var t = new RenderTargetRaw();
t.name = target;
t.width = size;
t.height = size;
t.format = "DEPTH16";
t.is_cubemap = true;
rt = path.createRenderTarget(t);
}
else { // Non-cube sm
var sizew = path.getLamp(path.currentLampIndex).data.raw.shadowmap_size;
var sizeh = sizew;
#if arm_csm // Cascades - atlas on x axis
sizew = sizeh * iron.object.LampObject.cascadeCount;
#end
var t = new RenderTargetRaw();
t.name = target;
t.width = sizew;
t.height = sizeh;
t.format = "DEPTH16";
rt = path.createRenderTarget(t);
}
}
return target;
}
#if (rp_shadowmap && kha_webgl)
static function initEmpty() {
// Bind empty when requested target is not found
var tempty = new RenderTargetRaw();
tempty.name = "arm_empty";
tempty.width = 1;
tempty.height = 1;
tempty.format = "DEPTH16";
path.createRenderTarget(tempty);
var temptyCube = new RenderTargetRaw();
temptyCube.name = "arm_empty_cube";
temptyCube.width = 1;
temptyCube.height = 1;
temptyCube.format = "DEPTH16";
temptyCube.is_cubemap = true;
path.createRenderTarget(temptyCube);
}
#end
#if (rp_translucency)
static function initTranslucency() {
@@ -1100,7 +1492,7 @@ class RenderPathCreator {
path.setTarget("accum", ["revealage"]);
#if rp_shadowmap
{
path.bindTarget("shadowMap", "shadowMap");
bindShadowMap();
}
#end
path.drawMeshes("translucent");
@@ -1120,9 +1512,9 @@ class RenderPathCreator {
#end
#if (rp_gi != "Off")
static function initGI() {
static function initGI(tname = "voxels") {
var t = new RenderTargetRaw();
t.name = "voxels";
t.name = tname;
#if (rp_gi == "Voxel AO")
{
t.format = "R8";
@@ -1142,6 +1534,7 @@ class RenderPathCreator {
t.height = res;
t.depth = Std.int(res * resZ);
t.is_image = true;
t.mipmaps = true;
path.createRenderTarget(t);
}
#end
@@ -1192,8 +1585,10 @@ class RenderPathCreator {
#end
}
static inline function getSuperSampling():Int {
#if (rp_supersampling == 2)
static inline function getSuperSampling():Float {
#if (rp_supersampling == 1.5)
return 1.5;
#elseif (rp_supersampling == 2)
return 2;
#elseif (rp_supersampling == 4)
return 4;