vault backup: 2024-12-17 18:07:52
This commit is contained in:
parent
a6d806009b
commit
e44bf4fd5a
@ -24,3 +24,4 @@
|
|||||||
- [x] 帮助朱雨辰解决:
|
- [x] 帮助朱雨辰解决:
|
||||||
- [x] 4周年角色不能完全变黑问题。
|
- [x] 4周年角色不能完全变黑问题。
|
||||||
- [x] 渲片时的天空球问题切换天空盒问题。
|
- [x] 渲片时的天空球问题切换天空盒问题。
|
||||||
|
- [ ]
|
@ -21,11 +21,6 @@ Shader推荐:
|
|||||||
- DepthOnlyVertexShader.usf
|
- DepthOnlyVertexShader.usf
|
||||||
- DepthOnlyPixelShader.usf
|
- DepthOnlyPixelShader.usf
|
||||||
|
|
||||||
# NaniteMeshDraw
|
|
||||||
`Engine\Source\Runtime\Renderer\Private\Nanite\`NaniteMaterials.h & NaniteMaterials.cpp
|
|
||||||
|
|
||||||
PS.使用的Shader必须是`FNaniteGlobalShader`的子类。
|
|
||||||
|
|
||||||
## BasePass
|
## BasePass
|
||||||
### DrawBasePass()
|
### DrawBasePass()
|
||||||
该函数在FDeferredShadingSceneRenderer::RenderBasePassInternal()中调用。
|
该函数在FDeferredShadingSceneRenderer::RenderBasePassInternal()中调用。
|
||||||
@ -256,3 +251,146 @@ FViewInfo& ViewInfo
|
|||||||
- GET_STATID(STAT_CLP_BasePass)
|
- GET_STATID(STAT_CLP_BasePass)
|
||||||
- FRDGParallelCommandListSet ParallelCommandListSet(InPass, RHICmdList, GET_STATID(STAT_CLP_BasePass), View, FParallelCommandListBindings(PassParameters));
|
- FRDGParallelCommandListSet ParallelCommandListSet(InPass, RHICmdList, GET_STATID(STAT_CLP_BasePass), View, FParallelCommandListBindings(PassParameters));
|
||||||
- DECLARE_CYCLE_STAT(TEXT("BasePass"), STAT_CLP_BasePass, STATGROUP_ParallelCommandListMarkers);
|
- DECLARE_CYCLE_STAT(TEXT("BasePass"), STAT_CLP_BasePass, STATGROUP_ParallelCommandListMarkers);
|
||||||
|
|
||||||
|
# NaniteMeshDraw
|
||||||
|
`Engine\Source\Runtime\Renderer\Private\Nanite\`NaniteMaterials.h & NaniteMaterials.cpp
|
||||||
|
|
||||||
|
PS.使用的Shader必须是`FNaniteGlobalShader`的子类。
|
||||||
|
|
||||||
|
以下是Nanite物体的CustomDepth绘制过程:
|
||||||
|
```c++
|
||||||
|
bool FSceneRenderer::RenderCustomDepthPass(
|
||||||
|
FRDGBuilder& GraphBuilder,
|
||||||
|
FCustomDepthTextures& CustomDepthTextures,
|
||||||
|
const FSceneTextureShaderParameters& SceneTextures,
|
||||||
|
TConstArrayView<Nanite::FRasterResults> PrimaryNaniteRasterResults,
|
||||||
|
TConstArrayView<Nanite::FPackedView> PrimaryNaniteViews)
|
||||||
|
{
|
||||||
|
if (!CustomDepthTextures.IsValid())
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine if any of the views have custom depth and if any of them have Nanite that is rendering custom depth
|
||||||
|
bool bAnyCustomDepth = false;
|
||||||
|
TArray<FNaniteCustomDepthDrawList, SceneRenderingAllocator> NaniteDrawLists;
|
||||||
|
NaniteDrawLists.AddDefaulted(Views.Num());
|
||||||
|
uint32 TotalNaniteInstances = 0;
|
||||||
|
for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ++ViewIndex)
|
||||||
|
{
|
||||||
|
FViewInfo& View = Views[ViewIndex];
|
||||||
|
if (View.ShouldRenderView() && View.bHasCustomDepthPrimitives)
|
||||||
|
{
|
||||||
|
if (PrimaryNaniteRasterResults.IsValidIndex(ViewIndex))
|
||||||
|
{
|
||||||
|
const FNaniteVisibilityResults& VisibilityResults = PrimaryNaniteRasterResults[ViewIndex].VisibilityResults;
|
||||||
|
|
||||||
|
// Get the Nanite instance draw list for this view. (NOTE: Always use view index 0 for now because we're not doing
|
||||||
|
// multi-view yet).
|
||||||
|
NaniteDrawLists[ViewIndex] = BuildNaniteCustomDepthDrawList(View, 0u, VisibilityResults);
|
||||||
|
|
||||||
|
TotalNaniteInstances += NaniteDrawLists[ViewIndex].Num();
|
||||||
|
}
|
||||||
|
bAnyCustomDepth = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SET_DWORD_STAT(STAT_NaniteCustomDepthInstances, TotalNaniteInstances);
|
||||||
|
..
|
||||||
|
if (TotalNaniteInstances > 0)
|
||||||
|
{
|
||||||
|
RDG_EVENT_SCOPE(GraphBuilder, "Nanite CustomDepth");
|
||||||
|
|
||||||
|
const FIntPoint RasterTextureSize = CustomDepthTextures.Depth->Desc.Extent;
|
||||||
|
FIntRect RasterTextureRect(0, 0, RasterTextureSize.X, RasterTextureSize.Y);
|
||||||
|
if (Views.Num() == 1)
|
||||||
|
{
|
||||||
|
const FViewInfo& View = Views[0];
|
||||||
|
if (View.ViewRect.Min.X == 0 && View.ViewRect.Min.Y == 0)
|
||||||
|
{
|
||||||
|
RasterTextureRect = View.ViewRect;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const bool bWriteCustomStencil = IsCustomDepthPassWritingStencil();
|
||||||
|
|
||||||
|
Nanite::FSharedContext SharedContext{};
|
||||||
|
SharedContext.FeatureLevel = Scene->GetFeatureLevel();
|
||||||
|
SharedContext.ShaderMap = GetGlobalShaderMap(SharedContext.FeatureLevel);
|
||||||
|
SharedContext.Pipeline = Nanite::EPipeline::Primary;
|
||||||
|
|
||||||
|
// TODO: If !bWriteCustomStencil, we could copy off the depth and rasterize depth-only (probable optimization)
|
||||||
|
Nanite::FRasterContext RasterContext = Nanite::InitRasterContext(
|
||||||
|
GraphBuilder,
|
||||||
|
SharedContext,
|
||||||
|
ViewFamily,
|
||||||
|
RasterTextureSize,
|
||||||
|
RasterTextureRect,
|
||||||
|
false, // bVisualize
|
||||||
|
Nanite::EOutputBufferMode::VisBuffer,
|
||||||
|
true, // bClearTarget
|
||||||
|
nullptr, // RectMinMaxBufferSRV
|
||||||
|
0, // NumRects
|
||||||
|
nullptr, // ExternalDepthBuffer
|
||||||
|
true // bCustomPass
|
||||||
|
);
|
||||||
|
|
||||||
|
Nanite::FCustomDepthContext CustomDepthContext = Nanite::InitCustomDepthStencilContext(
|
||||||
|
GraphBuilder,
|
||||||
|
CustomDepthTextures,
|
||||||
|
bWriteCustomStencil);
|
||||||
|
|
||||||
|
Nanite::FConfiguration CullingConfig = { 0 };
|
||||||
|
CullingConfig.bUpdateStreaming = true;
|
||||||
|
|
||||||
|
for (int32 ViewIndex = 0; ViewIndex < Views.Num(); ++ViewIndex)
|
||||||
|
{
|
||||||
|
RDG_EVENT_SCOPE_CONDITIONAL(GraphBuilder, Views.Num() > 1, "View%d", ViewIndex);
|
||||||
|
|
||||||
|
FViewInfo& View = Views[ViewIndex];
|
||||||
|
|
||||||
|
if (!View.ShouldRenderView() || NaniteDrawLists[ViewIndex].Num() == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto NaniteRenderer = Nanite::IRenderer::Create(
|
||||||
|
GraphBuilder,
|
||||||
|
*Scene,
|
||||||
|
View,
|
||||||
|
GetSceneUniforms(),
|
||||||
|
SharedContext,
|
||||||
|
RasterContext,
|
||||||
|
CullingConfig,
|
||||||
|
View.ViewRect,
|
||||||
|
/* PrevHZB = */ nullptr
|
||||||
|
);
|
||||||
|
|
||||||
|
NaniteRenderer->DrawGeometry(
|
||||||
|
Scene->NaniteRasterPipelines[ENaniteMeshPass::BasePass],
|
||||||
|
PrimaryNaniteRasterResults[ViewIndex].VisibilityResults,
|
||||||
|
*Nanite::FPackedViewArray::Create(GraphBuilder, PrimaryNaniteViews[ViewIndex]),
|
||||||
|
NaniteDrawLists[ViewIndex]
|
||||||
|
);
|
||||||
|
|
||||||
|
Nanite::FRasterResults RasterResults;
|
||||||
|
NaniteRenderer->ExtractResults( RasterResults );
|
||||||
|
|
||||||
|
// Emit depth
|
||||||
|
Nanite::EmitCustomDepthStencilTargets(
|
||||||
|
GraphBuilder,
|
||||||
|
*Scene,
|
||||||
|
View,
|
||||||
|
RasterResults.PageConstants,
|
||||||
|
RasterResults.VisibleClustersSWHW,
|
||||||
|
RasterResults.ViewsBuffer,
|
||||||
|
RasterContext.VisBuffer64,
|
||||||
|
CustomDepthContext
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Nanite::FinalizeCustomDepthStencil(GraphBuilder, CustomDepthContext, CustomDepthTextures);
|
||||||
|
}
|
||||||
|
...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Loading…
x
Reference in New Issue
Block a user