From ba2211ca94f461fbdeced8f40d2b2f6da6b88149 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Fri, 6 Dec 2019 23:34:21 +0100 Subject: [PATCH] Bake thickness --- Shaders/raytrace/raytrace_bake_thick.cso | Bin 0 -> 7048 bytes Shaders/raytrace/src/build.bat | 1 + Shaders/raytrace/src/raytrace_bake_thick.hlsl | 88 ++++++++++++++++++ Sources/arm/render/RenderPathPaint.hx | 7 +- Sources/arm/render/RenderPathRaytrace.hx | 3 +- Sources/arm/ui/UITrait.hx | 3 +- 6 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 Shaders/raytrace/raytrace_bake_thick.cso create mode 100644 Shaders/raytrace/src/raytrace_bake_thick.hlsl diff --git a/Shaders/raytrace/raytrace_bake_thick.cso b/Shaders/raytrace/raytrace_bake_thick.cso new file mode 100644 index 0000000000000000000000000000000000000000..0fa4ec6812f52a9f8d4669a0094d1529b1a470a2 GIT binary patch literal 7048 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 render_target : register(u0); +RaytracingAccelerationStructure scene : register(t0); +ByteAddressBuffer indices : register(t1); +StructuredBuffer vertices : register(t2); +ConstantBuffer constant_buffer : register(b0); + +Texture2D mytexture0 : register(t3); +Texture2D mytexture1 : register(t4); +Texture2D mytexture2 : register(t5); +Texture2D mytexture_env : register(t6); +Texture2D mytexture_sobol : register(t7); +Texture2D mytexture_scramble : register(t8); +Texture2D mytexture_rank : register(t9); + +static const int SAMPLES = 64; +static uint seed = 0; + +[shader("raygeneration")] +void raygeneration() { + float2 xy = DispatchRaysIndex().xy + 0.5f; + float3 pos = mytexture0.Load(uint3(xy, 0)).rgb; + float3 nor = mytexture1.Load(uint3(xy, 0)).rgb; + + RayPayload payload; + + RayDesc ray; + ray.TMin = constant_buffer.v0.w * 0.01; + ray.TMax = constant_buffer.v0.z * 10.0; + ray.Origin = pos; + payload.ray_origin = ray.Origin; + + float3 accum = float3(0, 0, 0); + + for (int i = 0; i < SAMPLES; ++i) { + ray.Direction = cos_weighted_hemisphere_direction(-nor, i, seed, constant_buffer.v0.x, mytexture_sobol, mytexture_scramble, mytexture_rank); + seed += 1; + TraceRay(scene, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, ray, payload); + accum += payload.color.rgb; + } + + accum /= SAMPLES; + + float3 color = float3(render_target[DispatchRaysIndex().xy].xyz); + if (constant_buffer.v0.x == 0) { + color = accum.xyz; + } + 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")] +void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) { + float dist = RayTCurrent() * 2.0; + payload.color = float4(dist, dist, dist, 1); +} + +[shader("miss")] +void miss(inout RayPayload payload) { + payload.color = float4(1, 1, 1, 1); +} diff --git a/Sources/arm/render/RenderPathPaint.hx b/Sources/arm/render/RenderPathPaint.hx index 7c77471b..ffa40256 100644 --- a/Sources/arm/render/RenderPathPaint.hx +++ b/Sources/arm/render/RenderPathPaint.hx @@ -415,9 +415,10 @@ class RenderPathPaint { if (isMerged) Context.mergedObject.visible = _visible; } #if kha_direct3d12 - else if (UITrait.inst.bakeType == 0 || // AO (DXR) - UITrait.inst.bakeType == 8 || // Lightmap (DXR) - UITrait.inst.bakeType == 9) { // Bent Normal (DXR) + else if (UITrait.inst.bakeType == 0 || // AO (DXR) + UITrait.inst.bakeType == 8 || // Lightmap (DXR) + UITrait.inst.bakeType == 9 || // Bent Normal (DXR) + UITrait.inst.bakeType == 10) { // Thickness (DXR) RenderPathRaytrace.commandsBake(); } #end diff --git a/Sources/arm/render/RenderPathRaytrace.hx b/Sources/arm/render/RenderPathRaytrace.hx index f1d2c975..49a2ebfa 100644 --- a/Sources/arm/render/RenderPathRaytrace.hx +++ b/Sources/arm/render/RenderPathRaytrace.hx @@ -316,7 +316,8 @@ class RenderPathRaytrace { return UITrait.inst.bakeType == 0 ? "raytrace_bake_ao.cso" : UITrait.inst.bakeType == 8 ? "raytrace_bake_light.cso" : - "raytrace_bake_bent.cso"; + UITrait.inst.bakeType == 9 ? "raytrace_bake_bent.cso" : + "raytrace_bake_thick.cso"; } public static function draw() { diff --git a/Sources/arm/ui/UITrait.hx b/Sources/arm/ui/UITrait.hx index 5cf1eb1e..1aa1f3f2 100644 --- a/Sources/arm/ui/UITrait.hx +++ b/Sources/arm/ui/UITrait.hx @@ -990,6 +990,7 @@ class UITrait { #if kha_direct3d12 bakes.push("Lightmap (DXR)"); bakes.push("BentNormal (DXR)"); + bakes.push("Thickness (DXR)"); #end bakeType = ui.combo(bakeHandle, bakes, "Bake"); if (bakeType == 3 || bakeType == 4 || bakeType == 9) { @@ -1009,7 +1010,7 @@ class UITrait { bakeAoOffset = ui.slider(offsetHandle, "Offset", 0.0, 2.0, true); } #if kha_direct3d12 - if (bakeType == 0 || bakeType == 8 || bakeType == 9) { // ao, bent, lightmap + if (bakeType == 0 || bakeType == 8 || bakeType == 9 || bakeType == 10) { // ao, bent, lightmap, thick ui.text("Rays/pix: " + arm.render.RenderPathRaytrace.raysPix); ui.text("Rays/sec: " + arm.render.RenderPathRaytrace.raysSec); }