You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Cache ray tracing instance mask and flags in Nanite FSceneProxy.
#rb Juan.Canada [CL 15573733 by Yuriy ODonnell in ue5-main branch]
This commit is contained in:
@@ -8,13 +8,24 @@
|
||||
|
||||
#if RHI_RAYTRACING
|
||||
|
||||
#include "RayTracingDefinitions.h"
|
||||
|
||||
void FRayTracingInstance::BuildInstanceMaskAndFlags()
|
||||
{
|
||||
TArrayView<const FMeshBatch> MeshBatches = GetMaterials();
|
||||
FRayTracingMaskAndFlags MaskAndFlags = BuildRayTracingInstanceMaskAndFlags(MeshBatches);
|
||||
|
||||
Mask |= MaskAndFlags.Mask;
|
||||
bForceOpaque = bForceOpaque || MaskAndFlags.bForceOpaque;
|
||||
}
|
||||
|
||||
FRayTracingMaskAndFlags BuildRayTracingInstanceMaskAndFlags(TArrayView<const FMeshBatch> MeshBatches)
|
||||
{
|
||||
FRayTracingMaskAndFlags Result;
|
||||
|
||||
ensureMsgf(MeshBatches.Num() > 0, TEXT("You need to add MeshBatches first for instance mask and flags to build upon."));
|
||||
|
||||
Mask = 0;
|
||||
Result.Mask = 0;
|
||||
|
||||
bool bAllSegmentsOpaque = true;
|
||||
bool bAnySegmentsCastShadow = false;
|
||||
@@ -27,14 +38,16 @@ void FRayTracingInstance::BuildInstanceMaskAndFlags()
|
||||
const FMaterialRenderProxy* FallbackMaterialRenderProxyPtr = nullptr;
|
||||
const FMaterial& Material = MeshBatch.MaterialRenderProxy->GetMaterialWithFallback(ERHIFeatureLevel::SM5, FallbackMaterialRenderProxyPtr);
|
||||
const EBlendMode BlendMode = Material.GetBlendMode();
|
||||
Mask |= ComputeBlendModeMask(BlendMode);
|
||||
Result.Mask |= ComputeBlendModeMask(BlendMode);
|
||||
bAllSegmentsOpaque &= BlendMode == BLEND_Opaque;
|
||||
bAnySegmentsCastShadow |= MeshBatch.CastRayTracedShadow && Material.CastsRayTracedShadows();
|
||||
bAllSegmentsCastShadow &= MeshBatch.CastRayTracedShadow && Material.CastsRayTracedShadows();
|
||||
}
|
||||
|
||||
bForceOpaque = bAllSegmentsOpaque && bAllSegmentsCastShadow;
|
||||
Mask |= bAnySegmentsCastShadow ? RAY_TRACING_MASK_SHADOW : 0;
|
||||
Result.bForceOpaque = bAllSegmentsOpaque && bAllSegmentsCastShadow;
|
||||
Result.Mask |= bAnySegmentsCastShadow ? RAY_TRACING_MASK_SHADOW : 0;
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
uint8 ComputeBlendModeMask(const EBlendMode BlendMode)
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#if RHI_RAYTRACING
|
||||
|
||||
#include "RayTracingDefinitions.h"
|
||||
|
||||
void AddOpaqueRaytracingInstance(const FMatrix& InstanceTransform, const FRayTracingGeometry* RayTracingGeometry, const uint32 Mask, TArray<FRayTracingInstance>& OutRayTracingInstances)
|
||||
{
|
||||
|
||||
@@ -460,6 +460,9 @@ FSceneProxy::FSceneProxy(UStaticMeshComponent* Component)
|
||||
RayTracingGeometry = &LODResources[LODIndex].RayTracingGeometry;
|
||||
bHasRayTracingInstances = true;
|
||||
}
|
||||
|
||||
// This will be filled later (on the render thread) and cached.
|
||||
CachedRayTracingInstanceMaskAndFlags.Mask = 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@@ -951,7 +954,13 @@ void FSceneProxy::GetDynamicRayTracingInstances(FRayTracingMaterialGatheringCont
|
||||
|
||||
RayTracingInstance.MaterialsView = CachedRayTracingMaterials;
|
||||
|
||||
RayTracingInstance.BuildInstanceMaskAndFlags();
|
||||
if (CachedRayTracingInstanceMaskAndFlags.Mask == 0)
|
||||
{
|
||||
CachedRayTracingInstanceMaskAndFlags = BuildRayTracingInstanceMaskAndFlags(CachedRayTracingMaterials);
|
||||
}
|
||||
|
||||
RayTracingInstance.Mask = CachedRayTracingInstanceMaskAndFlags.Mask;
|
||||
RayTracingInstance.bForceOpaque = CachedRayTracingInstanceMaskAndFlags.bForceOpaque;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include "PrimitiveSceneProxy.h"
|
||||
#include "PrimitiveViewRelevance.h"
|
||||
#include "Rendering/NaniteResources.h"
|
||||
#include "RayTracingInstance.h"
|
||||
|
||||
namespace Nanite
|
||||
{
|
||||
@@ -163,6 +164,7 @@ protected:
|
||||
TArray<FMatrix> CachedRayTracingInstanceTransforms;
|
||||
TArray<FMeshBatch> CachedRayTracingMaterials;
|
||||
FMatrix CachedRayTracingInstanceLocalToWorld = {};
|
||||
FRayTracingMaskAndFlags CachedRayTracingInstanceMaskAndFlags;
|
||||
#endif
|
||||
|
||||
#if NANITE_ENABLE_DEBUG_RENDERING
|
||||
|
||||
@@ -6,7 +6,15 @@
|
||||
#include "MeshBatch.h"
|
||||
|
||||
#if RHI_RAYTRACING
|
||||
#include "RayTracingDefinitions.h"
|
||||
|
||||
struct FRayTracingMaskAndFlags
|
||||
{
|
||||
/** Instance mask that can be used to exclude the instance from specific effects (eg. ray traced shadows). */
|
||||
uint8 Mask = 0xFF;
|
||||
|
||||
/** Whether the instance is forced opaque, i.e. anyhit shaders are disabled on this instance */
|
||||
bool bForceOpaque = false;
|
||||
};
|
||||
|
||||
struct FRayTracingInstance
|
||||
{
|
||||
@@ -42,10 +50,10 @@ struct FRayTracingInstance
|
||||
}
|
||||
|
||||
/** Whether the instance is forced opaque, i.e. anyhit shaders are disabled on this instance */
|
||||
bool bForceOpaque : 1;
|
||||
bool bForceOpaque = false;
|
||||
|
||||
/** Instance mask that can be used to exclude the instance from specific effects (eg. ray traced shadows). */
|
||||
uint8 Mask = RAY_TRACING_MASK_ALL;
|
||||
uint8 Mask = 0xFF;
|
||||
|
||||
/**
|
||||
* Transforms count. When NumTransforms == 1 we create a single instance.
|
||||
@@ -86,5 +94,7 @@ struct FRayTracingInstance
|
||||
ENGINE_API void BuildInstanceMaskAndFlags();
|
||||
};
|
||||
|
||||
/** Build mask and flags based on materials specified in Materials. You can still override Mask after calling this function. */
|
||||
ENGINE_API FRayTracingMaskAndFlags BuildRayTracingInstanceMaskAndFlags(TArrayView<const FMeshBatch> MeshBatches);
|
||||
ENGINE_API uint8 ComputeBlendModeMask(const EBlendMode BlendMode);
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user