2024-09-27 11:52:24 +08:00
|
|
|
|
---
|
|
|
|
|
title: Untitled
|
|
|
|
|
date: 2024-09-26 18:41:24
|
|
|
|
|
excerpt:
|
|
|
|
|
tags:
|
|
|
|
|
rating: ⭐
|
|
|
|
|
---
|
2024-09-27 13:10:09 +08:00
|
|
|
|
# RenderBasePass()
|
|
|
|
|
传入RenderBasePass()的DepthStencil逻辑如下:
|
|
|
|
|
```c++
|
|
|
|
|
const FExclusiveDepthStencil::Type BasePassDepthStencilAccess =
|
|
|
|
|
bAllowReadOnlyDepthBasePass
|
|
|
|
|
? FExclusiveDepthStencil::DepthRead_StencilWrite
|
|
|
|
|
: FExclusiveDepthStencil::DepthWrite_StencilWrite;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FDeferredShadingSceneRenderer::RenderBasePass() =>
|
|
|
|
|
FDeferredShadingSceneRenderer::RenderBasePassInternal() =>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FBasePassMeshProcessor::TryAddMeshBatch =>
|
|
|
|
|
|
|
|
|
|
## 大致流程
|
|
|
|
|
1. 绑定GBuffer与Depth。
|
|
|
|
|
```c++
|
|
|
|
|
const FExclusiveDepthStencil ExclusiveDepthStencil(BasePassDepthStencilAccess);
|
|
|
|
|
|
|
|
|
|
TStaticArray<FTextureRenderTargetBinding, MaxSimultaneousRenderTargets> BasePassTextures;
|
|
|
|
|
uint32 BasePassTextureCount = SceneTextures.GetGBufferRenderTargets(BasePassTextures);
|
|
|
|
|
Strata::AppendStrataMRTs(*this, BasePassTextureCount, BasePassTextures);
|
|
|
|
|
TArrayView<FTextureRenderTargetBinding> BasePassTexturesView = MakeArrayView(BasePassTextures.GetData(), BasePassTextureCount);
|
|
|
|
|
FRDGTextureRef BasePassDepthTexture = SceneTextures.Depth.Target;
|
|
|
|
|
```
|
|
|
|
|
2. GBuffer Clear
|
|
|
|
|
```c++
|
|
|
|
|
GraphBuilder.AddPass(RDG_EVENT_NAME("GBufferClear"), PassParameters, ERDGPassFlags::Raster,
|
|
|
|
|
[PassParameters, ColorLoadAction, SceneColorClearValue](FRHICommandList& RHICmdList)
|
|
|
|
|
{
|
|
|
|
|
// If no fast-clear action was used, we need to do an MRT shader clear.
|
|
|
|
|
if (ColorLoadAction == ERenderTargetLoadAction::ENoAction)
|
|
|
|
|
{
|
|
|
|
|
const FRenderTargetBindingSlots& RenderTargets = PassParameters->RenderTargets;
|
|
|
|
|
FLinearColor ClearColors[MaxSimultaneousRenderTargets];
|
|
|
|
|
FRHITexture* Textures[MaxSimultaneousRenderTargets];
|
|
|
|
|
int32 TextureIndex = 0;
|
|
|
|
|
|
|
|
|
|
RenderTargets.Enumerate([&](const FRenderTargetBinding& RenderTarget)
|
|
|
|
|
{
|
|
|
|
|
FRHITexture* TextureRHI = RenderTarget.GetTexture()->GetRHI();
|
|
|
|
|
ClearColors[TextureIndex] = TextureIndex == 0 ? SceneColorClearValue : TextureRHI->GetClearColor();
|
|
|
|
|
Textures[TextureIndex] = TextureRHI;
|
|
|
|
|
++TextureIndex;
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Clear color only; depth-stencil is fast cleared.
|
|
|
|
|
DrawClearQuadMRT(RHICmdList, true, TextureIndex, ClearColors, false, 0, false, 0);
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
```
|
|
|
|
|
3.
|
|
|
|
|
|
|
|
|
|
|
2024-09-27 11:52:24 +08:00
|
|
|
|
# SetDepthStencilStateForBasePass()
|
|
|
|
|
```c++
|
|
|
|
|
void SetDepthStencilStateForBasePass(
|
|
|
|
|
FMeshPassProcessorRenderState& DrawRenderState,
|
|
|
|
|
ERHIFeatureLevel::Type FeatureLevel,
|
|
|
|
|
bool bDitheredLODTransition,
|
|
|
|
|
const FMaterial& MaterialResource,
|
|
|
|
|
bool bEnableReceiveDecalOutput,
|
|
|
|
|
bool bForceEnableStencilDitherState)
|
|
|
|
|
{
|
|
|
|
|
const bool bMaskedInEarlyPass = (MaterialResource.IsMasked() || bDitheredLODTransition) && MaskedInEarlyPass(GShaderPlatformForFeatureLevel[FeatureLevel]);
|
|
|
|
|
if (bEnableReceiveDecalOutput)
|
|
|
|
|
{
|
|
|
|
|
if (bMaskedInEarlyPass)
|
|
|
|
|
{
|
|
|
|
|
SetDepthStencilStateForBasePass_Internal<false, CF_Equal>(DrawRenderState, FeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
else if (DrawRenderState.GetDepthStencilAccess() & FExclusiveDepthStencil::DepthWrite)
|
|
|
|
|
{
|
|
|
|
|
SetDepthStencilStateForBasePass_Internal<true, CF_GreaterEqual>(DrawRenderState, FeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
SetDepthStencilStateForBasePass_Internal<false, CF_GreaterEqual>(DrawRenderState, FeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (bMaskedInEarlyPass)
|
|
|
|
|
{
|
|
|
|
|
DrawRenderState.SetDepthStencilState(TStaticDepthStencilState<false, CF_Equal>::GetRHI());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (bForceEnableStencilDitherState)
|
|
|
|
|
{
|
|
|
|
|
SetDepthStencilStateForBasePass_Internal<false, CF_Equal>(DrawRenderState, FeatureLevel);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
#
|