BlueRoseNote/03-UnrealEngine/Rendering/Shader/UE4.25传统渲染方式的代码迁移指南.md
2023-06-29 11:55:02 +08:00

83 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: UE4.25传统渲染方式的代码迁移指南
date: 2020-11-10 13:55:15
tags: Shader
rating: ⭐️
---
## 前言
4.25的GlobalShader的调用代码发生了一下变化我在写完RDG例子后顺便写了一下GlobalShader的使用案例。具体的可以参考我的插件
[https://github.com/blueroseslol/BRPlugins](https://github.com/blueroseslol/BRPlugins)
代码位于SimpleGlobalShader.cpp中。
## 变量使用LAYOUT_FIELD宏进行包裹
对于新定义用于设置变量的GlobalShader基类使用需要使用**DECLARE_INLINE_TYPE_LAYOUT**(FYourShaderName,NonVirtual)宏进行声明。另外还有**DECLARE_TYPE_LAYOUT**(FYourShaderName,NonVirtual)宏,不太清楚差别,但作用应该是一样的。
除此之外还有
```
class FSimpleGlobalShader : public FGlobalShader
{
DECLARE_INLINE_TYPE_LAYOUT(FSimpleGlobalShader, NonVirtual);
public:
static bool ShouldCompilePermutation(const FGlobalShaderPermutationParameters& Parameters)
{
return IsFeatureLevelSupported(Parameters.Platform, ERHIFeatureLevel::SM5);
}
static void ModifyCompilationEnvironment(const FGlobalShaderPermutationParameters& Parameters, FShaderCompilerEnvironment& OutEnvironment)
{
FGlobalShader::ModifyCompilationEnvironment(Parameters, OutEnvironment);
OutEnvironment.SetDefine(TEXT("TEST_MICRO"), 1);
}
FSimpleGlobalShader(){}
FSimpleGlobalShader(const ShaderMetaType::CompiledShaderInitializerType& Initializer):FGlobalShader(Initializer)
{
SimpleColorVal.Bind(Initializer.ParameterMap, TEXT("SimpleColor"));
TextureVal.Bind(Initializer.ParameterMap, TEXT("TextureVal"));
TextureSampler.Bind(Initializer.ParameterMap, TEXT("TextureSampler"));
}
template<typename TRHIShader>
void SetParameters(FRHICommandList& RHICmdList,TRHIShader* ShaderRHI,const FLinearColor &MyColor, FTexture2DRHIRef InInputTexture)
{
SetShaderValue(RHICmdList, ShaderRHI, SimpleColorVal, MyColor);
SetTextureParameter(RHICmdList, ShaderRHI, TextureVal, TextureSampler,TStaticSamplerState<SF_Trilinear,AM_Clamp,AM_Clamp,AM_Clamp>::GetRHI(), InInputTexture);
}
private:
LAYOUT_FIELD(FShaderResourceParameter, TextureVal);
LAYOUT_FIELD(FShaderResourceParameter, TextureSampler);
LAYOUT_FIELD(FShaderParameter, SimpleColorVal);
};
```
第二个形参视类内是否有虚函数选择Abstract或者NonVirtual。源代码里基本上都是使用NonVirtual的。
另一个不常用的宏是**DECLARE_EXPORTED_TYPE_LAYOUT**(FYourShaderName, YOUR_API, Virtual)它用于声明需要被其他类继承的基类。具体的使用方法还请参照UE4源码。
Shader变量需要使用LAYOUT_FIELD宏进行包裹第一个形参为类型普通类型声明为FShaderParameterTexture2d与Sampler声明为FShaderResourceParameter。例如
```
LAYOUT_FIELD(FShaderParameter, SimpleColorVal);
LAYOUT_FIELD(FShaderResourceParameter, TextureVal);
LAYOUT_FIELD(FShaderResourceParameter, TextureSampler);
```
## Shader声明改变
声明宏由DECLARE_SHADER_TYPE(FSimplePixelShader, Global)转变为DECLARE_GLOBAL_SHADER(FSimplePixelShader)。
## 去除序列化相关函数
去掉virtual bool Serialize(FArchive& Ar) override函数。
LAYOUT_FIELD宏会实现这部分功能。
## FImageWriteTask
FImageWriteTask现在接受TArray64的数据。而不是 TArray。如果你想传递TArray数据可以这么写
```
TArray<FColor> OutBMP;
// Fill OutBMP somehow
TUniquePtr<TImagePixelData<FColor>> PixelData = MakeUnique<TImagePixelData<FColor>>(DestSize);
PixelData->Pixels = OutBMP;
ImageTask->PixelData = MoveTemp(PixelData);
```