UE4 Shader 着色器概述
https://zhuanlan.zhihu.com/p/32628933
名词
FShaderType 用于序列化和反序列化,可以被实例化为具体的ShaderClass
FShaderPipelineType 绑定着色器和一个单个管线
FShaderResource 编译后的 Shader 中间码以及它运行时 RHI的资源
FShaderTarget 目标平台和频段
FShader 编译后的一个 FShaderType 的实例,根据一个 FShaderResource 的信息编译获得
包括了FShadeType
FShaderTarget
FShaderParameterMap
FShaderResource
FShaderPiplineType
FVertexFactoryType成员变量
着色器
ue4中所有着色器的基类都是从FShader 继承的。主要分为FGlobalShader 和FMaterialShader
FGlobalShader 只可以有一个实例
FMaterialShader 材质绑定的着色器
都包含了Shader 都有SetParameters 函数,允许更改参数值,参数传递通过 FShaderParameter / FShaderResourceParameter
实例化
IMPLEMENT_SHADER_TYPE 实例化shader宏
#define IMPLEMENT_SHADER_TYPE(TemplatePrefix,ShaderClass,SourceFilename,FunctionName,Frequency) \
TemplatePrefix \
ShaderClass::ShaderMetaType ShaderClass::StaticType( \
TEXT(#ShaderClass), \
SourceFilename, \
FunctionName, \
Frequency, \
ShaderClass::ConstructSerializedInstance, \
ShaderClass::ConstructCompiledInstance, \
ShaderClass::ModifyCompilationEnvironment, \
ShaderClass::ShouldCache, \
ShaderClass::GetStreamOutElements \
);
绑定到 对应usf 文件上,指定ps,vs入口
IMPLEMENT_SHADER_TYPE(, FLensDistortionUVGenerationVS, TEXT("/Plugin/LensDistortion/Private/UVGeneration.usf"), TEXT("MainVS"),SF_Vertex)
IMPLEMENT_SHADER_TYPE(, FLensDistortionUVGenerationPS, TEXT("/Plugin/LensDistortion/Private/UVGeneration.usf"), TEXT("MainPS"),SF_Pixel)
缓存和编译
当你修改Shader 的时候,Ue4 会自动编译 Shader组合 ,这里使用了ShouldCache功能,ModifyCompilationEnvironment可以编译之前修改 HLSL代码里的宏定义参数
FVertexFactory 顶点工厂
封装一个顶点数据格式,并可以链接到一个顶点着色器
FLocalVertexFactory
提供了一个简单方法将顶点属性从局部空间变换到世界空间
FPrimitiveSceneProxy
是UPrimitiveComponent渲染线程版本
通过CreateScenceProxy 决定创建的是哪个UPrimitiveComponent版本
绑定到HLSL宏
#define IMPLEMENT_VERTEX_FACTORY_TYPE(FactoryClass,ShaderFilename,bUsedWithMaterials,bSupportsStaticLighting,bSupportsDynamicLighting,bPrecisePrevWorldPos,bSupportsPositionOnly) \
FVertexFactoryShaderParameters* Construct##FactoryClass##ShaderParameters(EShaderFrequency ShaderFrequency) { return FactoryClass::ConstructShaderParameters(ShaderFrequency); } \
FVertexFactoryType FactoryClass::StaticType( \
TEXT(#FactoryClass), \
TEXT(ShaderFilename), \
bUsedWithMaterials, \
bSupportsStaticLighting, \
bSupportsDynamicLighting, \
bPrecisePrevWorldPos, \
bSupportsPositionOnly, \
Construct##FactoryClass##ShaderParameters, \
FactoryClass::ShouldCache, \
FactoryClass::ModifyCompilationEnvironment, \
FactoryClass::SupportsTessellationShaders \
);
实例化
IMPLEMENT_VERTEX_FACTORY_TYPE(FLocalVertexFactory,"/Engine/Private/LocalVertexFactory.ush",true,true,true,true,true);
在Usf 文件里main函数其实都包含FVertexFactoryInput 输入结构,这个数据结构在这个数据结构在LocalVertexFactory.ush中定义。在GpuSkinVertexFactory.ush也定义了这个结构
// MobileBasePassVertexShader.usf
/** Entry point for the base pass vertex shader. */
void Main(FVertexFactoryInput Input)
{
}
// LocalVertexFactory.ush implements the FVertexFactoryInput struct
struct FVertexFactoryInput
{
float4 Position : ATTRIBUTE0;
float3 TangentX : ATTRIBUTE1;
float4 TangentZ : ATTRIBUTE2;
float4 Color : ATTRIBUTE3;
// etc…
}
// GpuSkinVertexFactory.ush also implements the FVertexFactoryInput struct
struct FVertexFactoryInput
{
float4 Position : ATTRIBUTE0;
half3 TangentX : ATTRIBUTE1;
half4 TangentZ : ATTRIBUTE2;
uint4 BlendIndices : ATTRIBUTE3;
uint4 BlendIndicesExtra : ATTRIBUTE14;
// etc…
}
编辑于 2018-01-04