vault backup: 2024-02-05 22:33:10

This commit is contained in:
BlueRose 2024-02-05 22:33:10 +08:00
parent fef32e0939
commit ce621781e3
4 changed files with 99 additions and 0 deletions

View File

@ -118,6 +118,14 @@
"lastUpdated": 1707121888833
}
}
},
"FRDGResource": {
"FRDGResource": {
"currentFile": {
"count": 1,
"lastUpdated": 1707140527615
}
}
}
}
}

View File

@ -0,0 +1,9 @@
---
title: 剖析虚幻渲染体系09- 材质体系
date: 2024-02-05 22:00:48
excerpt:
tags:
rating: ⭐
---
# 前言
https://www.cnblogs.com/timlly/p/15109132.html

View File

@ -290,3 +290,76 @@ FRDGBuilder是RDG体系的心脏和发动机也是个大管家负责收集
RDG编译期间的逻辑非常复杂步骤繁多先后经历构建生产者和消费者的依赖关系确定Pass的裁剪等各类标记调整资源的生命周期裁剪Pass处理Pass的资源转换和屏障处理异步计算Pass的依赖和引用关系查找并建立分叉和合并Pass节点合并所有具体相同渲染目标的光栅化Pass等步骤。
# RDG开发
### 注册外部资源
如果我们已有非RDG创建的资源可以在RDG使用么答案是可以通过FRDGBuilder::RegisterExternalXXX接口可以完成将外部资源注册到RDG系统中。下面以注册纹理为例
```c++
// 在RDG外创建RHI资源.
FRHIResourceCreateInfo CreateInfo;
FTexture2DRHIRef MyRHITexture = RHICreateTexture2D(1024, 768, PF_B8G8R8A8, 1, 1, TexCreate_CPUReadback, CreateInfo);
// 将外部创建的RHI资源注册成RDG资源.
FRDGTextureRef MyExternalRDGTexture = GraphBuilder.RegisterExternalTexture(MyRHITexture);
```
需要注意的是外部注册的资源RDG无法控制和管理其生命周期需要保证RDG使用期间外部资源的生命周期处于正常状态否则将引发异常甚至程序崩溃。
如果想从RDG资源获取RHI资源的实例以下代码可达成
```c++
FRHITexture* MyRHITexture = MyRDGTexture.GetRHI();
```
用图例展示RHI资源和RDG资源之间的转换关系
- FRHIResource =>FRDGBuilder::RegisterExternalXXX =>FRDGResource
- FRDGResource => FRDGResource::GetRHI => FRHIResource
### 提取资源
RDG收集Pass之后并非立即执行而是延迟执行包括资源被延迟创建或分配这就导致了一个问题如果想将渲染后的资源赋值给某个变量无法使用立即模式需要适配延迟执行模式。这种适配延迟执行的资源提取是通过以下接口来实现的
- FRDGBuilder::QueueTextureExtraction
- FRDGBuilder::QueueBufferExtraction
```c++
// 创建RDG纹理.
FRDGTextureRef MyRDGTexture;
FRDGTextureDesc MyTextureDesc = FRDGTextureDesc::Create2D(OutputExtent, HistoryPixelFormat, FClearValueBinding::Black, TexCreate_ShaderResource | TexCreate_UAV);
MyRDGTexture = GraphBuilder.CreateTexture(MyTextureDesc, "MyRDGTexture", ERDGTextureFlags::MultiFrame);
// 创建UAV并作为Pass的shader参数.
(......)
PassParameters->MyRDGTextureUAV = GraphBuilder.CreateUAV(MyRDGTexture);
(......)
// 增加Pass, 以便渲染图像到MyRDGTextureUAV.
FComputeShaderUtils::AddPass(GraphBuilder, RDG_EVENT_NAME("MyCustomPass", ...), ComputeShader, PassParameters, FComputeShaderUtils::GetGroupCount(8, 8));
// 入队提取资源.
TRefCountPtr<IPooledRenderTarget>* OutputRT;
GraphBuilder.QueueTextureExtraction(MyRDGTexture, &OutputRT);
// 对提取的OutputRT进行后续操作.
(......)
```
# RDG调试
RDG系统存在一些控制台命令其名称和描述如下
|控制台变量|描述|
|---|---|
|**r.RDG.AsyncCompute**|控制异步计算策略0-禁用1-为异步计算Pass启用标记默认2-开启所有使用compute命令列表的计算通道。|
|**r.RDG.Breakpoint**|当满足某些条件时断点到调试器的断点位置。0-禁用1~4-不同的特殊调试模式。|
|**r.RDG.ClobberResources**|在分配时间用指定的清理颜色清除所有渲染目标和纹理/缓冲UAV。用于调试。|
|**r.RDG.CullPasses**|RDG是否开启裁剪无用的Pass。0-禁用1-开启(默认)。|
|**r.RDG.Debug**|允许输出在连接和执行过程中发现的效率低下的警告。|
|**r.RDG.Debug.FlushGPU**|开启每次Pass执行后刷新指令到GPU。当设置(r.RDG.AsyncCompute=0)时禁用异步计算。|
|**r.RDG.Debug.GraphFilter**|将某些调试事件过滤到特定的图中。|
|**r.RDG.Debug.PassFilter**|将某些调试事件过滤到特定的Pass。|
|**r.RDG.Debug.ResourceFilter**|将某些调试事件过滤到特定的资源。|
|**r.RDG.DumpGraph**|将多个可视化日志转储到磁盘。0-禁用1-显示生产者、消费者Pass依赖2-显示资源状态和转换3-显示图形、异步计算的重叠。|
|**r.RDG.ExtendResourceLifetimes**|RDG将把资源生命周期扩展到图的全部长度。会增加内存的占用。|
|**r.RDG.ImmediateMode**|在创建Pass时执行Pass。当在Pass的Lambda中崩溃时连接代码的调用堆栈非常有用。|
|**r.RDG.MergeRenderPasses**|图形将合并相同的、连续的渲染通道到一个单一的渲染通道。0-禁用1-开启(默认)。|
|**r.RDG.OverlapUAVs**|RDG将在需要时重叠UAV的工作。如果禁用UAV屏障总是插入。|
|**r.RDG.TransitionLog**|输出资源转换到控制台。|
|**r.RDG.VerboseCSVStats**|控制RDG的CSV分析统计的详细程度。0-为图形执行生成一个CSV配置文件1-为图形执行的每个阶段生成一个CSV文件。|
除了以上列出的RDG控制台还有一些命令可以显示RDG系统运行过程中的有用信息。
`vis`列出所有有效的纹理,输入之后可能显示如下所示的信息:

View File

@ -0,0 +1,9 @@
---
title: 剖析虚幻渲染体系17- 实时光线追踪
date: 2024-02-05 22:02:57
excerpt:
tags:
rating: ⭐
---
# 前言
https://www.cnblogs.com/timlly/p/16687324.html