Progressive ao bake
This commit is contained in:
Binary file not shown.
@@ -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")]
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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});
|
||||
|
||||
Reference in New Issue
Block a user