来自:
GAMES101-现代计算机图形学入门-闫令琪_哔哩哔哩_bilibili
反射方程
入射——反射——出射,没毛病。
光线只弹射一次,入射光都来自光源,没毛病。
但是,光线可能弹射的不止一次,这个入射,除了来自光源,还可能来自其它物体的反射。
所以,可能得递归……
![](https://img-blog.csdnimg.cn/2cab1c049d6445ce82a0591d25ec8d3f.png)
从反射方程,推广到渲染方程
一个物体的某点向某个方向发射能量,这个能量,来源有两部分——自发光的,其它物体射过来的。
现代图形学的基础
那末,怎么解这个方程?以后再说……
这个论文的名字就叫《The Rendering Equation》
现在,可以不沉浸在推导里了
【这里的渲染方程只是针对反射,不能描述折射、散射等现象】
【半球,写作Ω+,只考虑上半球】
【KaijiyaKay?】
![](https://img-blog.csdnimg.cn/57f714b06d47423295767dc96c5d831b.png)
【因为是有限个点光源,所以不需要对立体角积分便能得到入射点的irradiance】
【BRDF的定义公式也表明它是将某个立体角附近范围入射的部分irradiance】
【点光源的radiance是没意义的,点光源应该用intensity,E=intensity/r^2】
【这里为什么没有积分了??】
【点光源啊,只有一条光线会有贡献】
【这里只考虑一根光线 所以积分没了 其他项都是0】
【没有积分了哦 这里只考虑特定的一根或几根光线 积分理解为求和即可】
【这里的(wi, n)应该是(wi dot n)】
【积分已经算出来了,直接就是Lux了】
【因为这里是点光源,不存在积分】
【求连续的 才用积分】
——不存在积分,所以把上面那个公式里的积分号+后面的积分变量去掉了,它俩是一对,表示积分,明白了
![](https://img-blog.csdnimg.cn/512cb634413043d0af72e74fc1c66ab9.png)
好多点光源,就都累加起来
![](https://img-blog.csdnimg.cn/34cafdf382dd476384952e4151137d96.png)
如果是面光源呢?按若干点光源的集合来算
求和变成了积分
【多个有限(离散)点光源就是求和了,面(连续)就要积分了】
【连续的情况下还要乘上一个立体角微元】
![](https://img-blog.csdnimg.cn/f8ea10b3f94c4e0f89b31ccf6ac19f41.png)
渲染方程
如果除了光源,还有其它物体反射过来的光,怎么计算?
把这个物体当成光源
【为啥有个负号】
【因为这里的入射角度为了方便函数计算都是规定为从反射点朝外的,但是这里的入射角作为另一个点的出射角是从外射向当前点的,所以正好相反,这里加一个负号就可以直接递归了】
【因为-wi是物体到反射点向量】
![](https://img-blog.csdnimg.cn/00730a89477444d7912b73403a6d8efe.png)
理解成递归,好处多多
当年的论文
![](https://img-blog.csdnimg.cn/4349795984834866a9ec8102acb2eb3b.png)
化简
【BRDF如何定义 那就看他们怎么总结的了 多半也是 参数调来调去 调到最接近现实的情况 记录下来 发布出去 广泛应用】
【递归的终点就是光源吧】
用递归的话,可以数学化简到这个方程,中间省略了很多过程
简写的渲染方程,为了理解
![](https://img-blog.csdnimg.cn/a37c4581c8b847cda64fc20c820b33dc.png)
通过未知的化简等很多步骤,还可以简写成这样,写成算子……
中间的很长的过程,省略了
L:要算的东西
E:光源本身辐射的能量
K:反射操作符,反射能量
【式子越短。问题越大】
【总能量=自发光能量+总能量*各级衰减系数】
【微积分都可以写成线性代数形式】
【K其实可以跟之前讲光的K类比,衰减】
![](https://img-blog.csdnimg.cn/8c0267303a3b4de3840205dd1c100676.png)
【前面的那个式子左侧项也可以改成一个l和单位算子的积分,就可以减了】
【要理解算子,才能这么做,不然完全不理解的】
【陈文灯,微分算子解方程】
【考研在B站看了个 算子的解题技巧- - 算矩阵方程用的 就是把矩阵看成 x 应用高数的泰勒展开 或者其他公式 算出来再把x写成原矩阵即可】
【这就是普通的泰勒展开】
【L是封闭空间所有反射光能量,乘以K算子会减少,但是再加上E恰好不变。就像封闭盒子里面放一个光源,内部光稳定】
【这里是generating function,不是所谓的泰勒展开,只不过看起来形式一样】
![](https://img-blog.csdnimg.cn/b9f25f69951c408da4c3e47165107686.png)
【线性泛函,这个K是有界线性算子】
【《具体数学》2.2节对几何级数做了详细推导】
【可怕,这竟然是人脑想出来的】
【这个其实和前面的积分没区别的,只是不同的表达形式】
【其实第一个式子本来就是个递推式,直接展开也能得到这个结果】
【对,直接用递归推导,也能得到相同的式子】
好像是真的。。
![](https://img-blog.csdnimg.cn/7dc270f2b5e74788a8f9ff5b494eb9dd.png)
然后就可以根据这个拆开的结果来理解了
按光线弹射次数分类,相当于,傅里叶变换的那种分类
【理解这个把一次一次叠加然后累计得到总的就能理解了】
【结果很符合直觉但是过程太高深】
【这个要求||K||严格小于一才能正确的。】
【结果很清晰,但我真没搞懂怎么来的】
【现实是瞬间完成无数次反射】
【过程很痛苦,结果很巧妙】
【重新定义自然而然】
【由于渲染方程是递归定义的,这个式子是递归展开的形式】
【这里的K要看成算子而不是矩阵】
【果然所有前沿研究的尽头本质是数学】
![](https://img-blog.csdnimg.cn/224030006a14440290298b022bc54c34.png)
然后,可以介绍一个新的概念——全局光照
光线弹射一次——直接光照
光线弹射两次——间接光照
弹射一次,两次,三次……——全局光照
光栅化的着色,大概就是这个。
光栅化只能描述光线弹射0次,1次的情况。再往后,光栅化就比较难做了。
【全局光照 = 直接光照 + 间接光照 + 两次弹射光照 + 三次弹射光照 + ....】
![](https://img-blog.csdnimg.cn/c9a6f9e1553d4269ae57786619ec0e04.png)
实际应用
然后,介绍一点直观的
【注意这张图上面的灯是亮的,后面要考】
直接光照,
![](https://img-blog.csdnimg.cn/7fc4bd504c6444c5b8e07d94837001d5.png)
![](https://img-blog.csdnimg.cn/7cfea00eb3374264bb3235698218029f.png)
![](https://img-blog.csdnimg.cn/9f73da2406214f58bd64d8499be1b378.png)
为什么,弹射次数增加到4次,灯就亮了?因为次数少,只够光线从摄像机到灯,出不来;次数多,够出来了,追踪到光源了,就亮了。
比如,光线至少弹射2次,才能出玻璃球。
光线穿过这个灯,得经过2层玻璃。
![](https://img-blog.csdnimg.cn/8b7094a5286b47578c5b9c087a97364e.png)
![](https://img-blog.csdnimg.cn/02da7fed9235465ba627bde0cd0a6288.png)
弹射次数继续增加,是全白,还是收敛?
自然界都是全局光照,所以,是收敛。
【这需要BRDF满足能量守恒的约束】
后面再说。。