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:
Yuriy ODonnell
2021-03-02 16:33:53 -04:00
parent 1950248fe7
commit 2625641b7d
5 changed files with 43 additions and 8 deletions

View File

@@ -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)

View File

@@ -9,6 +9,7 @@
#if RHI_RAYTRACING
#include "RayTracingDefinitions.h"
void AddOpaqueRaytracingInstance(const FMatrix& InstanceTransform, const FRayTracingGeometry* RayTracingGeometry, const uint32 Mask, TArray<FRayTracingInstance>& OutRayTracingInstances)
{

View File

@@ -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

View File

@@ -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

View File

@@ -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