Unreal Engine 4 渲染 (4) 延迟着色管道 The Deferred Shading Pipeline

https://medium.com/@lordned/unreal-engine-4-rendering-part-4-the-deferred-shading-pipeline-389fc0175789

翻译:yarswang 转载请保留

 

延迟着色基本通道

在第3章,我们完成了对C++方面的研究,并最终准备好了解GPU上的一切是如何工作的。 我们将深入研究顶点工厂如何控制公共基本顶点着色器着色器代码的输入,以及如何处理曲面细分(使用其附加的Hull和Domain阶段),以及触及材质图表如何结束 在你的HLSL代码中。

 

在我们理解了这些部分是如何组合在一起之后,我们将逐步完成延迟通道并查看它经历的一些不同步骤。 这将让我们知道表面着色器在哪个部分运行,以及材料图中的修改内容实际上最终会做什么。

 

顶点工厂再览

回到第2章,我们简要讨论了顶点工厂如何去更改提供给顶点着色器的数据。Unreal最终明智地决定用提升学习复杂度的代价以减少代码重复。 我们将在我们的示例中使用LocalVertexFactory.ushBasePassVertexCommon.ush,并将GpuSkinVertexFactory.ush作为要比较的东西,因为它们都使用相同的顶点着色器。

 

更改输入数据

不同类型的网格最终将需要不同的数据来完成它们的工作,即:GPU蒙皮顶点需要比简单静态网格更多的数据。 Unreal使用FVertexFactory处理CPU端的这些差异,但在GPU方面它有点棘手。

 

因为所有顶点工厂共享相同的顶点着色器(至少对于基础通道),所以它们使用通常命名的输入结构FVertexFactoryInput

 

因为Unreal使用相同的顶点着色器,但每个顶点工厂包含不同的代码,Unreal重新定义了每个顶点工厂中的FVertexFactoryInput结构。此结构被唯一定义在GpuSkinVertexFactory.ushLandscapeVertexFactory.ushLocalVertexFactory.ush和其他一些文件中。显然包含所有这些文件是行不通的 - 而BasePassVertexCommon.ush引用了/Engine/Generated/VertexFactory.ush。 编译着色器时,这将设置为正确的顶点工厂,允许引擎知道要使用哪个FVertexFactoryInput实现。我们在第2章简要地谈到了使用宏来声明顶点工厂,你必须提供着色器文件 - 这就是原因。

 

现在我们的基本通道顶点着色器的数据输入与我们上传的顶点数据的类型相匹配。下一个问题是不同的顶点工厂将需要在顶点着色器和像素着色器之间插入不同的数据。同样,BasePassVertexShader.usf调用泛型函数 - GetVertexFactoryIntermediatesVertexFactoryGetWorldPositionGetMaterialVertexParameters。如果我们在文件中执行另一个查找,我们会发现每个 *VertexFactory.ush 都按需而将这些函数独特定义。

 

每个顶点工厂重新实现这个方法

 

更改输出数据

现在我们需要了解如何从Vertex Shader到Pixel Shader获取数据。不出所料,BasePassVertexShader.usf的输出是另一个通常命名的struct(FBasePassVSOutput),它的实现取决于顶点工厂。虽然这里有一点障碍 - 如果你启用了曲面细分,那么顶点着色器和像素着色器之间有两个阶段(Hull和Domain阶段),这些阶段需要的数据不同于只是顶点着色器到像素着色器的数据。

 

Unreal的下一个技巧。他们使用#define来改变FBasePassVSOutput的含义,它可以定义为简单的FBasePassVSToPS结构,也可以为曲面细分定义为FBasePassVSToDS(此代码可以在BasePassVertexCommon.ush中找到)。这两种结构具有几乎相同的内容,除了Domain着色器版本添加了一些额外的变量。那么,我们需要的那些独特的每个顶点工厂中插值呢? Unreal通过创建FVertexFactoryInterpolantsVSToPSFBasePassInterpolantsVSToPS<

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值