【ue4】【使用】着色器Shader

Shader

Global Shader

全局着色器是对固定几何体 (如屏幕四边形) 执行操作但不需要与材质进行交互的着色器

如阴影过滤, 全局后处理, 全局雾 等, 都可以用全局着色器来渲染

【Tips】 一个全局着色器类型在内存中只能有一个

要想实现全局着色器, 必须实现一个继承自 FGlobalShader 的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class FMyGShader : public FGlobalShader
{
public:
FMyGShader(){}
FMyGShader(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FGlobalShader(Initializer)
{
SimpleColorVal.Bind(Initializer.ParameterMap, TEXT("SimpleColor"));
}

void SetParameters(FRHICommandListImmediate& RHICmdList, const FLinearColor &MyColor)
{
SetShaderValue(RHICmdList, GetPixelShader(), SimpleColorVal, MyColor);
}

static bool ShouldCache(EShaderPlatform Platform) { return true; }
virtual bool Serialize(FArchive& Ar) override;

private:
FShaderParameter SimpleColorVal;
}

然后分别再继承 FMyGShader 实现 顶点着色器类 和 像素着色器类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class FMyGShaderVS : public FMyGShader
{
DECLARE_SHADER_TYPE(FMyGShaderVS, Global);

public:

/** Default constructor. */
FMyGShaderVS() {}

/** Initialization constructor. */
FMyGShaderVS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FLensDistortionUVGenerationShader(Initializer) { }

};

class FMyGShaderPS: public FMyGShader
{
DECLARE_SHADER_TYPE(FMyGShaderPS, Global);

public:

/** Default constructor. */
FLensDistortionUVGenerationPS() {}

/** Initialization constructor. */
FLensDistortionUVGenerationPS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FLensDistortionUVGenerationShader(Initializer) { }

};

除此之外还要写好着色器中的内容到 .usf 中, 并 使用 IMPLEMENT_SHADER_TYPE 与之关联

1
2
IMPLEMENT_SHADER_TYPE(, FMyGShaderVS, TEXT(".../MyGShader.usf"), TEXT("MainVS"), SF_Vertex)
IMPLEMENT_SHADER_TYPE(, FMyGShaderPS, TEXT(".../MyGShader.usf"), TEXT("MainPS"), SF_Pixel)

Material Shader

材质着色器是特定于某些过程的着色器

需要访问材质的某些属性 -- 即必须针对每个材质进行编译

但是并不需要访问任何网格 (Mesh) 属性

建立 Material Shader 的过程和建立 Global Shader 的过程类似, 不过要将 FGlobalShader 换成 FMaterialShader

Mesh Material Shader

网格材质着色器不仅依赖于特定的材质, 而且依赖于网格的类型

所以它必须针对每一个 材质和顶点工厂的组合 进行编辑