Progressive ao bake

This commit is contained in:
luboslenco
2019-10-04 10:19:37 +02:00
parent 0afa1e17d3
commit 81ff0573ff
6 changed files with 86 additions and 48 deletions
Binary file not shown.
+8 -3
View File
@@ -48,8 +48,8 @@ void raygeneration() {
RayPayload payload;
RayDesc ray;
ray.TMin = v0.w * 0.01;
ray.TMax = v0.z * 10.0;
ray.TMin = constant_buffer.v0.w * 0.01;
ray.TMax = constant_buffer.v0.z * 10.0;
ray.Origin = pos;
float3 accum = float3(0, 0, 0);
@@ -68,7 +68,12 @@ void raygeneration() {
if (constant_buffer.v0.x == 0) {
color = accum.xyz;
}
render_target[DispatchRaysIndex().xy] = float4(lerp(color.xyz, accum.xyz, 1.0 / 30.0), 0.0f);
else {
float a = 1.0 / constant_buffer.v0.x;
float b = 1.0 - a;
color = color * b + accum.xyz * a;
}
render_target[DispatchRaysIndex().xy] = float4(color.xyz, 0.0f);
}
[shader("closesthit")]
+1 -37
View File
@@ -627,42 +627,6 @@ class RenderPathDeferred {
}
#if kha_direct3d12
else if (UITrait.inst.bakeType == 0) { // AO (DXR)
if (path.renderTargets.get("baketex0") == null) {
{
var t = new RenderTargetRaw();
t.name = "baketex0";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA64";
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "baketex1";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA64";
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "baketex2";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA128"; // Match raytrace_target format
path.createRenderTarget(t);
}
}
if (!RenderPathRaytrace.ready) {
UITrait.inst.bakeType = -1;
MaterialParser.parsePaintMaterial();
for (i in 0...4) { // Jitter
path.setTarget("baketex0", ["baketex1"]);
path.drawMeshes("paint");
}
UITrait.inst.bakeType = 0;
// MaterialParser.parsePaintMaterial();
}
RenderPathRaytrace.commandsBake();
}
#end
@@ -706,7 +670,7 @@ class RenderPathDeferred {
var viewport = false;
if (viewport) {
if (Context.ddirty > 1) {
RenderPathRaytrace.frame = 0.0;
RenderPathRaytrace.frame = 0;
}
RenderPathRaytrace.commands();
path.setTarget("taa");
+69 -7
View File
@@ -3,12 +3,15 @@ package arm.render;
import iron.RenderPath;
import iron.Scene;
import arm.ui.UITrait;
import arm.nodes.MaterialParser;
#if kha_direct3d12
class RenderPathRaytrace {
public static var frame = 0.0;
public static var frame = 0;
public static var raysPix = 0;
public static var raysSec = 0;
public static var ready = false;
static var f32 = new kha.arrays.Float32Array(20);
static var helpMat = iron.math.Mat4.identity();
@@ -17,6 +20,8 @@ class RenderPathRaytrace {
static var bsobol:kha.Image;
static var bscramble:kha.Image;
static var brank:kha.Image;
static var raysTimer = 0.0;
static var raysCounter = 0;
static function init() {
iron.data.Data.getBlob("raytrace_brute.cso", function(shader:kha.Blob) {
@@ -43,7 +48,7 @@ class RenderPathRaytrace {
f32[1] = ct.worldy();
f32[2] = ct.worldz();
f32[3] = frame;
frame = (Std.int(frame) % 4) + 1;
frame = (frame % 4) + 1;
f32[4] = helpMat._00;
f32[5] = helpMat._01;
f32[6] = helpMat._02;
@@ -91,7 +96,55 @@ class RenderPathRaytrace {
}
public static function commandsBake() {
if (!ready) { ready = true; initBake(); return; }
var path = RenderPathDeferred.path;
if (!ready) {
ready = true;
if (path.renderTargets.get("baketex0") != null) {
path.renderTargets.get("baketex0").image.unload();
path.renderTargets.get("baketex1").image.unload();
path.renderTargets.get("baketex2").image.unload();
}
{
var t = new RenderTargetRaw();
t.name = "baketex0";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA64";
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "baketex1";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA64";
path.createRenderTarget(t);
}
{
var t = new RenderTargetRaw();
t.name = "baketex2";
t.width = Config.getTextureRes();
t.height = Config.getTextureRes();
t.format = "RGBA128"; // Match raytrace_target format
path.createRenderTarget(t);
}
UITrait.inst.bakeType = -1;
MaterialParser.parsePaintMaterial();
for (i in 0...4) { // Jitter
path.setTarget("baketex0", ["baketex1"]);
path.drawMeshes("paint");
}
UITrait.inst.bakeType = 0;
// MaterialParser.parsePaintMaterial();
initBake();
return;
}
if (UITrait.inst.brushTime > 0) {
Context.pdirty = 2;
@@ -99,23 +152,32 @@ class RenderPathRaytrace {
}
if (Context.pdirty > 0) {
f32[0] = frame;
f32[0] = frame++;
f32[1] = UITrait.inst.bakeAoStrength;
f32[2] = UITrait.inst.bakeAoRadius;
f32[3] = UITrait.inst.bakeAoOffset;
frame = (Std.int(frame) % 30) + 1;
var path = RenderPathDeferred.path;
var baketex2 = path.renderTargets.get("baketex2").image;
Krom.raytraceDispatchRays(baketex2.renderTarget_, f32.buffer);
path.setTarget("texpaint" + Context.layer.id);
path.bindTarget("baketex2", "tex");
path.drawShader("shader_datas/copy_pass/copy_pass");
raysPix = frame * 64;
raysCounter += 64;
raysTimer += iron.system.Time.realDelta;
if (raysTimer >= 1) {
raysSec = raysCounter;
raysTimer = 0;
raysCounter = 0;
}
UITrait.inst.headerHandle.redraws = 2;
}
else {
frame = 0;
raysTimer = 0;
raysCounter = 0;
}
}
+4 -1
View File
@@ -30,6 +30,9 @@ class TabExport {
UVUtil.uvmapCached = false;
UVUtil.trianglemap = null;
UVUtil.trianglemapCached = false;
#if kha_direct3d12
arm.render.RenderPathRaytrace.ready = false;
#end
}
ui.combo(UITrait.inst.bitsHandle, ["8bit", "16bit", "32bit"], "Color", true);
if (UITrait.inst.bitsHandle.changed) {
@@ -49,7 +52,7 @@ class TabExport {
ui.row([1/2, 1/2]);
UITrait.inst.layersExport = ui.combo(Id.handle({position: UITrait.inst.layersExport}), ["Visible", "Selected"], "Layers", true);
UITrait.inst.outputType = ui.combo(Id.handle(), ["Generic", "Unreal 4", "Unity 5"], "Output", true);
if (ui.panel(Id.handle({selected: false}), "Channels")) {
ui.row([1/2, 1/2]);
UITrait.inst.isBase = ui.check(Id.handle({selected: UITrait.inst.isBase}), "Base Color");
+4
View File
@@ -1012,6 +1012,10 @@ class UITrait {
bakeAoRadius = ui.slider(radiusHandle, "Radius", 0.0, 2.0, true);
var offsetHandle = Id.handle({value: bakeAoOffset});
bakeAoOffset = ui.slider(offsetHandle, "Offset", 0.0, 2.0, true);
#if kha_direct3d12
ui.text("Rays/pix: " + arm.render.RenderPathRaytrace.raysPix);
ui.text("Rays/sec: " + arm.render.RenderPathRaytrace.raysSec);
#end
}
if (bakeType == 1) { // Curvature
var strengthHandle = Id.handle({value: bakeCurvStrength});