--- title: Untitled date: 2024-12-08 12:18:54 excerpt: tags: rating: ⭐ --- # 阴影偏移 可以考虑的Buffer有 - ShadowDepths - CustomDepth ## 相关Paas 1. ShadowDepths 2. Lights 1. DirectLighting 1. UnbatchedLights 1. ShadowProjectionOnOpaque # 其他 顺序: RenderCustomDepthPass FSceneRenderer::CreateDynamicShadows => FSceneRenderer::CreatePerObjectProjectedShadow ```c++ if (!IsForwardShadingEnabled(ShaderPlatform)) { // Dynamic shadows are synced later when using the deferred path to make more headroom for tasks. FinishInitDynamicShadows(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager, ExternalAccessQueue); } ``` ```c++ if (RendererOutput == ERendererOutput::DepthPrepassOnly) { RenderOcclusionLambda(); if (bUpdateNaniteStreaming) { Nanite::GStreamingManager.SubmitFrameStreamingRequests(GraphBuilder); } CopySceneCaptureComponentToTarget(GraphBuilder, SceneTextures, ViewFamilyTexture, ViewFamily, Views); } else { GVRSImageManager.PrepareImageBasedVRS(GraphBuilder, ViewFamily, SceneTextures); if (!IsForwardShadingEnabled(ShaderPlatform)) { // Dynamic shadows are synced later when using the deferred path to make more headroom for tasks. FinishInitDynamicShadows(GraphBuilder, InitViewTaskDatas.DynamicShadows, InstanceCullingManager, ExternalAccessQueue); } // Update groom only visible in shadow if (IsHairStrandsEnabled(EHairStrandsShaderType::All, Scene->GetShaderPlatform()) && RendererOutput == ERendererOutput::FinalSceneColor) { UpdateHairStrandsBookmarkParameters(Scene, Views, HairStrandsBookmarkParameters); // Interpolation for cards/meshes only visible in shadow needs to happen after the shadow jobs are completed const bool bRunHairStrands = HairStrandsBookmarkParameters.HasInstances() && (Views.Num() > 0); if (bRunHairStrands) { RunHairStrandsBookmark(GraphBuilder, EHairStrandsBookmark::ProcessCardsAndMeshesInterpolation_ShadowView, HairStrandsBookmarkParameters); } } // NOTE: The ordering of the lights is used to select sub-sets for different purposes, e.g., those that support clustered deferred. FSortedLightSetSceneInfo& SortedLightSet = *GraphBuilder.AllocObject(); { RDG_CSV_STAT_EXCLUSIVE_SCOPE(GraphBuilder, SortLights); RDG_GPU_STAT_SCOPE(GraphBuilder, SortLights); ComputeLightGridOutput = GatherLightsAndComputeLightGrid(GraphBuilder, bComputeLightGrid, SortedLightSet); } ```