Add METERS_TO_UNITS and impl metric units in shadows rendering

This commit is contained in:
Wojtek Figat
2024-04-11 16:38:43 +02:00
parent a532ea7b42
commit 62444315de
2 changed files with 10 additions and 4 deletions

View File

@@ -0,0 +1,5 @@
// Copyright (c) 2012-2024 Wojciech Figat. All rights reserved.
#pragma once
#define METERS_TO_UNITS(meters) (meters * 100.0f)

View File

@@ -10,6 +10,7 @@
#include "Engine/Graphics/PixelFormatExtensions.h"
#include "Engine/Content/Content.h"
#include "Engine/Engine/Engine.h"
#include "Engine/Engine/Units.h"
#include "Engine/Graphics/RenderTools.h"
#include "Engine/Level/Scene/SceneRendering.h"
#include "Engine/Scripting/Enums.h"
@@ -21,8 +22,8 @@
#define SHADOWS_MAX_TILES 6
#define SHADOWS_MIN_RESOLUTION 16
#define SHADOWS_BASE_LIGHT_RESOLUTION(atlasResolution) atlasResolution / MAX_CSM_CASCADES // Allow to store 4 CSM cascades in a single row in all cases
#define NormalOffsetScaleTweak 100.0f
#define LocalLightNearPlane 10.0f
#define NormalOffsetScaleTweak METERS_TO_UNITS(1)
#define LocalLightNearPlane METERS_TO_UNITS(0.1f)
PACK_STRUCT(struct Data{
ShaderGBufferData GBuffer;
@@ -251,7 +252,7 @@ struct ShadowAtlasLight
{
// Local light
const auto& localLight = (const RenderLocalLightData&)light;
if (!Float3::NearEqual(Cache.Position, light.Position, 1.0f) ||
if (!Float3::NearEqual(Cache.Position, light.Position, METERS_TO_UNITS(0.1f)) ||
!Math::NearEqual(Cache.Radius, localLight.Radius))
{
// Invalidate
@@ -595,7 +596,7 @@ bool ShadowsPass::SetupLight(ShadowsCustomBuffer& shadows, RenderContext& render
// Calculate static resolution for the light based on the world-bounds, not view-dependant
shadows.InitStaticAtlas();
const int32 baseLightResolution = SHADOWS_BASE_LIGHT_RESOLUTION(shadows.Resolution);
int32 staticResolution = Math::RoundToInt(Math::Saturate(light.Radius / 1000.0f) * baseLightResolution);
int32 staticResolution = Math::RoundToInt(Math::Saturate(light.Radius / METERS_TO_UNITS(10)) * baseLightResolution);
if (!Math::IsPowerOfTwo(staticResolution))
staticResolution = Math::RoundUpToPowerOf2(staticResolution);
atlasLight.StaticResolution = staticResolution;