PBR

发布时间 2023-03-28 18:31:29作者: 爱莉希雅

前言

​ 上一篇介绍如何表达一个正确的光线传播模型,但没有提及如何解它的值,因此本篇将介绍使用蒙特卡洛路径追踪来解决该问题

什么是蒙特卡洛积分?

  • 原理:对函数值均匀采样求平均并作为积分值的近似。简单来说,就是将下图积分面积分割为多个小长方形,再对这些小长方形的面积求和
    image-20230328151559513

  • 定义形式:欲求取[a,b]区间的积分制,需要选定一个采样分布函数\(p(x)\),再对其进行多次函数值采样
    image-20230328152238234

  • 例子
    image-20230328152752221
    image-20230328153037071

为什么使用蒙特卡洛积分?

​ 因为蒙特卡洛积分适用于计算较为困难的定积分——解析式不好写,该方法可以直接算出对应值

比如下图该函数,确实难以写出它的表达式
image-20230328150635467

路径追踪

  • 思想:从视点发出一条光线,光线与物体表面相交时根据表面的材质属性继续采样一个方向,发出另一条光线,如此迭代,直到光线打到光源上或逃逸出场景,再使用蒙特卡洛积分,计算光线的贡献, 作为像素的颜色值。而使用蒙特卡洛方法对积分的求解是无偏的只要时间足够长,最终图像能收敛到一个正确的结果

解渲染方程

  • 直接光照
    image-20230328154601837

    现在有这样一个场景:一个很大的面光源,一个反射点,有一个盒子挡住光,一个观测方向,忽略自发光,考虑.那么目前该视点接收的光是环境光和反射点BRDF作用后的光
    image-20230328155650734

    可以发现该情况是一个半球上的积分,我们采用蒙特卡洛求解:
    image-20230328160357829
    image-20230328160551962
    image-20230328160617128

    • 伪代码

    基于p点选取N个采样方向,判断每个方向是否和光源相交,相交就累加求和
    image-20230328160810777

  • 全局光照

    对于下图而言,欲求从Q到P的radiance,相当于是P接收Q的直接光照,也就是说这是个递归
    image-20230328161531753

    • 伪代码
      image-20230328161919196

存在的问题及解决方法

​ 目前虽然实现了蒙特卡洛路径追踪,但还存在部分问题:

  1. 光线数目呈指数级增加
    image-20230328162237222
  2. 递归没有终止条件
  3. 效率低
  • 解决方法

    1. 对于第一个问题,为了防止光线数量的爆发式增长,我们唯一取N = 1——只采样一个方向,也就是一个像素点。随之而来的问题是虽然蒙特卡洛积分是无偏的,但它需要大量样本,该解决方法是多条样本穿过该像素点,最后对该像素点取平均
      image-20230328163148809
      image-20230328163506050

    2. 对于第二个问题,需要用到轮盘赌:有P的概率触发该事件,1-P的概率不触发
      image-20230328163551860

      对应在路径追踪:有P的概率光线递归,且返回值为\(\frac{L_0}{P}\);1-P的概率光线停止递归,返回0
      image-20230328164201562

    3. 对于第三个问题如何提升效率?

      • 回想一下,采样时是任选一个方向,这很可能会导致很少有方向能和光源相交。那么如何做到完全不浪费采样?很直接的想法是直接在光源上采样,这样必定不会产生浪费,如何实现呢?

        如下图,将光源看作一个二维的框,设反射点的法线和入射光线的夹角为\(\theta\),光源的法线和出射光线的夹角为\(\theta'\),光源的面积为\(A\),在该光源平面上均匀采样——\(pdf = \frac{1}{A}\)
        image-20230328165439882

        但渲染方程并不定义在光源,而是立体角(半球),因此需要将渲染方程改成光源上的积分,也就是说需要求得dω和dA的关系:做映射,将A的面积投影到单位球上
        image-20230328170254289
        image-20230328175004869
        image-20230328175048406
        最后,以轮盘赌的方式加上间接光,并判断物体是否挡住光源。伪代码如下
        image-20230328175317755
        image-20230328175329648

  • 效果图
    image-20230328175414011

reference

https://github.com/QianMo/Game-Programmer-Study-Notes/blob/master/Content/

GAMES101:现代计算机图形学入门 – 计算机图形学与混合现实在线平台 (games-cn.org)