From 85696bd8f69175a866b5b0cbcbe4d619ce0fe36a Mon Sep 17 00:00:00 2001 From: mrq Date: Tue, 29 Jul 2025 15:39:19 -0500 Subject: [PATCH] some small vxgi tweaks --- bin/data/config.json | 3 ++- bin/data/scenes/scene.json | 2 +- bin/data/shaders/common/macros.h | 2 +- bin/data/shaders/common/vxgi.h | 6 +++++- bin/data/shaders/display/deferred/comp/comp.h | 3 +++ bin/data/shaders/display/vxgi/comp.glsl | 2 +- bin/data/shaders/graph/voxelize/frag.glsl | 4 +--- engine/src/ext/vulkan/rendermodes/deferred.cpp | 4 +++- ext/behaviors/voxelizer/behavior.cpp | 3 ++- 9 files changed, 19 insertions(+), 10 deletions(-) diff --git a/bin/data/config.json b/bin/data/config.json index 157fad62..378eb1bd 100644 --- a/bin/data/config.json +++ b/bin/data/config.json @@ -31,7 +31,7 @@ "vxgi": { "limiter": 0, // "limiter": 0.5, - "size": 256, + "size": 128, "dispatch": 8, "cascades": 3, "cascadePower": 2.0, @@ -155,6 +155,7 @@ "instance": [ "VK_KHR_get_physical_device_properties2" ,"VK_KHR_get_surface_capabilities2" + ,"VK_EXT_swapchain_colorspace" ], "device": [ "VK_EXT_memory_budget" diff --git a/bin/data/scenes/scene.json b/bin/data/scenes/scene.json index 8550c8b6..d7b75053 100644 --- a/bin/data/scenes/scene.json +++ b/bin/data/scenes/scene.json @@ -18,7 +18,7 @@ [ 0, 0, 0, 0 ] ], "shader": { - "mode": 10, + "mode": 0, "scalar": 16, "parameters": [ 0, 0, 0, "time" ] } diff --git a/bin/data/shaders/common/macros.h b/bin/data/shaders/common/macros.h index ae112caa..4c006e6e 100644 --- a/bin/data/shaders/common/macros.h +++ b/bin/data/shaders/common/macros.h @@ -79,7 +79,7 @@ #endif #if BARYCENTRIC #ifndef BARYCENTRIC_CALCULATE - #define BARYCENTRIC_CALCULATE 0 + #define BARYCENTRIC_CALCULATE 1 #endif #ifndef BUFFER_REFERENCE #define BUFFER_REFERENCE 1 diff --git a/bin/data/shaders/common/vxgi.h b/bin/data/shaders/common/vxgi.h index 90ddc928..3829baa3 100644 --- a/bin/data/shaders/common/vxgi.h +++ b/bin/data/shaders/common/vxgi.h @@ -29,6 +29,7 @@ vec4 voxelTrace( inout Ray ray, float aperture, float maxDistance ) { const float tStart = rayBoxInfoA.x; const float tEnd = maxDistance > 0 ? min(maxDistance, rayBoxInfoB.y) : rayBoxInfoB.y; const float tDelta = voxelInfo.radianceSizeRecip * granularityRecip; + const uint MIN_VOXEL_MIP_LEVEL = 1; // marcher ray.distance = tStart + tDelta * ubo.settings.vxgi.traceStartOffsetFactor; ray.position = vec3(0); @@ -41,7 +42,9 @@ vec4 voxelTrace( inout Ray ray, float aperture, float maxDistance ) { float occlusion = 0.0; uint stepCounter = 0; while ( color.a < 1.0 && occlusion < 1.0 && ray.distance < tEnd && stepCounter++ < maxSteps ) { - ray.distance += tDelta * cascadePower(cascade) * max(1, coneDiameter); + float stepScale = max(1.0, coneDiameter * cascadePower(cascade)); + ray.distance += tDelta * stepScale; + // ray.distance += tDelta * cascadePower(cascade) * max(1, coneDiameter); ray.position = ray.origin + ray.direction * ray.distance; #if VXGI_NDC @@ -54,6 +57,7 @@ vec4 voxelTrace( inout Ray ray, float aperture, float maxDistance ) { if ( cascade >= CASCADES || uvw.x < 0.0 || uvw.y < 0.0 || uvw.z < 0.0 || uvw.x >= 1.0 || uvw.y >= 1.0 || uvw.z >= 1.0 ) break; coneDiameter = coneCoefficient * ray.distance; level = aperture > 0 ? log2( coneDiameter ) : 0; + // level = clamp(level, MIN_VOXEL_MIP_LEVEL, voxelInfo.mipmapLevels - 1); if ( level >= voxelInfo.mipmapLevels ) break; radiance = textureLod(voxelOutput[nonuniformEXT(cascade)], uvw.xzy, level); color += (1.0 - color.a) * radiance; diff --git a/bin/data/shaders/display/deferred/comp/comp.h b/bin/data/shaders/display/deferred/comp/comp.h index 5d52dfab..e582349b 100644 --- a/bin/data/shaders/display/deferred/comp/comp.h +++ b/bin/data/shaders/display/deferred/comp/comp.h @@ -292,6 +292,9 @@ void directLighting() { surface.material.albedo.rgb = radiance.rgb; surface.material.indirect.rgb = vec3(0); + surface.fragment.rgb = radiance.rgb; + surface.fragment.a = radiance.a; + return; } #endif diff --git a/bin/data/shaders/display/vxgi/comp.glsl b/bin/data/shaders/display/vxgi/comp.glsl index f33f5301..a02b573f 100644 --- a/bin/data/shaders/display/vxgi/comp.glsl +++ b/bin/data/shaders/display/vxgi/comp.glsl @@ -58,7 +58,7 @@ layout (binding = 15, r32ui) uniform volatile coherent uimage3D voxelRadianceG[C layout (binding = 16, r32ui) uniform volatile coherent uimage3D voxelRadianceB[CASCADES]; layout (binding = 17, r32ui) uniform volatile coherent uimage3D voxelRadianceA[CASCADES]; layout (binding = 18, r32ui) uniform volatile coherent uimage3D voxelCount[CASCADES]; -layout (binding = 19, rgba16f) uniform volatile coherent image3D voxelOutput[CASCADES]; +layout (binding = 19, rgba8) uniform volatile coherent image3D voxelOutput[CASCADES]; #include "../../common/functions.h" #include "../../common/light.h" diff --git a/bin/data/shaders/graph/voxelize/frag.glsl b/bin/data/shaders/graph/voxelize/frag.glsl index cdc4db79..1744c9c5 100644 --- a/bin/data/shaders/graph/voxelize/frag.glsl +++ b/bin/data/shaders/graph/voxelize/frag.glsl @@ -46,7 +46,7 @@ layout (binding = 17, r32ui) uniform volatile coherent uimage3D voxelRadianceG[C layout (binding = 18, r32ui) uniform volatile coherent uimage3D voxelRadianceB[CASCADES]; layout (binding = 19, r32ui) uniform volatile coherent uimage3D voxelRadianceA[CASCADES]; layout (binding = 20, r32ui) uniform volatile coherent uimage3D voxelCount[CASCADES]; -layout (binding = 21, rgba16f) uniform volatile coherent image3D voxelOutput[CASCADES]; +layout (binding = 21, rgba8) uniform volatile coherent image3D voxelOutput[CASCADES]; layout (location = 0) flat in uvec4 inId; layout (location = 1) flat in vec4 inPOS0; @@ -133,6 +133,4 @@ void main() { imageAtomicAdd(voxelRadianceB[CASCADE], ivec3(uvw), uint( A.b * 256 ) ); imageAtomicAdd(voxelRadianceA[CASCADE], ivec3(uvw), uint( A.a * 256 ) ); imageAtomicAdd(voxelCount[CASCADE], ivec3(uvw), uint( 1 ) ); - - imageStore(voxelOutput[CASCADE], uvw, vec4(N.x, N.y, N.z, A.a) ); } \ No newline at end of file diff --git a/engine/src/ext/vulkan/rendermodes/deferred.cpp b/engine/src/ext/vulkan/rendermodes/deferred.cpp index 39b49cc4..0b758290 100644 --- a/engine/src/ext/vulkan/rendermodes/deferred.cpp +++ b/engine/src/ext/vulkan/rendermodes/deferred.cpp @@ -15,10 +15,12 @@ #include #include +// to-do: fix this #define BARYCENTRIC 0 #if BARYCENTRIC + // agnostic for all devices, setting to 0 is only supported on AMD for little differences anyways #ifndef BARYCENTRIC_CALCULATE - #define BARYCENTRIC_CALCULATE 0 + #define BARYCENTRIC_CALCULATE 1 #endif #endif diff --git a/ext/behaviors/voxelizer/behavior.cpp b/ext/behaviors/voxelizer/behavior.cpp index 1d468a15..4986edbd 100644 --- a/ext/behaviors/voxelizer/behavior.cpp +++ b/ext/behaviors/voxelizer/behavior.cpp @@ -71,7 +71,8 @@ void ext::VoxelizerSceneBehavior::initialize( uf::Object& self ) { output.sampler.descriptor.filter.min = uf::renderer::enums::Filter::NEAREST; output.sampler.descriptor.filter.mag = uf::renderer::enums::Filter::NEAREST; } - output.fromBuffers( NULL, 0, uf::renderer::settings::pipelines::hdr ? uf::renderer::enums::Format::HDR : uf::renderer::enums::Format::SDR, metadata.voxelSize.x, metadata.voxelSize.y, metadata.voxelSize.z, 1, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_LAYOUT_GENERAL ); + // output.fromBuffers( NULL, 0, uf::renderer::settings::pipelines::hdr ? uf::renderer::enums::Format::HDR : uf::renderer::enums::Format::SDR, metadata.voxelSize.x, metadata.voxelSize.y, metadata.voxelSize.z, 1, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_LAYOUT_GENERAL ); + output.fromBuffers( NULL, 0, uf::renderer::enums::Format::R8G8B8A8_UNORM, metadata.voxelSize.x, metadata.voxelSize.y, metadata.voxelSize.z, 1, VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT, VK_IMAGE_LAYOUT_GENERAL ); } // initialize render mode {