VOX_PATCH_2 + VOX_5

This commit is contained in:
2026-07-16 23:49:44 -07:00
parent f4b0bf1e93
commit b2395f30fc
34 changed files with 353 additions and 560 deletions

View File

@ -318,9 +318,9 @@ class MeshObject extends Object {
if (scontext.pipeState != lastPipeline) {
g.setPipeline(scontext.pipeState);
lastPipeline = scontext.pipeState;
// Uniforms.setContextConstants(g, scontext, bindParams);
Uniforms.setContextConstants(g, scontext, bindParams);
}
Uniforms.setContextConstants(g, scontext, bindParams); //
//Uniforms.setContextConstants(g, scontext, bindParams); //
Uniforms.setObjectConstants(g, scontext, this);
if (materialContexts.length > mi) {
Uniforms.setMaterialConstants(g, scontext, materialContexts[mi]);

View File

@ -62,22 +62,25 @@ abstract class Downsampler {
private class DownsamplerFragment extends Downsampler {
var rtName: String;
public function new(path: RenderPath, shaderPassHandle: String, rtName: String, maxNumMips: Int) {
super(path, shaderPassHandle, maxNumMips);
this.rtName = rtName;
path.loadShader(shaderPassHandle);
}
var prevScale = 1.0;
for (i in 0...maxNumMips) {
function ensureMipTarget(i: Int): RenderTarget {
if (mipmaps[i] == null) {
var t = new RenderTargetRaw();
t.name = rtName + "_mip_" + i;
t.width = 0;
t.height = 0;
t.scale = (prevScale *= 0.5);
t.scale = Math.pow(0.5, i + 1);
t.format = Inc.getHdrFormat();
mipmaps[i] = path.createRenderTarget(t);
}
path.loadShader(shaderPassHandle);
return mipmaps[i];
}
public function dispatch(srcImageName: String, numMips: Int = 0) {
@ -95,9 +98,10 @@ private class DownsamplerFragment extends Downsampler {
Downsampler.numMipLevels = numMips;
for (i in 0...numMips) {
Downsampler.currentMipLevel = i;
path.setTarget(mipmaps[i].raw.name);
var mip = ensureMipTarget(i);
path.setTarget(mip.raw.name);
path.clearTarget();
path.bindTarget(i == 0 ? srcImageName : mipmaps[i - 1].raw.name, "tex");
path.bindTarget(i == 0 ? srcImageName : ensureMipTarget(i - 1).raw.name, "tex");
path.drawShader(shaderPassHandle);
}
}

View File

@ -2,6 +2,7 @@ package leenkx.renderpath;
import iron.RenderPath;
import iron.object.LightObject;
import iron.object.Clipmap;
import leenkx.math.Helper;
import kha.arrays.Float32Array;
@ -22,6 +23,7 @@ class Inc {
#end
#if (rp_voxels != "Off")
static var voxelClipmapsArray:Float32Array = null;
static var voxel_sh0:kha.graphics4.ComputeShader = null;
static var voxel_sh1:kha.graphics4.ComputeShader = null;
static var voxel_ta0:kha.graphics4.TextureUnit;
@ -37,7 +39,6 @@ class Inc {
#if (rp_voxels == "Voxel GI")
static var voxel_td1:kha.graphics4.TextureUnit;
static var voxel_te1:kha.graphics4.TextureUnit;
static var voxel_tf1:kha.graphics4.TextureUnit;
static var voxel_cc1:kha.graphics4.ConstantLocation;
#else
#if lnx_voxelgi_shadows
@ -92,31 +93,6 @@ class Inc {
static var voxel_cc4:kha.graphics4.ConstantLocation;
static var voxel_cd4:kha.graphics4.ConstantLocation;
static var voxel_sh5:kha.graphics4.ComputeShader = null;
static var voxel_ta5:kha.graphics4.TextureUnit;
static var voxel_te5:kha.graphics4.TextureUnit;
static var voxel_tf5:kha.graphics4.TextureUnit;
static var voxel_tg5:kha.graphics4.TextureUnit;
static var voxel_ca5:kha.graphics4.ConstantLocation;
static var voxel_cb5:kha.graphics4.ConstantLocation;
static var voxel_cc5:kha.graphics4.ConstantLocation;
static var voxel_cd5:kha.graphics4.ConstantLocation;
static var voxel_ce5:kha.graphics4.ConstantLocation;
static var voxel_cf5:kha.graphics4.ConstantLocation;
static var voxel_cg5:kha.graphics4.ConstantLocation;
#if rp_shadowmap
static var voxel_tb5:kha.graphics4.TextureUnit;
static var voxel_tc5:kha.graphics4.TextureUnit;
static var voxel_td5:kha.graphics4.TextureUnit;
static var voxel_ch5:kha.graphics4.ConstantLocation;
static var voxel_ci5:kha.graphics4.ConstantLocation;
static var voxel_cj5:kha.graphics4.ConstantLocation;
static var voxel_ck5:kha.graphics4.ConstantLocation;
#if lnx_shadowmap_atlas
static var voxel_cl5:kha.graphics4.ConstantLocation;
static var voxel_cm5:kha.graphics4.ConstantLocation;
#end
#end
#end //rp_voxels == "Voxel GI"
#end //rp_voxels != "Off"
@ -617,9 +593,6 @@ class Inc {
// Init voxels
#if (rp_voxels != 'Off')
initGI();
#if (rp_voxels == "Voxel GI")
initGI("voxelsLight");
#end
#end
#end // lnx_config
}
@ -740,12 +713,6 @@ class Inc {
t.height = res * Main.voxelgiClipmapCount;
t.depth = res;
}
else if (t.name == "voxelsLight") {
t.format = "R32UI";
t.width = res;
t.height = res * Main.voxelgiClipmapCount;
t.depth = res * 3; // Store R, G, B in separate z-slices
}
else if (t.name == "voxelsOut" || t.name == "voxelsOutB") {
#if (rp_voxels == "Voxel AO")
t.format = "R8";
@ -877,8 +844,7 @@ class Inc {
#if (rp_voxels == "Voxel GI")
voxel_td1 = voxel_sh1.getTextureUnit("voxelsSampler");
voxel_te1 = voxel_sh1.getTextureUnit("voxelsLight");
voxel_tf1 = voxel_sh1.getTextureUnit("SDF");
voxel_te1 = voxel_sh1.getTextureUnit("SDF");
voxel_cc1 = voxel_sh1.getConstantLocation("envmapStrength");
#else
#if lnx_voxelgi_shadows
@ -951,38 +917,27 @@ class Inc {
voxel_cc4 = voxel_sh4.getConstantLocation("eye");
voxel_cd4 = voxel_sh4.getConstantLocation("postprocess_resolution");
}
if (voxel_sh5 == null)
{
voxel_sh5 = path.getComputeShader("voxel_light");
voxel_ta5 = voxel_sh5.getTextureUnit("voxelsLight");
voxel_te5 = voxel_sh5.getTextureUnit("voxels");
voxel_tf5 = voxel_sh5.getTextureUnit("voxelsSampler");
voxel_tg5 = voxel_sh5.getTextureUnit("voxelsSDFSampler");
#end
}
voxel_ca5 = voxel_sh5.getConstantLocation("clipmaps");
voxel_cb5 = voxel_sh5.getConstantLocation("clipmapLevel");
voxel_cc5 = voxel_sh5.getConstantLocation("lightPos");
voxel_cd5 = voxel_sh5.getConstantLocation("lightColor");
voxel_ce5 = voxel_sh5.getConstantLocation("lightType");
voxel_cf5 = voxel_sh5.getConstantLocation("lightDir");
voxel_cg5 = voxel_sh5.getConstantLocation("spotData");
#if rp_shadowmap
voxel_tb5 = voxel_sh5.getTextureUnit("shadowMap");
voxel_tc5 = voxel_sh5.getTextureUnit("shadowMapSpot");
voxel_td5 = voxel_sh5.getTextureUnit("shadowMapPoint");
voxel_ch5 = voxel_sh5.getConstantLocation("lightShadow");
voxel_ci5 = voxel_sh5.getConstantLocation("lightProj");
voxel_cj5 = voxel_sh5.getConstantLocation("LVP");
voxel_ck5 = voxel_sh5.getConstantLocation("shadowsBias");
#if lnx_shadowmap_atlas
voxel_cl5 = voxel_sh5.getConstantLocation("index");
voxel_cm5 = voxel_sh5.getConstantLocation("pointLightDataArray");
#end
#end
public static function fillVoxelClipmapsArray(clipmaps: Array<Clipmap>): Float32Array {
if (voxelClipmapsArray == null || voxelClipmapsArray.length != Main.voxelgiClipmapCount * 10) {
voxelClipmapsArray = new Float32Array(Main.voxelgiClipmapCount * 10);
}
#end
var fa = voxelClipmapsArray;
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
return fa;
}
public static function computeVoxelsOffsetPrev(g: kha.graphics4.Graphics) {
@ -996,19 +951,7 @@ class Inc {
g.setImageTexture(voxel_ta0, rts.get("voxelsOut").image);
g.setImageTexture(voxel_tb0, rts.get("voxelsOutB").image);
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca0, fa);
@ -1029,7 +972,6 @@ class Inc {
if (rts.get("voxelsOut") == null) initGI("voxelsOut");
if (rts.get("voxelsOutB") == null) initGI("voxelsOutB");
#if (rp_voxels == "Voxel GI")
if (rts.get("voxelsLight") == null) initGI("voxelsLight");
if (rts.get("voxelsSDF") == null) initGI("voxelsSDF");
#elseif lnx_voxelgi_shadows
if (rts.get("voxelsSDF") == null) initGI("voxelsSDF");
@ -1045,8 +987,7 @@ class Inc {
g.setImageTexture(voxel_tc1, rts.get("voxelsOut").image);
#if (rp_voxels == "Voxel GI")
g.setTexture(voxel_td1, rts.get("voxelsOutB").image);
g.setImageTexture(voxel_te1, rts.get("voxelsLight").image);
g.setImageTexture(voxel_tf1, rts.get("voxelsSDF").image);
g.setImageTexture(voxel_te1, rts.get("voxelsSDF").image);
g.setFloat(voxel_cc1, iron.Scene.active.world == null ? 0.0 : iron.Scene.active.world.probe.raw.strength);
#else
#if lnx_voxelgi_shadows
@ -1054,19 +995,7 @@ class Inc {
#end
#end
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca1, fa);
@ -1084,6 +1013,8 @@ class Inc {
var clipmaps = iron.RenderPath.clipmaps;
var clipmap = clipmaps[iron.RenderPath.clipmapLevel];
if (rts.get("voxelsSDF") == null || rts.get("voxelsSDFtmp") == null) return;
var read_sdf = "voxelsSDF";
var write_sdf = "voxelsSDFtmp";
@ -1095,19 +1026,7 @@ class Inc {
g.setImageTexture(voxel_ta2, rts.get(read_sdf).image);
g.setImageTexture(voxel_tb2, rts.get(write_sdf).image);
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (j in 0...Main.voxelgiClipmapCount) {
fa[j * 10] = clipmaps[j].voxelSize;
fa[j * 10 + 1] = clipmaps[j].extents.x;
fa[j * 10 + 2] = clipmaps[j].extents.y;
fa[j * 10 + 3] = clipmaps[j].extents.z;
fa[j * 10 + 4] = clipmaps[j].center.x;
fa[j * 10 + 5] = clipmaps[j].center.y;
fa[j * 10 + 6] = clipmaps[j].center.z;
fa[j * 10 + 7] = clipmaps[j].offset_prev.x;
fa[j * 10 + 8] = clipmaps[j].offset_prev.y;
fa[j * 10 + 9] = clipmaps[j].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca2, fa);
@ -1124,6 +1043,18 @@ class Inc {
write_sdf = write_sdf == "voxelsSDF" ? "voxelsSDFtmp" : "voxelsSDF";
}
}
// If passcount is odd, result is in voxelsSDFtmp but consumers read voxelsSDF
if (passcount % 2 != 0) {
g.setComputeShader(voxel_sh2);
g.setImageTexture(voxel_ta2, rts.get("voxelsSDFtmp").image);
g.setImageTexture(voxel_tb2, rts.get("voxelsSDF").image);
fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca2, voxelClipmapsArray);
g.setInt(voxel_cb2, iron.RenderPath.clipmapLevel);
g.setFloat(voxel_cc2, 1.0);
g.compute(Std.int(res / 8), Std.int(res / 8), Std.int(res / 8));
}
}
#end
@ -1153,19 +1084,7 @@ class Inc {
g.setTexture(voxel_th3, iron.Scene.active.world.probe.radiance);
#end
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca3, fa);
@ -1248,19 +1167,7 @@ class Inc {
g.setTexture(voxel_th3, iron.Scene.active.world.probe.radiance);
#end
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca3, fa);
@ -1338,19 +1245,7 @@ class Inc {
g.setTexture(voxel_tf4, rts.get("gbuffer2").image);
#end
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (i in 0...Main.voxelgiClipmapCount) {
fa[i * 10] = clipmaps[i].voxelSize;
fa[i * 10 + 1] = clipmaps[i].extents.x;
fa[i * 10 + 2] = clipmaps[i].extents.y;
fa[i * 10 + 3] = clipmaps[i].extents.z;
fa[i * 10 + 4] = clipmaps[i].center.x;
fa[i * 10 + 5] = clipmaps[i].center.y;
fa[i * 10 + 6] = clipmaps[i].center.z;
fa[i * 10 + 7] = clipmaps[i].offset_prev.x;
fa[i * 10 + 8] = clipmaps[i].offset_prev.y;
fa[i * 10 + 9] = clipmaps[i].offset_prev.z;
}
var fa = fillVoxelClipmapsArray(clipmaps);
g.setFloats(voxel_ca4, fa);
@ -1385,147 +1280,6 @@ class Inc {
}
#if (rp_voxels == "Voxel GI")
public static function computeVoxelsLight(g: kha.graphics4.Graphics) {
var rts = path.renderTargets;
var res = iron.RenderPath.getVoxelRes();
var camera = iron.Scene.active.camera;
var clipmaps = iron.RenderPath.clipmaps;
var clipmap = clipmaps[iron.RenderPath.clipmapLevel];
var lights = iron.Scene.active.lights;
var lightIndex = 0;
for (i in 0...lights.length) {
var l = lights[i];
if (!l.visible) continue;
path.light = l;
g.setComputeShader(voxel_sh5);
g.setImageTexture(voxel_ta5, rts.get("voxelsLight").image);
g.setImageTexture(voxel_te5, rts.get("voxels").image);
g.setTexture(voxel_tf5, rts.get("voxelsOut").image);
g.setTexture(voxel_tg5, rts.get("voxelsSDF").image);
var fa:Float32Array = new Float32Array(Main.voxelgiClipmapCount * 10);
for (j in 0...Main.voxelgiClipmapCount) {
fa[j * 10] = clipmaps[j].voxelSize;
fa[j * 10 + 1] = clipmaps[j].extents.x;
fa[j * 10 + 2] = clipmaps[j].extents.y;
fa[j * 10 + 3] = clipmaps[j].extents.z;
fa[j * 10 + 4] = clipmaps[j].center.x;
fa[j * 10 + 5] = clipmaps[j].center.y;
fa[j * 10 + 6] = clipmaps[j].center.z;
fa[j * 10 + 7] = clipmaps[j].offset_prev.x;
fa[j * 10 + 8] = clipmaps[j].offset_prev.y;
fa[j * 10 + 9] = clipmaps[j].offset_prev.z;
}
g.setFloats(voxel_ca5, fa);
g.setInt(voxel_cb5, iron.RenderPath.clipmapLevel);
#if rp_shadowmap
if (l.data.raw.type == "sun") {
#if lnx_shadowmap_atlas
#if lnx_shadowmap_atlas_single_map
g.setTexture(voxel_tb5, rts.get("shadowMapAtlas").image);
#else
g.setTexture(voxel_tb5, rts.get("shadowMapAtlasSun").image);
#end
#else
g.setTexture(voxel_tb5, rts.get("shadowMap").image);
#end
g.setInt(voxel_ch5, 1); // lightShadow
}
else if (l.data.raw.type == "spot" || l.data.raw.type == "area") {
#if lnx_shadowmap_atlas
#if lnx_shadowmap_atlas_single_map
g.setTexture(voxel_tc5, rts.get("shadowMapAtlas").image);
#else
g.setTexture(voxel_tc5, rts.get("shadowMapAtlasSpot").image);
#end
#else
g.setTexture(voxel_tc5, rts.get("shadowMapSpot[" + lightIndex + "]").image);
#end
g.setInt(voxel_ch5, 2);
}
else {
#if lnx_shadowmap_atlas
#if lnx_shadowmap_atlas_single_map
g.setTexture(voxel_td5, rts.get("shadowMapAtlas").image);
#else
g.setTexture(voxel_td5, rts.get("shadowMapAtlasPoint").image);
g.setInt(voxel_cl5, i);
g.setFloats(voxel_cm5, iron.object.LightObject.pointLightsData);
#end
#else
g.setCubeMap(voxel_td5, rts.get("shadowMapPoint[" + lightIndex + "]").cubeMap);
#end
g.setInt(voxel_ch5, 3);
}
// lightProj
var near = l.data.raw.near_plane;
var far = l.data.raw.far_plane;
var a:kha.FastFloat = far + near;
var b:kha.FastFloat = far - near;
var f2:kha.FastFloat = 2.0;
var c:kha.FastFloat = f2 * far * near;
var vx:kha.FastFloat = a / b;
var vy:kha.FastFloat = c / b;
g.setFloat2(voxel_ci5, vx, vy);
// LVP
m.setFrom(l.VP);
m.multmat(iron.object.Uniforms.biasMat);
#if lnx_shadowmap_atlas
if (l.data.raw.type == "sun")
{
// tile matrix
m.setIdentity();
// scale [0-1] coords to [0-tilescale]
m._00 = l.tileScale[0];
m._11 = l.tileScale[0];
// offset coordinate start from [0, 0] to [tile-start-x, tile-start-y]
m._30 = l.tileOffsetX[0];
m._31 = l.tileOffsetY[0];
m.multmat(m);
#if (!kha_opengl)
m.setIdentity();
m._11 = -1.0;
m._31 = 1.0;
m.multmat(m);
#end
}
#end
g.setMatrix(voxel_cj5, m.self);
// shadowsBias
g.setFloat(voxel_ck5, l.data.raw.shadows_bias);
#end // rp_shadowmap
// lightPos
g.setFloat3(voxel_cc5, l.transform.worldx(), l.transform.worldy(), l.transform.worldz());
// lightCol
var f = l.data.raw.strength;
g.setFloat3(voxel_cd5, l.data.raw.color[0] * f, l.data.raw.color[1] * f, l.data.raw.color[2] * f);
// lightType
g.setInt(voxel_ce5, iron.data.LightData.typeToInt(l.data.raw.type));
// lightDir
var v = l.look();
g.setFloat3(voxel_cf5, v.x, v.y, v.z);
// spotData
if (l.data.raw.type == "spot") {
var vx = l.data.raw.spot_size;
var vy = vx - l.data.raw.spot_blend;
g.setFloat2(voxel_cg5, vx, vy);
}
g.compute(Std.int(res / 8), Std.int(res / 8), Std.int(res / 8));
if (!iron.object.LightObject.discardLightCulled(l)) {
lightIndex++;
}
}
}
#end // GI
#end // Voxels
}
@ -1881,7 +1635,8 @@ class ShadowMapTile {
if (size < oldTile.size) {
oldTile.forEachTileLinked(function(lTile) {
var childTile = findFreeChildTile(lTile, size);
tilesFound.push(childTile);
if (childTile != null)
tilesFound.push(childTile);
});
}
// reuse parent tiles
@ -1910,6 +1665,7 @@ class ShadowMapTile {
while (size < childrenTile.size) {
childrenTile = childrenTile.tiles[0];
}
if (childrenTile.light != null) return null;
return childrenTile;
}

View File

@ -675,7 +675,10 @@ class RenderPathDeferred {
if (leenkx.data.Config.raw.rp_gi != false)
{
var path = RenderPath.active;
// TODO: investigate currentTarget
#if rp_probes
if (!path.isProbe) {
#end
// TODO: investigate currentTarget
var g = path.frameG;
Inc.computeVoxelsBegin(g);
@ -716,11 +719,11 @@ class RenderPathDeferred {
Inc.computeVoxelsTemporal(g);
#if (rp_voxels == "Voxel GI")
Inc.computeVoxelsLight(g);
#if (lnx_voxelgi_shadows || (rp_voxels == "Voxel GI"))
Inc.computeVoxelsSDF(g);
#end
if (iron.RenderPath.res_pre_clear == true) {
iron.RenderPath.res_pre_clear = false;
#if (rp_voxels == "Voxel GI")
@ -731,6 +734,9 @@ class RenderPathDeferred {
#end
}
}
#if rp_probes
}
#end
#end
// ---
// Deferred light
@ -778,16 +784,25 @@ class RenderPathDeferred {
#if (rp_voxels != "Off")
if (leenkx.data.Config.raw.rp_gi != false)
{
#if rp_probes
if (!path.isProbe) {
#end
var g = path.frameG;
#if (lnx_config && (rp_voxels == "Voxel AO"))
voxelao_pass = true;
#end
#if (rp_voxels == "Voxel AO")
Inc.resolveAO(g);
path.bindTarget("voxels_ao", "voxels_ao");
#else
Inc.resolveDiffuse(g);
Inc.resolveSpecular(g);
#end
#if rp_probes
}
#end
#if (rp_voxels == "Voxel AO")
path.bindTarget("voxels_ao", "voxels_ao");
#else
path.bindTarget("voxels_diffuse", "voxels_diffuse");
path.bindTarget("voxels_specular", "voxels_specular");
#end
@ -997,15 +1012,19 @@ class RenderPathDeferred {
path.drawMeshes("refraction");
path.setTarget("tex");
path.bindTarget("refr", "tex");
path.setTarget("buf");
path.bindTarget("tex", "tex");
path.bindTarget("gbufferD1", "gbufferD1");
path.bindTarget("gbuffer0", "gbuffer0");
path.bindTarget("gbuffer1", "tex1");
path.bindTarget("refr", "tex1");
path.bindTarget("_main", "gbufferD");
path.bindTarget("gbuffer_refraction", "gbuffer_refraction");
path.drawShader("shader_datas/ssrefr_pass/ssrefr_pass");
path.setTarget("tex");
path.bindTarget("buf", "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
}
}
#end

View File

@ -420,8 +420,13 @@ class RenderPathForward {
if (leenkx.data.Config.raw.rp_gi != false)
{
var path = RenderPath.active;
#if rp_probes
if (!path.isProbe) {
#end
Inc.computeVoxelsBegin();
var g = path.frameG;
Inc.computeVoxelsBegin(g);
if (iron.RenderPath.pre_clear == true)
{
@ -437,7 +442,7 @@ class RenderPathForward {
else
{
path.clearImage("voxels", 0x00000000);
Inc.computeVoxelsOffsetPrev();
Inc.computeVoxelsOffsetPrev(g);
}
path.setTarget("");
@ -458,16 +463,15 @@ class RenderPathForward {
path.drawMeshes("voxel");
Inc.computeVoxelsTemporal();
#if (rp_voxels == "Voxel GI")
Inc.computeVoxelsLight();
#end
Inc.computeVoxelsTemporal(g);
#if (lnx_voxelgi_shadows || (rp_voxels == "Voxel GI"))
Inc.computeVoxelsSDF();
Inc.computeVoxelsSDF(g);
#end
}
#if rp_probes
}
#end
#end
RenderPathCreator.setTargetMeshes();