虚幻4渲染编程(灯光篇)【第一卷:各种ShadowMap】

本文深入探讨虚幻4中的灯光渲染,从基础ShadowMap开始,逐步讲解PCF、PCSS和Irregular PCF等阴影软化技术,通过蓝图脚本实现自定义光影效果,提升游戏画面质量。
摘要由CSDN通过智能技术生成

小IVan:专题概述及目录

灯光篇开篇概述:

灯光在游戏里非常重要,游戏画面的整体感觉,游戏运行的效率都和它息息相关。然而虚幻把这些逻辑封得死死地。各种概念和庞大的系统常常令人束手无策。本篇将从灯光光影的原理入手,先自己实现一些灯光再自己动手打光做效果,想必这样会事半功倍。

本小节将在虚幻中用蓝图脚本“手连”各种基础ShadowMap。感谢技术美术图形交流群的小伙伴们的共同探讨@。


最基础的ShadowMap

shadow map的原理网上一搜一大把。总的来说就是:“在灯光方向架一台摄像机,获取深度图,然后再正常渲染自己的场景,再在正常渲染场景的时候把fragment转换到光源空间,把它和之前渲染的Shadowmap中高度深度作比较,看它是否在影子里,如果是就返回0,不是就返回1”。上述就是最原始的shadow map了。下面就在虚幻中实现它吧。

首先创建几个资源

v2-65f6c464c69d24875e33d829cee5e188_b.jpg

在BP_Light中创建一个SceneComponent和一个SceneCapture2D,然后设置它的参数,把RT_DepthMap设置给它。如图所示:

v2-8683bc546485f23f93f596e221a212b5_b.jpg

然后创建一个MaterialParamerterCollection

v2-cadeb0a7ea95a4ac5c225ec898df7790_b.jpg

因为我们在材质里直接“连”我们的shadow map,但是在材质层拿不到视口矩阵和投影矩阵,所以我们自己构建我们的矩阵。矩阵的推导可以去看看龙书d3d11的shadow map那一章

首先在BP_Light的构造函数中,先把灯光的位置传进去

v2-7fdfb01e3f36dc5ca65be92bd7ca69a7_b.jpg

然后构造我们的灯光摄像机视口矩阵

v2-b330059d3cc15a047cca858d70f04013_b.jpg

然后是构造灯光摄像机投影矩阵

v2-d5afb2035564b1baf7c9831e527afc43_b.jpg

下面来设置我们的RT_DepthMap,精度越高影子效果相对来说会好些。

v2-78041f6075c3b74c8df8421e95d9db0d_b.jpg

有了灯光位置和两个矩阵还有一张深度图,就可以开始在材质里做事情了。

在M_BasicObjectMaterial里,首先先把当前摄像机的像素位置变换到灯光摄像机空间

v2-b057033a6ef8d2307d8340517595f664_b.jpg

然后再变换到投影空间

v2-de6c19a6abc19f0137a120a4e9a3a937_b.jpg

然后再把它变换到【0-1】范围内

v2-41eef632b51a109947e0752f57285b46_b.jpg

把深度图里的值(刚才渲染的)和它本身的值作比较。如果当前像素的摄像机方向上有遮挡,那么深度图里去除的值会比当前它的深度值小,如果小就说明此物体在阴影中。所以返回0

然后在场景里放两个模型,把灯光蓝图脚本拖进去,将会看到

v2-b5012d67980e91c9c7883203061da729_b.jpg

调整材质中的bias值

v2-28177ac2231426f7b19f9d5456b1a7ae_b.jpg

你将会看到

v2-348fa74770bf7d5daa4dd997cd1f0673_b.jpg

但是这有个问题,就是影子的锯齿很严重。造成这个的原因是因为那个比较操作是离散的,是在影子里就是0,不是就是1。下面有很多方法来改进它。


PCF(percentage-closer filtering)

下面来对影子进行柔化处理。

对阴影周围进行范围采样然后取平均值,这样可以造出柔和的影子

v2-4813e936672c6fe4c26219c01bdd53e5_b.jpg

可以看到影子的质量有明显提高,但是PCF缺点也很明显就是需要多重采样,而且效果上不符合物理规律。下面就来实现它吧。

来到M_BasicObjectMaterial里,我们对影子生成部分做如下修改

建一个CustomNode命名为PCF

v2-a0e8cf567399a3aa32f8903390ba72a1_b.jpg

CustomNode的代码如下

v2-e29a277b38ecdea0ce0353479963cbb9_b.jpg

设置如下:

v2-c3a0418240cb4e64b881b537748deddd_b.jpg

然后我们就可以得到柔和的影子了,如果想要更好的效果可以增加采样循环的次数。

v2-d8fa5128455ea5adff2767a36e4de753_b.jpg

PCSS(Percentage Closer Soft Shadow)

v2-ff846a4ab208fb813831130e16ae29da_b.jpg

正常情况下,物体相距越远,影子会越弱越模糊,光源和半影成相似三角形,我们需要计算这个距离来动态改变我们PCF半影的半径。我的采样循环次数比较少所以看起来有点突兀。可以增大采样次数解决这个问题。

v2-3161437634d4674bdf27577801997e22_b.jpg

只需要修改M_BasicObjectMaterial种的CustomNode的代码即可。代码如下:

v2-6251bc6bb9217359f3ccb9348afb80fa_b.jpg

Irregular PCF

在PCF的基础上,对Offset做随机采样,可以得到更好的效果。

v2-9159bdb73f6b5e5aae4905fd905387ac_b.jpg

对M_BasicObjectMaterial的CustomNode做如下修改

代码:

v2-c30bd0db5b67f77d7b13d66448e1db47_b.jpg
v2-efcbd392be6f5ae5af7970622c1c7ec0_b.jpg
v2-2b71fc02b6bf5f3abb6f01a76feedbb9_b.jpg
v2-0af785454430a5bcedd59c6a41b44605_b.jpg

还有CSM,VSM,ESM等后面的文章会来实现它们。

Enjoy it!


Next:

小IVan:虚幻4渲染编程(灯光篇)【第二卷:体积光】

【参考文章】

【1】cybercser/OpenGL_3_3_Tutorial_Translation

【2】阴影映射 - LearnOpenGL CN

【2】Softshadow with GLUT,GLSL and PCF

【4】developer.download.nvidia.com

【5】blog.csdn.net/jc_laoshu

【6】投影矩阵的推导(Deriving Projection Matrices)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值