diff --git a/.obsidian/plugins/various-complements/data.json b/.obsidian/plugins/various-complements/data.json index 64d0ff8..fd2bcfb 100644 --- a/.obsidian/plugins/various-complements/data.json +++ b/.obsidian/plugins/various-complements/data.json @@ -78,6 +78,46 @@ "lastUpdated": 1707040198653 } } + }, + "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、FRDGTextureUAV": { + "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、FRDGTextureUAV": { + "currentFile": { + "count": 1, + "lastUpdated": 1707118005164 + } + } + }, + "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、": { + "FRDGViewableResource、FRDGTexture、FRDGTextureSRV、": { + "currentFile": { + "count": 1, + "lastUpdated": 1707118021634 + } + } + }, + "FRDGView": { + "FRDGView": { + "currentFile": { + "count": 1, + "lastUpdated": 1707118039401 + } + } + }, + "FRDGViewableResource、FRDGTexture": { + "FRDGViewableResource、FRDGTexture": { + "currentFile": { + "count": 1, + "lastUpdated": 1707118633071 + } + } + }, + "RDG对象注册表": { + "RDG对象注册表": { + "currentFile": { + "count": 1, + "lastUpdated": 1707121888833 + } + } } } } \ No newline at end of file diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(11)- RDG.md b/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(11)- RDG.md index c7a67e3..387bdfc 100644 --- a/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(11)- RDG.md +++ b/03-UnrealEngine/Rendering/RenderingPipeline/向往渲染系列文章阅读笔记/剖析虚幻渲染体系(11)- RDG.md @@ -8,6 +8,40 @@ rating: ⭐ # 前言 https://www.cnblogs.com/timlly/p/15217090.html +# 概念 +- FRDGAllocator:简单的C++对象分配器, 用MemStack分配器追踪和销毁物体。 +- FComputeShaderUtils + - Dispatch():派发ComputeShader到RHI命令列表,携带其参数。 + - DispatchIndirect():派发非直接的ComputeShader到RHI命令列表,,携带其参数。 + - AddPass():派发计算着色器到**RenderGraphBuilder**, 携带其参数。 + - ClearUAV():清理UAV。 + - AddCopyTexturePass():增加拷贝纹理Pass。 + - AddCopyToResolveTargetPass():增加拷贝到解析目标的Pass。 + - AddEnqueueCopyPass():增加回读纹理的Pass。 + - AddPass():无参数的Pass增加。 + - AddBeginUAVOverlapPass()/AddEndUAVOverlapPass(): 其它特殊Pass。 +- FRDGResource:RDG资源并不是直接用RHI资源,而是包裹了RHI资源引用,然后针对不同类型的资源各自封装,且增加了额外的信息。 + - FRDGUniformBuffer、TRDGUniformBuffer + - FRDGParentResource:一种由图跟踪分配生命周期的渲染图资源。可能有引用它的子资源(例如视图) + - FRDGView + - FRDGBuffer、FRDGBufferSRV、FRDGBufferUAV + - FRDGViewableResource:一种由图跟踪分配生命周期的RPGResource。可能有引用它的子资源 + - FRDGTexture + - FRDGView + - FRDGUnorderedAccessView、FRDGTextureUAV + - FRDGShaderResourceView、FRDGTextureSRV +- FRDGTextureDesc:创建渲染纹理的描述信息。 +- FRDGPooledTexture:贴图池里的贴图资源。 +- FRDGPooledBuffer:池化的缓冲区。 +- FRHITransition:用于表示RHI中挂起的资源转换的**不透明表面材质**数据结构。 +- FRDGBarrierBatch:RDG屏障批。 + - FRDGBarrierBatchBegin + - FRDGBarrierBatchEnd +- FRDGPass + - TRDGLambdaPass + - FRDGSentinelPass:哨兵Pass,用于开始/结束。 +- [[#FRDGBuilder]] + ## RDG基础类型 ```c++ enum class ERDGBuilderFlags @@ -215,3 +249,44 @@ inline int32 GetResourceTransitionPlaneForMetadataAccess(ERDGTextureMetaDataAcce } } ``` + + +## FRDGBuilder +FRDGBuilder是RDG体系的心脏和发动机,也是个大管家,负责收集渲染Pass和参数,编译Pass、数据,处理资源依赖,裁剪和优化各类数据,还有提供执行接口。 + +重要函数: +- FindExternalTexture():查找外部纹理, 若找不到返回null. +- RegisterExternalTexture():注册外部池内RT到RDG, 以便RDG追踪之. 池内RT可能包含两种RHI纹理: MSAA和非MSAA。 +- RegisterExternalBuffer():注册外部缓冲区到RDG, 以便RDG追踪之. +- 资源创建接口: + - CreateTexture() + - CreateBuffer() + - CreateUAV() + - CreateSRV() + - CreateUniformBuffer() +- 分配内存, 内存由RDG管理生命周期。 + - Alloc() + - AllocPOD() + - AllocObject() + - AllocParameters() +- AddPass() + - FRDGPassRef AddPass(FRDGEventName&& Name, const ParameterStructType* ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType&& ExecuteLambda); :增加有参数的LambdaPass。 + - FRDGPassRef AddPass(FRDGEventName&& Name, const FShaderParametersMetadata* ParametersMetadata, const void* ParameterStruct, ERDGPassFlags Flags, ExecuteLambdaType&& ExecuteLambda); :增加带有实时生成结构体的LambdaPass + - FRDGPassRef AddPass(FRDGEventName&& Name, ERDGPassFlags Flags, ExecuteLambdaType&& ExecuteLambda);:增加没有参数的LambdaPass +- QueueTextureExtraction():在Builder执行末期, 提取池内纹理到指定的指针. 对于RDG创建的资源, 这将延长GPU资源的生命周期,直到执行,指针被填充. 如果指定,纹理将转换为AccessFinal状态, 否则将转换为kDefaultAccessFinal状态。 +- QueueBufferExtraction():在Builder执行末期, 提取缓冲区到指定的指针。 +- PreallocateTexture()/PreallocateBuffer():预分配资源. 只对RDG创建的资源, 会强制立即分配底层池内资源, 有效地将其推广到外部资源. 这将增加内存压力,但允许使用GetPooled{Texture, Buffer}查询池中的资源. 主要用于增量地将代码移植到RDG. +- GetPooledTexture()/GetPooledBuffer():立即获取底层资源, 只允许用于注册或预分配的资源。 +- SetTextureAccessFinal()/SetBufferAccessFinal():设置执行之后的状态。 +- 变量 + - RDG对象注册表 + - FRDGPassRegistry Passes; + - FRDGTextureRegistry Textures; + - FRDGBufferRegistry Buffers; + - FRDGViewRegistry Views; + - FRDGUniformBufferRegistry UniformBuffers; + +### FRDGBuilder::Compile +RDG编译期间的逻辑非常复杂,步骤繁多,先后经历构建生产者和消费者的依赖关系,确定Pass的裁剪等各类标记,调整资源的生命周期,裁剪Pass,处理Pass的资源转换和屏障,处理异步计算Pass的依赖和引用关系,查找并建立分叉和合并Pass节点,合并所有具体相同渲染目标的光栅化Pass等步骤。 + +# RDG开发