[引擎搭建记录] 延迟渲染管线与PBR(下)

本文详细介绍了基于物理的渲染(PBR)理论,特别是延迟渲染管线中的Cook-Torrance高光模型。通过讲解反射方程、漫反射和镜面反射的计算,以及环境光的Image-Based Lighting(IBL)处理,阐述了PBR在游戏引擎中的实现。文章提供了相关的学习资源,并附带作者的DirectX12引擎实现示例,展示了PBR效果的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章接着上篇讲述PBR相关的理论

github地址: https://github.com/MrySwk/GravityEngine (目前渲染部分代码乱七八糟,之后要重构一次)

图形库用的是DirectX12,目前引擎已经完成了基本的界面浏览功能、延迟管线、模型加载以及PBR,效果图如下
在这里插入图片描述
在这里插入图片描述

基于物理的渲染

PBR这个东西,真说要讲可能也轮不到我这个萌新来讲,因此这篇文章只是我个人对PBR的一些简单的理解和复述,也就是说会尽量地“讲人话”,在这个基础上,最好结合一些专业的资料来看,达到更好的理解效果。本人才疏学浅,如果有什么错误请指出。

首先关于PBR的理论,推荐这篇

https://learnopengl.com/PBR/Theory
可以看这个目录下的跟PBR有关的这四篇
在这里插入图片描述
以及浅墨的这个专栏,里面有一系列PBR相关的内容 https://zhuanlan.zhihu.com/p/53086060

上面那四篇是讲的最清楚的,如果认真看完基本上就能把程序写出来了,里面是给了代码的,虽然是opengl但是翻译成dx也不难。

那么接下来就可以开始谈PBR了,PBR就是一个光照模型,我这个引擎里实现的是最简单的PBR,也就是和虚幻里的做法基本上是一模一样的,我们可以回忆一下,经典的光照模型里面,漫反射是Lambert,镜面反射是Blinn-Phong,环境光是c*(1-AO),而PBR,则是换了个更好看的模型,漫反射依然是Lambert(不过多除了个Pi),镜面反射是Cook-Torrance,环境光是IBL(Image-Based Lighting)。

预备知识

接下来就要不可避免地谈到反射方程了
在这里插入图片描述
Lo就是出射光强, ω i \omega_i ωi是入射的立体角, ω o \omega_o ωo是出射的立体角,p是顶点位置,Li点乘法线n,这个可以理解成入射的光强乘以兰伯特余弦,那么剩下的 f r f_r fr,就是我们待会要讨论的主角,表示在p点这个位置,入射方向到出射方向光的反射比例。

接下来我们重新审视一遍这个式子,光线从各个方向入射,入射的能量会均匀分摊到照射到的面积上,所以要乘一个兰伯特余弦,也就是点乘一个法线,然后剩下的入射光强乘以入射和出射的比例,得到的其实就是这个光贡献的出射的光强,然后把所有方向来的光贡献的光强积分,就得到了最后的光强,这个积分是在p点法线为中心的半球上进行的。

那么问题来了,这个出射光和入射光的比例 f r f_r fr是多少?这个函数就是BxDF,在我们实现的这个PBR模型里面,用的是BRDF(bi-directional reflectance distribution function,双向反射分布函数),如下

在这里插入图片描述
这个式子可以这样理解,反射光分为两部分,一部分是漫反射,一部分是镜面反射,刚刚说过lambert就是漫反射部分,cook-torrance就是镜面反射部分,那环境光呢?环境光后面会提,这里我们先关注漫反射和高光这两个部分。
f l a m b e r t f_{lambert} flambert就是兰伯特反射分布函数, f c o o k − t o r r a n c e f_{cook-torrance} fcooktorrance是高光部分的反射分布,然后有 k d = 1 − k s k_d=1-k_s kd=1ks,这里 k d k_d kd应该理解成漫反射(d)的占比,而相应的 k s k_s ks就是镜面反射(s)的占比,也就是说如果我们要把反射的光拆成diffuse和specular这两部分,我们要保证能量守恒。(其实这个 k s k_s ks是包含在Cook-Torrance里面的,没必要写出来,但是为了强调能量守恒,还是放在上面了)(然后 k d k_d kd一般也还要乘个(1-metal),为了方便理解,先不要在意这个)

再说BRDF,BRDF就是出射与入射的比例,也就是 L o E i \frac{L_o}{E_i} EiLo(注意单位),除了BRDF以外,还有其他的模型,如BSDF、BTDF、BSSRDF等,这些模型考虑了次表面散射等等,而游戏中用的最多的是BRDF,也就是只考虑反射,接下来我们可以具体看这个BRDF的内容。

漫反射

漫反射是兰伯特,式子很简单,如下
在这里插入图片描述
兰伯特的反照率就是一个常量,也就是albedo贴图上采样得到的值,但是和以前的兰伯特比,PBR里多除了一个 π \pi π,为什么要除呢,其实这个地方除个 π \pi π是保证能量守恒,因为我们的c是从贴图里面采样出来的,那么范围是在0到1之间的,但是实际上要能量守恒,c不能够大于 1 π \frac{1}{\pi} π1,证明如下
在这里插入图片描述所以这里除个 π \pi π,就是把[0,1]范围归一化到[0, 1 π \frac{1}{\pi} π

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值