zoukankan      html  css  js  c++  java
  • 路径追踪的理论与实现:渲染方程

    自从2018年起我就一直在阅读《Physically Based Rendering:From Theory to Implementation》这本书,花了差不多1年的时间把它看了个大概。之后利用业余时间实现了书中介绍的路径追踪(Path Tracing)算法。今天来讲一讲该算法的理论推导。
    pbrt镇楼:

    首先说起路径追踪,就不能不提大名鼎鼎的渲染方程:

    p代表从摄像机发出一条光线相交到的平面一点,wo代表从这一点到摄像机的方向,Le代表这一点自己所发出的光,Lo代表眼睛最终所看到的光强;然后积分内部则代表沿着这一点p对不同方向的立体角积分,f是在点p处,wo和wi下的brdf,Li是wi方向射入点p的光强,θi代表wi和p处法向的夹角。如下图所示:

    但是如果直接对此公式积分的话,会存在一个很大的问题:这是一个递归的计算,想获得从摄像机某个方向的光线辐射,需要不断递归地采样,这对于计算机来说是非常大的计算量和存储量。因此,科学家们提出了路径追踪的方法,将整个光线递归树中的一条条路径抽取出来,将其转换为显式的路径积分形式,这两种形式在数学上是等价的。
    为此,我们就需要记录路径中每条光线的两个顶点,对于一条由n-1条光线组成的路径,我们可以得到n个顶点,并将上面的积分公式转化为顶点的形式。得到了顶点后,还需要对上式的积分形式予以变化,将它由立体角的积分转化为按面积的积分。
    我们首先对上面所提的L和f重新定义:


    p和p'的定义见下图

    接下来是将立体角的积分转化为面积的积分,假设平面上的一点p形成了一个半径为d的球面,那么球面上面积为A的立体角为:

    θ为该平面法向和p到平面向量的夹角,如下图所示

    那么,我们可以定义一个几何参数G,其中V代表p和p'两点,是否可见,可见为1,不可见为0:

    根据以上公式,代换得到路径追踪的面积积分形式:

    得到了上式以后,我们可以对这个公式进行展开:

    为了简化上式,我们定义P为:

    在这里可以理解为一条具有n+1个顶点的路径的光照贡献。其中:

    那么就可以通过代换得到:

    我们还可以定义吞吐量T的概念,它表示路径中光源发出的辐射亮度沿着该路径传递到摄像机的分量:

    因此:

    然后对前面求出的路径追踪的面积形式进行蒙特卡洛积分就可以了。
    另外需要提到一点,在进行蒙特卡洛积分的时候,pdf也需要从立体角转换到面积的形式,经过代换,积分中的G项最终只会保留cosθ,这样可以大大简化计算。见PBRT第三版875页。

  • 相关阅读:
    TCP的三次握手和四次挥手理解及面试题
    linux网卡配置文件参数
    linux的常用指令和配置文件
    django中的modelform和modelfoemset
    django中的form表单验证
    php快速开发的学习经历
    一个微信支付商场的经历
    https的学习过程
    使用java访问elasticsearch创建索引
    写博客是为什么
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/12463695.html
Copyright © 2011-2022 走看看