https://medium.com/@lordned/unreal-engine-4-rendering-part-2-shaders-and-vertex-data-80317e1ae5f3
翻译:yarswang 转载请保留
着色器与顶点工厂
本章我们来关注着色器与顶点工厂。Unreal使用一些魔法来绑定C++的着色器表现与等价HLSL类,使用顶点工厂(Vertex Factory)来将顶点着色器的控制数据上传到GPU。从本章起,我们将使用Unreal的类名来讨论问题,让它们更容易被你自己查找。
我们将专注于核心的着色器/顶点工厂涉及类。有很多处理内务的结构/方法如胶水一般地黏合了整个系统。我们不太可能去修改这些胶水,所以我们不会去谈他们来让事情变得更复杂。
FLocalVertexFactory的顶点输出
着色器
Unreal中所有着色器都派生自一个基类 FShader. Unreal有两个主要的着色器分类,FGlobalShader用于在只应存在一个实例的情况,以及FMaterialShader使用在关联材质的着色器上。FShader和FShaderResouce配对,后者跟踪与特定着色器相关联的GPU上的资源。如果FShader的已编译输出与已存在的输出相匹配,则可以在多个FShaders之间共享FShaderResource。
FGlobalShader
这是个很简单,并且有限(但是有效!)的用法。 当着色器类从FGlobalShader派生时,它将它们标记为Global重新编译组的一部分(这似乎意味着它们在引擎打开时不会重新编译!)。 只有一个全局着色器实例存在,这意味着你不能拥有每个实例的参数。 但是,您可以拥有全局参数。 示例:FLensDistortionUVGenerationShader,FBaseGPUSkinCacheCS(用于计算网格蒙皮的计算着色器)和FSimpleElementVS/ FSimpleElementPS。
FMaterialShader和FMeshMaterialShader
FMaterialShader和FMeshMaterialShader更加复杂。这两个类都允许多个实例,每个实例都与其自己的GPU资源副本相关联。 FMaterialShader添加了一个SetParameters函数,它允许着色器的C ++代码更改绑定HLSL参数的值。参数绑定是通过FShaderParameter / FShaderResourceParameter类完成的,并且可以在着色器的构造函数中完成,比如说FSimpleElementPS。在使用该着色器渲染某些内容之前调用SetParameters函数,并传递相当一部分信息(包括材质),这会为您提供大量信息来作为您计算要更改的参数的一部分。