diff --git a/Shaders/raytrace/raytrace_bake_ao.cso b/Shaders/raytrace/raytrace_bake_ao.cso index 51aa0edf..6ec8ae1c 100644 Binary files a/Shaders/raytrace/raytrace_bake_ao.cso and b/Shaders/raytrace/raytrace_bake_ao.cso differ diff --git a/Shaders/raytrace/raytrace_bake_bent.cso b/Shaders/raytrace/raytrace_bake_bent.cso index 10928ad1..c3490738 100644 Binary files a/Shaders/raytrace/raytrace_bake_bent.cso and b/Shaders/raytrace/raytrace_bake_bent.cso differ diff --git a/Shaders/raytrace/raytrace_bake_light.cso b/Shaders/raytrace/raytrace_bake_light.cso index 3e041b21..26cc8bdb 100644 Binary files a/Shaders/raytrace/raytrace_bake_light.cso and b/Shaders/raytrace/raytrace_bake_light.cso differ diff --git a/Shaders/raytrace/raytrace_bake_thick.cso b/Shaders/raytrace/raytrace_bake_thick.cso index 0fa4ec68..89e335f5 100644 Binary files a/Shaders/raytrace/raytrace_bake_thick.cso and b/Shaders/raytrace/raytrace_bake_thick.cso differ diff --git a/Shaders/raytrace/src/raytrace_bake_ao.hlsl b/Shaders/raytrace/src/raytrace_bake_ao.hlsl index b129ae8a..2493a772 100644 --- a/Shaders/raytrace/src/raytrace_bake_ao.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_ao.hlsl @@ -42,7 +42,12 @@ static uint seed = 0; [shader("raygeneration")] void raygeneration() { float2 xy = DispatchRaysIndex().xy + 0.5f; - float3 pos = mytexture0.Load(uint3(xy, 0)).rgb; + float4 tex0 = mytexture0.Load(uint3(xy, 0)); + if (tex0.a == 0.0) { + render_target[DispatchRaysIndex().xy] = float4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + float3 pos = tex0.rgb; float3 nor = mytexture1.Load(uint3(xy, 0)).rgb; RayPayload payload; @@ -62,7 +67,6 @@ void raygeneration() { } accum /= SAMPLES; - accum = float3(1, 1, 1) - accum; float3 color = float3(render_target[DispatchRaysIndex().xy].xyz); if (constant_buffer.v0.x == 0) { @@ -78,10 +82,10 @@ void raygeneration() { [shader("closesthit")] void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attr) { - payload.color = float4(1, 1, 1, 1); + payload.color = float4(0, 0, 0, 1); } [shader("miss")] void miss(inout RayPayload payload) { - payload.color = float4(0, 0, 0, 0); + payload.color = float4(1, 1, 1, 1); } diff --git a/Shaders/raytrace/src/raytrace_bake_bent.hlsl b/Shaders/raytrace/src/raytrace_bake_bent.hlsl index 7d3d4814..0e338b7d 100644 --- a/Shaders/raytrace/src/raytrace_bake_bent.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_bent.hlsl @@ -42,7 +42,12 @@ static uint seed = 0; [shader("raygeneration")] void raygeneration() { float2 xy = DispatchRaysIndex().xy + 0.5f; - float3 pos = mytexture0.Load(uint3(xy, 0)).rgb; + float4 tex0 = mytexture0.Load(uint3(xy, 0)); + if (tex0.a == 0.0) { + render_target[DispatchRaysIndex().xy] = float4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + float3 pos = tex0.rgb; float3 nor = mytexture1.Load(uint3(xy, 0)).rgb; RayPayload payload; diff --git a/Shaders/raytrace/src/raytrace_bake_light.hlsl b/Shaders/raytrace/src/raytrace_bake_light.hlsl index 14a9a971..9cf30984 100644 --- a/Shaders/raytrace/src/raytrace_bake_light.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_light.hlsl @@ -43,7 +43,12 @@ static uint seed = 0; [shader("raygeneration")] void raygeneration() { float2 xy = DispatchRaysIndex().xy + 0.5f; - float3 pos = mytexture0.Load(uint3(xy, 0)).rgb; + float4 tex0 = mytexture0.Load(uint3(xy, 0)); + if (tex0.a == 0.0) { + render_target[DispatchRaysIndex().xy] = float4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + float3 pos = tex0.rgb; float3 nor = mytexture1.Load(uint3(xy, 0)).rgb; RayPayload payload; diff --git a/Shaders/raytrace/src/raytrace_bake_thick.hlsl b/Shaders/raytrace/src/raytrace_bake_thick.hlsl index 2db44f0a..c72899f1 100644 --- a/Shaders/raytrace/src/raytrace_bake_thick.hlsl +++ b/Shaders/raytrace/src/raytrace_bake_thick.hlsl @@ -42,7 +42,12 @@ static uint seed = 0; [shader("raygeneration")] void raygeneration() { float2 xy = DispatchRaysIndex().xy + 0.5f; - float3 pos = mytexture0.Load(uint3(xy, 0)).rgb; + float4 tex0 = mytexture0.Load(uint3(xy, 0)); + if (tex0.a == 0.0) { + render_target[DispatchRaysIndex().xy] = float4(0.0f, 0.0f, 0.0f, 0.0f); + return; + } + float3 pos = tex0.rgb; float3 nor = mytexture1.Load(uint3(xy, 0)).rgb; RayPayload payload; @@ -84,5 +89,5 @@ void closesthit(inout RayPayload payload, in BuiltInTriangleIntersectionAttribut [shader("miss")] void miss(inout RayPayload payload) { - payload.color = float4(1, 1, 1, 1); + payload.color = float4(0, 0, 0, 1); } diff --git a/Sources/arm/node/MakeBake.hx b/Sources/arm/node/MakeBake.hx index c3cc849c..c9d456fa 100644 --- a/Sources/arm/node/MakeBake.hx +++ b/Sources/arm/node/MakeBake.hx @@ -10,7 +10,7 @@ import arm.Tool; class MakeBake { public static function run(vert:MaterialShader, frag:MaterialShader) { - if (UITrait.inst.bakeType == 0) { // AO + if (UITrait.inst.bakeType == 0) { // AO (voxel) // Apply normal channel frag.wposition = true; frag.n = true; @@ -58,7 +58,7 @@ class MakeBake { } else if (UITrait.inst.bakeType == 2) { // Normal (Tangent) frag.n = true; - frag.add_uniform('sampler2D texpaint_undo', '_texpaint_undo'); + frag.add_uniform('sampler2D texpaint_undo', '_texpaint_undo'); // Baked high-poly normals frag.write('vec3 n0 = textureLod(texpaint_undo, texCoord, 0.0).rgb * vec3(2.0, 2.0, 2.0) - vec3(1.0, 1.0, 1.0);'); frag.add_function(MaterialFunctions.str_cotangentFrame); frag.write('mat3 invTBN = transpose(cotangentFrame(n, n, texCoord));'); @@ -84,7 +84,7 @@ class MakeBake { } else if (UITrait.inst.bakeType == 6) { // Material ID frag.add_uniform('sampler2D texpaint_nor_undo', '_texpaint_nor_undo'); - frag.write('float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a;'); + frag.write('float sample_matid = textureLod(texpaint_nor_undo, texCoord, 0.0).a + 1.0 / 255.0;'); frag.write('float matid_r = fract(sin(dot(vec2(sample_matid, sample_matid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); frag.write('float matid_g = fract(sin(dot(vec2(sample_matid * 20.0, sample_matid), vec2(12.9898, 78.233))) * 43758.5453);'); frag.write('float matid_b = fract(sin(dot(vec2(sample_matid, sample_matid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); @@ -92,9 +92,10 @@ class MakeBake { } else if (UITrait.inst.bakeType == 7) { // Object ID frag.add_uniform('float objectId', '_objectId'); - frag.write('float id_r = fract(sin(dot(vec2(objectId, objectId * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); - frag.write('float id_g = fract(sin(dot(vec2(objectId * 20.0, objectId), vec2(12.9898, 78.233))) * 43758.5453);'); - frag.write('float id_b = fract(sin(dot(vec2(objectId, objectId * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); + frag.write('float obid = objectId + 1.0 / 255.0;'); + frag.write('float id_r = fract(sin(dot(vec2(obid, obid * 20.0), vec2(12.9898, 78.233))) * 43758.5453);'); + frag.write('float id_g = fract(sin(dot(vec2(obid * 20.0, obid), vec2(12.9898, 78.233))) * 43758.5453);'); + frag.write('float id_b = fract(sin(dot(vec2(obid, obid * 40.0), vec2(12.9898, 78.233))) * 43758.5453);'); frag.write('fragColor[0] = vec4(id_r, id_g, id_b, 1.0);'); } } diff --git a/Sources/arm/render/RenderPathRaytrace.hx b/Sources/arm/render/RenderPathRaytrace.hx index 49a2ebfa..877e8d83 100644 --- a/Sources/arm/render/RenderPathRaytrace.hx +++ b/Sources/arm/render/RenderPathRaytrace.hx @@ -144,6 +144,8 @@ class RenderPathRaytrace { var _bakeType = UITrait.inst.bakeType; UITrait.inst.bakeType = -1; MaterialParser.parsePaintMaterial(); + path.setTarget("baketex0"); + path.clearTarget(0x00000000); // Pixels with alpha of 0.0 are skipped during raytracing for (i in 0...4) { // Jitter path.setTarget("baketex0", ["baketex1"]); path.drawMeshes("paint");