虚幻4渲染编程(Shader篇)【第一卷:虚幻自身的延迟渲染管线】

本文介绍了虚幻4渲染管线的详细流程,从InitView到TranslucencyPass,涵盖了资源准备、早Z预pass、阴影深度、BasePass、CustomDepthPass、光照计算等多个阶段。通过这篇文章,读者可以了解到虚幻4渲染的基础知识和关键技术,为自定义渲染pass打下基础。
摘要由CSDN通过智能技术生成

我的专栏目录:

小IVan:专题概述及目录

简介:

因为虚幻的架构,我们美术做一个效果只能使用材质编辑器。这让我很不舒服,稍微想做点特别点的效果就没办法了。我又是天天在公司用自研引擎的人,这种限制让人很不舒服。所以我开始修改了虚幻的shadingmode之类的。但是感觉自己还是不满足,想调个多pass虚幻都不让我做,所以我打算加个pass什么的。但是虚幻加pass可不像unity那么简单,只有操刀去改源码了。然后我又反观了一下我前几篇博客,只简单讲了一下怎么改代码,没说原理。所以这个系列我打算系统说一下虚幻的一个架构。当然虚幻如此庞大,我也有很多不知道的地方。

其实我写博客的目的很简单,就是想记录一下自己做的东西,有时候自己翻一下,再把问题再想一下,也许会有新的发现。虚幻的渲染方面的资料也是少得可怜,研究的人也少得可怜。大部分牛人都自己去造轮子去了。我只是个技术美术,造轮子的事情还是交给图形程序吧。不过研究虚幻4的确学到很多。如果有大牛看到我的文章中有错误,还请留言斧正。

首先在看这个系列之前,你需要具备以下:

(1)至少要敲过简单的渲染器,不管是拿dx敲还是拿gl敲或者vk之类的。

(2)对虚幻引擎有一定了解,对虚幻的渲染有一定了解。可以看我前几篇文章,或许可以有所帮助。

(3)C++基础。其实本人c++水平也是一般般(常常受到公司程序大牛的鄙视,不过我是美术)。

(4)至少一块RTX显卡可以用来做实时光线追踪(2019年)

随着引擎版本的更新,后续会逐步加入新版本。那么下面就正式开始吧!


【概览虚幻4渲染管线】

v2-22128d79c885d1fe1d99d8fe6d576fca_b.jpg
v2-08f11139f8888ff018aee74a229ff90c_b.jpg

首先,虚幻有很多个管线的。Mobile管线和Deferred管线。首先找到

v2-b01943154ac4971cadb819c320827918_b.jpg

在这个函数里你将会看到很多熟悉的函数名称

v2-79365eb5ed9f7a86511ae8688a3d7cb5_b.jpg

虚幻就是通过调用这些函数来一步步绘制的。是不是很眼熟?这个就是各大论坛啦,博客啦讲的虚幻渲染流程的真面目。

下面就是官方的DrawOrder了。那么这个顺序是怎么来的呢。就是上面那个函数的调用顺序。

v2-f9c233f06579279d759ee7f76d1d87d3_b.jpg

再打开这个Render函数,你就将看到延迟渲染一帧所调用的各个函数。(反正我看了半天就看到个大概的渲染顺序之外,还是啥也不知道)

v2-2f80522a5ef41b9858277cee2726f53d_b.jpg

那么当我们把一个模型托到场景里,这个模型被渲染出来的整个流程到底是什么样的呢?这个流程其实是非常庞大的。下面我就来一个一个拆分。

(1)第一步:资源准备阶段。这个阶段包括顶点缓冲区的准备,索引缓冲区的准备。这一步由场景代理管理完成。当然从磁盘里读取模型资源这些就涉及到StaticMesh这些了。想了解这一步可以去看我以前的博客,或者直接去看UPrimitiveComponent,UMeshComponent,UStaticMeshComponent,UCableComponent,UCustomMeshComponent。当你把这些源码全部研究一遍后,这个阶段算是了解了。这个阶段我不打算再描述了,因为已经有了很多现成的代码了。

(2)第二步就是shader资源的准备了,这个又是一个非常大的话题了。可以去看我以前关于给改材质编辑器和加shadingmode的文章便可以有个大概的了解。这一步我还会进一步阐述。

(3)第三步就是绘制了。

我们先不看Render函数那些复杂的调用,我们把精力先集中到shader层面来。一张画面是怎么开始绘制的呢?


v2-c1e60fc31db469462deaf519452720aa_b.jpg


通过这个我们便能知道一个大概的绘制流程(千万别以为虚幻只有这几步,不过主要的大概的流程是这样)。先绘制那些深度啊,初始化视口啦我们先不管。我们来看下这个BasePass。这个BasePass干的事情就是把GBuffer画出来。

v2-e9b47830309669b8e7b5b941e7842a79_b.jpg

这里就是像素着色器的入口。绘制完这一步后,我们就有了GBuffer然后再绘制剩下的。环境遮罩骤就先不说了。来看看最重要的光照部分。

光照部分的入口在这里:

v2-636bcab8823640a0c6a27f53af6c68f8_b.jpg

虚幻的TiledDeferredLighting的渲染方式。不知道这个的去看毛星云的RTR3的博客的光照那节,讲得特别好。这里给个传送门:

blog.csdn.net/poem_qian

这里会调用

v2-c70eae1048c6162206d5b474bfe981cf_b.jpg

GetDynamicLighting这个函数会调用

v2-7fbb0cbfb3b9df9e669443140ec243e2_b.jpg

这里会接着调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值