经典3A游戏光照解决办法| GAMES104实录 - 现代游戏引擎:从入门到实践

本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第18期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。

课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。

以下内容为公开课视频转文字版本,为阅读通顺,有删减

01「基于图像的光照」

下面我们介绍基于图像的光照(IBL,Image-Based Lighting)一个点处的光照是来自于四面八方的,我们一般说来自于一个球面。在计算机中,我们可以用Cube Map来表达球面上的光照信息。如果我们将Cube Map展开,就是如下图所示的十字架图形。

如果能够对真实环境的光照做一些预处理,我们就可以快速地将整个环境对着色点的光照和着色点处的材质通过卷积运算直接计算出来,这就是IBL的核心思想。前面我们介绍过球面调和函数,但球面调和函数的表达比较粗糙。它能够产生明暗的感觉,却无法达到我们想要的效果要求,即具有细节感和凹凸感。当角色在游戏中行走时,周围的环境一直在变,被光所照亮的部位也一直在变化,我们希望主角身上没有直接被光照亮的部分也具有我们想要的细节感。

人们提出了IBL的思想来解决这个问题。回忆一下前文中介绍的BRDF方程,我们发现,BRDF方程可以分为两个部分,一部分是漫反射项,一部分是镜面反射项。

对于漫反射项来说,它本质上就是一个余弦函数在球面上的分布。对于任何一个法向的朝向点,在给定一个光照时,我们在计算出这个面和球面上所有点的余弦波瓣积分之后,就可以提前计算出漫反射结果。这样计算出的图叫做“Diffuse Irradiance Map”。当我们知道一个环境上的光照信息之后,对于漫反射部分,无论表面的法线如何旋转,通过对Diffuse Irradiance Map进行采样,我们都可以得到和整个光场的卷积结果。这仍然是一种空间换时间的思想。使用一张经过预计算得到的纹理,并在运行时对其进行采样和少量的计算,就节约了每帧对屏幕上的每个像素点实时计算漫反射信息的运算量。我们也可以将其理解成一个表格,通过查表就能够得到卷积的结果。这就是IBL最简单的一个思想,同时,漫反射也是最容易处理的。

对于Specular项来说,由于推导比较复杂,受课程篇幅所限,我们在这里只介绍几个核心的想法。第一,对于Specular项的求解,我个人认为这个方法并不是一个准确的解法,因为求解过程进行了大量假设。该方法本质上是将三个方程乘法的积分变成了三个独立的方程的积分的乘法(Split Sum)。最核心的想法是对于粗糙度的处理,不同粗糙度的积分结果是不一样的。该方法利用了硬件Cubemap中的mipmap功能,将不同粗糙度的结果存储在mipmap的不同层级中。就像大家现在看到的这张图。

这样做是很有道理的。首先,我们可以在三维空间中查询这些数据。其次,大家会发现,粗糙度越高,对光照的敏感度就越低,数据就越低频。因此,我们可以将数据存储在mipmap的最低级中。请注意,这里的mip和前面我们介绍的纹理的mipmap不同,这里不是在两个层级之间进行插值,而是每一层mip需要单独计算。当粗糙度从0到1变化时,我们就可以在mipmap中进行查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值