回顾目前流程
void FDeferredShadingSceneRenderer::Render(FRHICommandListImmediate& RHICmdList);
一,按需要重新分配渲染目标
1,void FSceneRenderTargets::AllocDummyGBufferTargets(FRHICommandList& RHICmdList)
1.1, template<typename InitializerType,typename RHIRefType,typename RHIParamRefType> static RHIParamRefType TStaticStateRHI<typename InitializerType,typename RHIRefType,typename RHIParamRefType>::GetRHI();
1.2,FGBufferResourceStruct::CreateUniformBuffer(GBufferResourceStruct, UniformBuffer_SingleFrame);
二,初始化视口(可以多个),包括确定可见性与设置阴影相关参数
1,bool FDeferredShadingSceneRenderer::InitViews(FRHICommandListImmediate& RHICmdList, struct FILCUpdatePrimTaskData& ILCTaskData, FGraphEventArray& SortEvents)
1.1,预设置可见性
void FSceneRenderer::PreVisibilityFrameSetup(FRHICommandListImmediate& RHICmdList)
1.1.1,根据当前画质设置,设置TemporalAA的采样方式,同时确定采样位置,
1.1.1.1, uint32 FSceneViewState::GetCurrentTemporalAASampleIndex() const
1.1.1.2,void FViewMatrices::HackAddTemporalAAProjectionJitter(const FVector2D& InTemporalAAProjectionJitter)
1.1.2,设置视口矩阵,包括视口投影矩阵和转换矩阵
void FViewMatrices::ApplyWorldOffset(const FVector& InOffset)
1.2,可见性计算
void FSceneRenderer::ComputeViewVisibility(FRHICommandListImmediate& RHICmdList)
1.2.1,初始化一系列用于可视化检测的缓冲区,(位数组,0和1代表是否可见)
1.2.2,用六棱锥进行筛选(a,b代表true或者false),不可见的对象的可视化检测缓冲区对应的比特位设置为0
template<bool UseCustomCulling, bool bAlsoUseSphereTest>
static int32 FrustumCull(const FScene* Scene, FViewInfo& View)
1.2.3,线框模式下,对直接剔除,剔除所有的非线框和过小的线框
1.2.4,在非线框模式下,对于处于视口范围内,但是被其他对象遮挡的对象进行一次剔除
static int32 OcclusionCull(FRHICommandListImmediate& RHICmdList, const FScene* Scene, FViewInfo& View)
1.2.5,根据所有的可见性位图,设置每个需要渲染的对象的可见性状况,即Hiddenflags
void FLODSceneTree::UpdateAndApplyVisibilityStates(FViewInfo& View)
1.2.6,给每个对象返回自己是否可见的机会
1.2.7,获取所有动态对象的渲染信息
void FSceneRenderer::GatherDynamicMeshElements(
TArray<FViewInfo>& InViews,
const FScene* InScene,
const FSceneViewFamily& InViewFamily,
const FPrimitiveViewMasks& HasDynamicMeshElementsMasks,
const FPrimitiveViewMasks& HasDynamicEditorMeshElementsMasks,
FMeshElementCollector& Collector)
1.3,完成可见性计算
void FSceneRenderer::PostVisibilityFrameSetup(FILCUpdatePrimTaskData& OutILCTaskData)
1.3.1,对半透明对象进行排序,半透明对象的渲染由于涉及到互相遮挡,则必须按照从后往前的顺序来渲染,才能保 证渲染结果的正确性,因此,必须在此时完成排序
1.3.1.1,void FTranslucentPrimSet::SortPrimitives()
1.3.1.2,void FSceneViewState::TrimHistoryRenderTargets(const FScene* Scene)
1.3.2,对每个光照确定当前光照可见的对象列表,这里也是使用平截头体剔除,只需要测点光源和聚光灯,而平行光始 终可见
bool FConvexVolume::IntersectSphere(const FVector& Origin,const float& Radius) const
1.3.3,初始化雾与大气的常量值
&nbs

最低0.47元/天 解锁文章
132

被折叠的 条评论
为什么被折叠?



