UE4 Shader 着色器概述

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

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值