vault backup: 2025-04-11 23:10:07

This commit is contained in:
2025-04-11 23:10:07 +08:00
parent e93f9d7643
commit c1b61e6352
2 changed files with 58 additions and 3 deletions

View File

@@ -373,10 +373,65 @@ float3 ToneMappedColorAP1 = FilmToneMap( ColorAP1 );
- UE4中添加自定义ComputerShader:https://zhuanlan.zhihu.com/p/413884878
- UE渲染学习2- 自定义PostProcess - Kuwahara滤镜:https://zhuanlan.zhihu.com/p/25790491262
# 添加
# 在if(bPostProcessingEnabled)代码段
1. 在AddPostProcessingPasses()(PostProcessing.cpp)中的**EPass**与**PassNames**数组中添加Pass名称枚举与Pass名称字符串。
2. 在**PassSequence.Finalize()** 之前添加
2. 在**PassSequence.Finalize()** 之前添加上一步EPass同名的`PassSequence.SetEnabled(EPass::XXX)` 。该逻辑用于控制对应Pass是否起作用。
3. 根据步骤1中新增Pass的顺序在对应的位置添加对应的代码段。额外需要注意的Tonemap前后的Pass代码有所不同。
## Pass代码
1. `MotionBlur`之前后处理材质BL_BeforeTonemapping之前传入FScreenPassTexture SceneColor进行绘制。
2. `MotionBlur`~`Tonemap`传入FScreenPassTextureSlice SceneColorSlice进行绘制。
3. `Tonemap`之后传入FScreenPassTexture SceneColor进行绘制。
`MotionBlur`~`Tonemap`大致这么写:
```c++
if (PassSequence.IsEnabled(EPass::XXX))
{
FXXXInputs PassInputs;
PassSequence.AcceptOverrideIfLastPass(EPass::XXX, PassInputs.OverrideOutput);
PassInputs.SceneColorSlice = SceneColorSlice;
SceneColorSlice = FScreenPassTextureSlice::CreateFromScreenPassTexture(GraphBuilder, AddXXXPass(GraphBuilder, View, PassInputs));
}
```
其他位置大致这么写:
```c++
if (PassSequence.IsEnabled(EPass::XXX))
{
FXXXInputs PassInputs;
PassSequence.AcceptOverrideIfLastPass(EPass::XXX, PassInputs.OverrideOutput);
PassInputs.SceneColor = SceneColor;   
SceneColor = AddXXXPass(GraphBuilder, View, PassInputs);
}
```
## 超采样之后的UV转换
`Tonemap`之后的Pass因为超采样的关系使得ViewportResoution与BufferResoution不同所以需要使用`SHADER_PARAMETER(FScreenTransform, SvPositionToInputTextureUV)`以及`FScreenTransform::ChangeTextureBasisFromTo`计算变换比例。具体可以参考FFXAAPS。
# 在else代码段
在else代码段中添加新Pass禁用代码段。不添加则会在切换到其他View比如材质编辑器的Preview时崩溃。例如
```c++
if(bPostProcessingEnabled){
...
...
}else
{
PassSequence.SetEnabled(EPass::XXX, false);
PassSequence.SetEnabled(EPass::MotionBlur, false);
PassSequence.SetEnabled(EPass::Tonemap, true);
PassSequence.SetEnabled(EPass::FXAA, false);
PassSequence.SetEnabled(EPass::PostProcessMaterialAfterTonemapping, false);
PassSequence.SetEnabled(EPass::VisualizeDepthOfField, false);
PassSequence.SetEnabled(EPass::VisualizeLocalExposure, false);
PassSequence.Finalize();
...
}
```
##
PS