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

3.5 KiB
Raw Permalink Blame History

title, date, tags, rating
title date tags rating
UE4.25传统渲染方式的代码迁移指南 2020-11-10 13:55:15 Shader

前言

4.25的GlobalShader的调用代码发生了一下变化我在写完RDG例子后顺便写了一下GlobalShader的使用案例。具体的可以参考我的插件

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);