83 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								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宏进行包裹,第一个形参为类型,普通类型声明为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<FColor> OutBMP;
							 | 
						|||
| 
								 | 
							
								// Fill OutBMP somehow
							 | 
						|||
| 
								 | 
							
								TUniquePtr<TImagePixelData<FColor>> PixelData = MakeUnique<TImagePixelData<FColor>>(DestSize);
							 | 
						|||
| 
								 | 
							
								PixelData->Pixels = OutBMP;
							 | 
						|||
| 
								 | 
							
								ImageTask->PixelData = MoveTemp(PixelData);
							 | 
						|||
| 
								 | 
							
								```
							 |