Update raytracing interface
This commit is contained in:
Binary file not shown.
@@ -12,6 +12,7 @@ struct Vertex {
|
||||
struct RayGenConstantBuffer {
|
||||
float4 eye; // xyz, frame
|
||||
float4x4 inv_vp;
|
||||
float4 params; // envstr, envshow
|
||||
};
|
||||
|
||||
struct RayPayload {
|
||||
@@ -76,7 +77,9 @@ void raygeneration() {
|
||||
if (payload.color.a < 0) {
|
||||
if (i == 0) {
|
||||
// return;
|
||||
payload.color.rgb = float3(0.05, 0.05, 0.05);
|
||||
if (constant_buffer.params.y == 0) {
|
||||
payload.color.rgb = float3(0.05, 0.05, 0.05);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -157,6 +160,6 @@ void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttribut
|
||||
[shader("miss")]
|
||||
void miss(inout RayPayload payload) {
|
||||
float2 tex_coord = equirect(WorldRayDirection());
|
||||
float3 texenv = mytexture_env.Load(uint3(tex_coord.x * 1024, tex_coord.y * 512, 0)).rgb * 3;
|
||||
float3 texenv = mytexture_env.Load(uint3(tex_coord.x * 4096, tex_coord.y * 2048, 0)).rgb * constant_buffer.params.x;
|
||||
payload.color = float4(payload.color.rgb * texenv.rgb, -1);
|
||||
}
|
||||
|
||||
@@ -117,9 +117,6 @@ class ImportEnvmap {
|
||||
Scene.active.world.probe.radiance = image;
|
||||
Scene.active.world.probe.radianceMipmaps = mips;
|
||||
Context.ddirty = 2;
|
||||
#if kha_direct3d12
|
||||
arm.render.RenderPathRaytrace.ready = false;
|
||||
#end
|
||||
}
|
||||
}, true); // Readable
|
||||
mw = Std.int(mw / 2);
|
||||
|
||||
@@ -190,39 +190,6 @@ class RenderPathDeferred {
|
||||
}
|
||||
#end
|
||||
|
||||
#if kha_direct3d12
|
||||
{
|
||||
Scene.active.embedData("bnoise_sobol.png", function() {});
|
||||
Scene.active.embedData("bnoise_scramble.png", function() {});
|
||||
Scene.active.embedData("bnoise_rank.png", function() {});
|
||||
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "bsobol";
|
||||
t.width = 256;
|
||||
t.height = 256;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "bscramble";
|
||||
t.width = 128;
|
||||
t.height = 1024;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "brank";
|
||||
t.width = 128;
|
||||
t.height = 1024;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
}
|
||||
#end
|
||||
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "bloomtex";
|
||||
|
||||
@@ -13,7 +13,8 @@ class RenderPathRaytrace {
|
||||
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 first = true;
|
||||
static var f32 = new kha.arrays.Float32Array(24);
|
||||
static var helpMat = iron.math.Mat4.identity();
|
||||
static var vb:kha.arrays.Float32Array;
|
||||
static var ib:kha.arrays.Uint32Array;
|
||||
@@ -22,23 +23,87 @@ class RenderPathRaytrace {
|
||||
static var brank:kha.Image;
|
||||
static var raysTimer = 0.0;
|
||||
static var raysCounter = 0;
|
||||
static var lastLayer:kha.Image = null;
|
||||
static var lastEnvmap:kha.Image = null;
|
||||
|
||||
static function init() {
|
||||
iron.data.Data.getBlob("raytrace_brute.cso", function(shader:kha.Blob) {
|
||||
static function init(shaderName:String, targetW:Int, targetH:Int) {
|
||||
|
||||
if (first) {
|
||||
Scene.active.embedData("bnoise_sobol.png", function() {});
|
||||
Scene.active.embedData("bnoise_scramble.png", function() {});
|
||||
Scene.active.embedData("bnoise_rank.png", function() {});
|
||||
|
||||
var path = RenderPathDeferred.path;
|
||||
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "bsobol";
|
||||
t.width = 256;
|
||||
t.height = 256;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "bscramble";
|
||||
t.width = 128;
|
||||
t.height = 1024;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "brank";
|
||||
t.width = 128;
|
||||
t.height = 1024;
|
||||
t.format = "RGBA32";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
{
|
||||
var t = new RenderTargetRaw();
|
||||
t.name = "envrt";
|
||||
t.width = 4096;
|
||||
t.height = 2048;
|
||||
t.format = "RGBA128";
|
||||
path.createRenderTarget(t);
|
||||
}
|
||||
}
|
||||
|
||||
iron.data.Data.getBlob(shaderName, function(shader:kha.Blob) {
|
||||
buildData();
|
||||
|
||||
var layer = Context.layer;
|
||||
var savedEnvmap = Scene.active.world.probe.radiance;
|
||||
|
||||
Krom.raytraceInit(
|
||||
shader.bytes.getData(), untyped vb.buffer, untyped ib.buffer, iron.App.w(), iron.App.h(),
|
||||
layer.texpaint.renderTarget_, layer.texpaint_nor.renderTarget_, layer.texpaint_pack.renderTarget_,
|
||||
savedEnvmap.texture_, bsobol.renderTarget_, bscramble.renderTarget_, brank.renderTarget_);
|
||||
shader.bytes.getData(), untyped vb.buffer, untyped ib.buffer, targetW, targetH,
|
||||
bsobol.renderTarget_, bscramble.renderTarget_, brank.renderTarget_);
|
||||
});
|
||||
}
|
||||
|
||||
public static function commands() {
|
||||
if (!ready) { ready = true; init(); return; }
|
||||
if (!ready) {
|
||||
ready = true;
|
||||
init("raytrace_brute.cso", iron.App.w(), iron.App.h());
|
||||
lastEnvmap = null;
|
||||
lastLayer = null;
|
||||
}
|
||||
|
||||
var path = RenderPathDeferred.path;
|
||||
var savedEnvmap = Scene.active.world.probe.radiance;
|
||||
if (lastEnvmap != savedEnvmap) {
|
||||
lastEnvmap = savedEnvmap;
|
||||
lastLayer = null;
|
||||
|
||||
var envrt = path.renderTargets.get("envrt").image;
|
||||
envrt.g2.begin(false);
|
||||
envrt.g2.drawScaledImage(savedEnvmap, 0, 0, envrt.width, envrt.height);
|
||||
envrt.g2.end();
|
||||
}
|
||||
|
||||
var layer = Context.layer;
|
||||
if (lastLayer != layer.texpaint) {
|
||||
lastLayer = layer.texpaint;
|
||||
var envrt = path.renderTargets.get("envrt").image;
|
||||
Krom.raytraceSetTextures(layer.texpaint.renderTarget_, layer.texpaint_nor.renderTarget_, layer.texpaint_pack.renderTarget_, envrt.renderTarget_);
|
||||
}
|
||||
|
||||
var cam = Scene.active.camera;
|
||||
var ct = cam.transform;
|
||||
helpMat.setFrom(cam.V);
|
||||
@@ -65,6 +130,8 @@ class RenderPathRaytrace {
|
||||
f32[17] = helpMat._31;
|
||||
f32[18] = helpMat._32;
|
||||
f32[19] = helpMat._33;
|
||||
f32[20] = Scene.active.world.probe.raw.strength;
|
||||
f32[21] = UITrait.inst.showEnvmap ? 1.0 : 0.0;
|
||||
|
||||
var path = RenderPathDeferred.path;
|
||||
var framebuffer = path.renderTargets.get("taa").image;
|
||||
@@ -77,24 +144,6 @@ class RenderPathRaytrace {
|
||||
Context.rdirty--;
|
||||
}
|
||||
|
||||
public static function initBake() {
|
||||
iron.data.Data.getBlob("raytrace_bake.cso", function(shader:kha.Blob) {
|
||||
buildData();
|
||||
|
||||
var path = RenderPathDeferred.path;
|
||||
var baketex0 = path.renderTargets.get("baketex0").image;
|
||||
var baketex1 = path.renderTargets.get("baketex1").image;
|
||||
var baketex2 = path.renderTargets.get("baketex2").image;
|
||||
var savedEnvmap = Scene.active.world.probe.radiance;
|
||||
var layer = Context.layer;
|
||||
|
||||
Krom.raytraceInit(
|
||||
shader.bytes.getData(), untyped vb.buffer, untyped ib.buffer, layer.texpaint.width, layer.texpaint.height,
|
||||
baketex0.renderTarget_, baketex1.renderTarget_, baketex2.renderTarget_,
|
||||
savedEnvmap.texture_, bsobol.renderTarget_, bscramble.renderTarget_, brank.renderTarget_);
|
||||
});
|
||||
}
|
||||
|
||||
public static function commandsBake() {
|
||||
|
||||
var path = RenderPathDeferred.path;
|
||||
@@ -142,7 +191,14 @@ class RenderPathRaytrace {
|
||||
UITrait.inst.bakeType = 0;
|
||||
// MaterialParser.parsePaintMaterial();
|
||||
|
||||
initBake();
|
||||
init("raytrace_bake.cso", Config.getTextureRes(), Config.getTextureRes());
|
||||
|
||||
var baketex0 = path.renderTargets.get("baketex0").image;
|
||||
var baketex1 = path.renderTargets.get("baketex1").image;
|
||||
var baketex2 = path.renderTargets.get("baketex2").image;
|
||||
var savedEnvmap = Scene.active.world.probe.radiance;
|
||||
Krom.raytraceSetTextures(baketex0.renderTarget_, baketex1.renderTarget_, baketex2.renderTarget_, savedEnvmap.texture_);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -213,13 +269,13 @@ class RenderPathRaytrace {
|
||||
bscramble = path.renderTargets.get("bscramble").image;
|
||||
brank = path.renderTargets.get("brank").image;
|
||||
|
||||
bsobol.g2.begin();
|
||||
bsobol.g2.begin(false);
|
||||
bsobol.g2.drawImage(bnoise_sobol, 0, 0);
|
||||
bsobol.g2.end();
|
||||
bscramble.g2.begin();
|
||||
bscramble.g2.begin(false);
|
||||
bscramble.g2.drawImage(bnoise_scramble, 0, 0);
|
||||
bscramble.g2.end();
|
||||
brank.g2.begin();
|
||||
brank.g2.begin(false);
|
||||
brank.g2.drawImage(bnoise_rank, 0, 0);
|
||||
brank.g2.end();
|
||||
}
|
||||
|
||||
@@ -43,6 +43,7 @@ class TabViewport {
|
||||
p.raw.strength = ui.slider(envHandle, "Environment", 0.0, 8.0, true);
|
||||
if (envHandle.changed) Context.ddirty = 2;
|
||||
|
||||
#if (!kha_direct3d12)
|
||||
ui.row([1/2, 1/2]);
|
||||
if (Scene.active.lights.length > 0) {
|
||||
var light = Scene.active.lights[0];
|
||||
@@ -68,6 +69,7 @@ class TabViewport {
|
||||
light.data.raw.strength = ui.slider(lhandle, "Light", 0.0, 4.0, true) * scale;
|
||||
if (lhandle.changed) Context.ddirty = 2;
|
||||
}
|
||||
#end
|
||||
|
||||
ui.row([1/2, 1/2]);
|
||||
var cam = Scene.active.camera.data.raw;
|
||||
|
||||
Reference in New Issue
Block a user