--- 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 void SetParameters(FRHICommandList& RHICmdList,TRHIShader* ShaderRHI,const FLinearColor &MyColor, FTexture2DRHIRef InInputTexture) { SetShaderValue(RHICmdList, ShaderRHI, SimpleColorVal, MyColor); SetTextureParameter(RHICmdList, ShaderRHI, TextureVal, TextureSampler,TStaticSamplerState::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宏进行包裹,第一个形参为类型,普通类型声明为FShaderParameter,Texture2d与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 OutBMP; // Fill OutBMP somehow TUniquePtr> PixelData = MakeUnique>(DestSize); PixelData->Pixels = OutBMP; ImageTask->PixelData = MoveTemp(PixelData); ```