|
| 1 | +UE4 View & State |
| 2 | +=== |
| 3 | + |
| 4 | +* FSceneView 包含Family,ViewState,ViewUniformBuffer |
| 5 | + * FViewInfo |
| 6 | +* FSceneViewFamily 包含Views,Scene,RenderTarget |
| 7 | +* FSceneViewStateInterface |
| 8 | + * FSceneViewState 存储渲染相关的**跨帧**资源(TAA历史信息、遮挡剔除信息、HLOD可见性、阴影等) |
| 9 | +* FSceneInterface |
| 10 | + * FScene 场景管理接口,物件和光源,特效以及阴影资源,绘制列表,光线追踪资源(场景加速结构) |
| 11 | +* FSceneRenderer 渲染器实例(**每帧都会销毁重建**,同时绘制多个View) |
| 12 | + |
| 13 | +常见的用法 |
| 14 | +```cpp |
| 15 | + auto RT = NewObject<UTextureRenderTarget2D>(); |
| 16 | + RT->AddToRoot(); |
| 17 | + RT->ClearColor = FLinearColor::Transparent; |
| 18 | + RT->TargetGamma = TargetGamma; |
| 19 | + RT->InitCustomFormat(TargetSize.X, TargetSize.Y, PF_FloatRGBA, false); |
| 20 | + FTextureRTResource* RTResource = RT->GameThread_GetRTResource(); |
| 21 | + FSceneViewFamilyContext ViewFamily( |
| 22 | + FSceneViewFamily::ConstructionValues(RTResource, Scene, FEngineShowFlags(ESFIM_Game)) |
| 23 | + .SetWorldTimes(FApp::GetCurrentTime() - GStartTime, FApp::GetDeltaTime(), FApp::GetCurrentTime() - GStartTime) |
| 24 | + ); |
| 25 | + |
| 26 | + // To enable visualization mode |
| 27 | + ViewFamily.EngineShowFlags.SetPostProcessing(true); |
| 28 | + ViewFamily.EngineShowFlags.SetVisualizeBuffer(true); |
| 29 | + ViewFamily.EngineShowFlags.SetTonemapper(false); |
| 30 | + ViewFamily.EngineShowFlags.SetScreenPercentage(false); |
| 31 | + |
| 32 | + FSceneViewInitOptions ViewInitOptions; |
| 33 | + ViewInitOptions.SetViewRectangle(FIntRect(0, 0, TargetSize.X, TargetSize.Y)); |
| 34 | + ViewInitOptions.ViewFamily = &ViewFamily; |
| 35 | + ViewInitOptions.HiddenPrimitives = HiddenPrimitives; |
| 36 | + ViewInitOptions.ViewOrigin = ViewOrigin; |
| 37 | + ViewInitOptions.ViewRotationMatrix = ViewRotationMatrix; |
| 38 | + ViewInitOptions.ProjectionMatrix = ProjectionMatrix; |
| 39 | + |
| 40 | + FSceneView* NewView = new FSceneView(ViewInitOptions); |
| 41 | + NewView->CurrentBufferVisualizationMode = VisualizationMode; |
| 42 | + ViewFamily.Views.Add(NewView); |
| 43 | + |
| 44 | + ViewFamily.SetScreenPercentageInterface(new FLegacyScreenPercentageDriver( |
| 45 | + ViewFamily, /* GlobalResolutionFraction = */ 1.0f, /* AllowPostProcessSettingsScreenPercentage = */ false)); |
| 46 | + |
| 47 | + FCanvas Canvas(RTResource, NULL, FApp::GetCurrentTime() - GStartTime, FApp::GetDeltaTime(), FApp::GetCurrentTime() - GStartTime, Scene->GetFeatureLevel()); |
| 48 | + Canvas.Clear(FLinearColor::Transparent); |
| 49 | + GetRendererModule().BeginRenderingViewFamily(&Canvas, &ViewFamily); |
| 50 | + |
| 51 | + // Copy the contents of the remote texture to system memory |
| 52 | + OutSamples.SetNumUninitialized(TargetSize.X*TargetSize.Y); |
| 53 | + FReadSurfaceDataFlags ReadSurfaceDataFlags; |
| 54 | + ReadSurfaceDataFlags.SetLinearToGamma(false); |
| 55 | + RTResource->ReadPixelsPtr(OutSamples.GetData(), ReadSurfaceDataFlags, FIntRect(0, 0, TargetSize.X, TargetSize.Y)); |
| 56 | + FlushRenderingCommands(); |
| 57 | + |
| 58 | + RT->RemoveFromRoot(); |
| 59 | + RT = nullptr; |
| 60 | +``` |
0 commit comments