[toc]

# 视口渲染

入口在 EditorViewportCLient.cpp -> FEditorViewportClient::Draw 函数中

  1. 设置视口
  2. 获取当前 world 设置初始时间
  3. 如果世界还在改变过程中,则返回,不继续执行
  4. 设置 DebugCanvas 的显示 (Runtime 会直接被干掉,Editor 会显示)
1
2
3
4
5
6
7
8
9
10
11
12
// Allow HMD to modify the view later, just before rendering
const bool bStereoRendering = GEngine->IsStereoscopic3D( InViewport );
FCanvas* DebugCanvas = Viewport->GetDebugCanvas();
if (DebugCanvas)
{
//设置RenderTarget的缩放值(RenderScale)
DebugCanvas->SetScaledToRenderTarget(bStereoRendering);
DebugCanvas->SetStereoRendering(bStereoRendering);
}
//后面设置实际的Caanvas
Canvas->SetScaledToRenderTarget(bStereoRendering);
Canvas->SetStereoRendering(bStereoRendering);
  1. 设置 FSceneViewFamilyContext
    UE5 文档对 FSceneViewFamily 的解释是:
    A set of views into a scene which only have different view transforms and owner actors.
    即 FSceneViewFamily 是当前 Viewport 内的 view 的集合,那么 FSceneViewFamilyContext 理所应当是 View 的上下文,官网对他的描述是:
    A view family which deletes its views when it goes out of scope.
    实际上 FSceneViewFamilyContext 的参数就是 FSceneViewFamily,比如这个脚本里的 ViewPort 中实际上在创建 Context 的时候构建了一个 ViewFamily
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Setup a FSceneViewFamily/FSceneView for the viewport.
FSceneViewFamilyContext ViewFamily(FSceneViewFamily::ConstructionValues(
Canvas->GetRenderTarget(),
GetScene(),
UseEngineShowFlags)
.SetTime(Time)
.SetRealtimeUpdate( IsRealtime() && FSlateThrottleManager::Get().IsAllowingExpensiveTasks() )
.SetViewModeParam( ViewModeParam, ViewModeParamName ) );

ViewFamily.DebugDPIScale = GetDPIScale();

ViewFamily.EngineShowFlags = UseEngineShowFlags;

ViewFamily.bIsHDR = Viewport->IsHDRViewport();

同时也会对这个 ViewFamily 设置一些合适口相关的参数,比如是否支持 HDR, 是否支持 DebugDPIScale 等

# FSceneViewFamily

这个类的脚本在 SceneView.h 下,其中视图类里面还包含一个 ConstructionValues 结构,他主要包含以下变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
struct ConstructionValues{
//渲染目标视图
const FRenderTarget RenderTarget;
//视图场景
FSceneInterface* Scene;
//显示标记
FEngineShowFlags EngineShowFlags;
//依赖于当前视口的额外参数,比如: texcoord index
int32 ViewModeParam;
//当前视口的名字(如 texture name)
FName ViewModeParamName;
//当前时间
FGameTime Time;
//当前视口的Gamma矫正
float GammaCorrection;
//标记当前view是否是附加的,默认值为1
uint32 bAdditionalViewFamily : 1;
//表示当前view是否是实时更新的
uint32 bRealtimeUpdate:1;
//延迟清理backbuffer
uint32 bDeferClear:1;
//确保合法的时间(?)
uint32 bTimesSet:1;

//接口部分基本就是对上述参数的设置
}

以及包含参数 (不介绍所有的):
Views: 这个 ViewGroup 的所有 View
ViewMode: 这个 View 的类型 (WareFrame/Unlit/Lit 之类的)
RenderTarget: 渲染目标
bMultiGPUForkAndJoin: 是否进行多 GPU 渲染
bForceCopyCrossGPU: 是否强制 GPU 复制
bIsMultipleViewFamily: 是否是多视图组中的一个视图
bIsFirstViewInMultipleViewFamily: 是否是多视图组中的第一个视图
bIsSceneTexturesInitialized: 场景纹理是否已初始化
SceneCaptureSource: 输入到最终的 RenderTarget 的格式

SceneCaptureCompositeMode: 和新的渲染结果的合成模式 (叠加 / 重写等等)
ViewExtensions: 视图修改扩展
DisplayInternalsData: 调试信息

# FCanvas