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:
FMyGShaderVS() {}
FMyGShaderVS(const ShaderMetaType::CompiledShaderInitializerType& Initializer) : FLensDistortionUVGenerationShader(Initializer) { }
};
class FMyGShaderPS: public FMyGShader { DECLARE_SHADER_TYPE(FMyGShaderPS, Global);
public:
FLensDistortionUVGenerationPS() {}
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
网格材质着色器不仅依赖于特定的材质, 而且依赖于网格的类型
所以它必须针对每一个 材质和顶点工厂的组合 进行编辑