【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-3 蒙特卡罗 (三)

开学人倍忙,趁着第二周周末,我们继续图形相关的博客

 Preface

今天我们来介绍一些理论方面的东西,为Monte Carlo 应用到我们的光线追踪器做铺垫

我们今天会介绍两章的东西,因为有一章内容太过简单

本篇目的原版内容 见相册

这个东西你点上去会有页数的,不要看混了

 ready

看这一篇您需要具备以下知识

1. 了解重要性采样

2. 二重积分,基础微分

3. (半)球坐标系

4. 光线追踪基本原理

5. 立体角(solid angle),现在普及一下

首先类比二维空间的圆,假设我们在二维空间内定义了一个单位圆,我们截取圆上的一段弧AB,它对应的圆心角为∠α

而且我们知道弧长 = α*R,那么整个周长就是C = 2*π*R

那么我们三维空间,仍然有类似的定义

    

记粉色区域为A

立体角的单位是球面度(sr),1sr定义为球面上一块面积(A)为R2的区域,从球心看过去的三维角度。

类比于二维圆上的圆弧和圆心角,那块面积区域为三维弧度,面积区域相对于球心在三维坐标系下的张角即为立体角

立体角计算

Ω = ∫∫A (sinθ)dθdφ

A为三维弧度

其中,θ代表经度,φ代表维度

整个球面的立体角为

Ω = ∫0->2π dφ ∫0->π (sinθ)dθ

Ω = 2π*2 = 4π

 content

我们之前的光线追踪器中有一个过程是获取一个三维空间的随机方向,我们利用单位球体内的随机点来代表该方向,那么我们今天用Monte Carlo 来实现相同的效果

Chapter2 MC Integration on the Sphere of Directions

首先我们需要定义一个2D的pdf函数

我们假定下面这个积分适用于任意方向

   ∫cos2θdθ

在MC积分下,我们应该做 cos2θ/p(direction) 的采样

但是这里的direction在我们的环境中如何定义的呢?

我们需要在极坐标系下进行定义,p是关于θ和φ的一个函数

但是,不管你怎么整,一定要记住,

设计一个pdf函数,它的积分必须是1,并且pdf代表着该方向被采样的相对概率

我们看一下之前我们的随机函数(模板和异常可忽略)

template<typename T = lvgm::precision>
    const lvgm::vec3<T> random_unit_sphere()
        {
        if (typeid(T) == typeid(int))
            {
            std::cerr << "integer doesn‘t have a random number from 0 to 1\n";
            throw "integer doesn‘t have a random number from 0 to 1\n";
            }

        lvgm::vec3<T> p;
        do
            {
            p = 2.0*lvgm::vec3<T>(rand01(), rand01(), rand01()) - lvgm::vec3<T>(1, 1, 1);
            } while (dot(p, p) >= 1.0);
        return p;
        }

这得到的是单位球体内部的随机三维点

如果我们要得到球体表面的三维空间点,那么我们只需要单位化一下即可

也就是return p的单位化向量

那么,能够代表这些球体表面点的pdf函数应该是什么呢?

作为单位球体表面点的均匀密度,用立体角的方式定义均匀密度

即单位立体角的球面度/整个球体对应的球面度,也就是1/球体面积 或者 1/4π

如果被积函数我们选取上面的cos2θ,θ为随机方向与z轴的夹角,那么程序如下

void sphereMC()
{
    auto pdf = []() {return 1 / (4 * π); };
    size_t n{ 10000000 };
    double sum{ 0 };
    for (int i = 0; i < n; ++i)
    {
        dvec3 d = random_unit_sphere().ret_unitization();
        double cosine = d.z()*d.z();
        sum += cosine / pdf();
    }
    stds cout << "I = " << sum / n << stds endl;
}

答案是 4π/3,绝对没毛病

 Chapter3 Light Scaterring

在上本书中,我们基于表面或者次表面实现散射光线,这是一个普适模型。

但是,更自然的方式是概率,该光线多大概率被吸收了?

设   光线反射概率为A

那么 光线被吸收的概率就为 1-A

这里的A其实代表之前材质中的albedo(latin for whiteness)。

Albedo代表着某些反射形式的反射比例

当我们实现玻璃材质的时候,albedo伴随着入射光线方向的变化而变化,进而计算相应变化的像素值

在大多数的基于物理的渲染器,我们将用一组波长表示浅色而不是RGB,我们用长中短波长来代表RGB

如果实现光散射,那么我们可以基于立体角设计一个pdf来描述光线散射方向分布。

我将其称为散射pdf:sdirection),这个散射pdf也会随着入射方向的变化而变化

所以这个表面色彩就数量(wavelength)而言有如下积分形式

color =  ∫A * s(direction) * color(direction) dθ    [公式1]

需要注意的是:A 和 s()都是依赖于观察方向的,当然,color也随着观察方向的变化而变化,A 和 s()也可能随着表面或体内部的位置而变化

如果我们将Monte Carlo应用到上面的积分的话,那么我们得到如下的统计估计公式

Color = (A * s(direction) * color(direction)) / p(direction)  [公式2]

这里的p(direction)是方向参数随机模拟生成的一个pdf函数

对于Lambertian材质表面,我们假定其密度是呈余弦规律的。

so, 一个Lambertian表面的p()是正比于cosθ,而θ是光线方向和表面法线的夹角,还需要注意一点:所有设计的pdf函数在定义域内的积分必须是1

我们还知道,对于磨砂表面来说,入射光线和表面法线的夹角不会超过90°,所以,我们定义

对于 cosθ < 0 的情况,我们设定s(direction) = 0

所以有效区间为半球面,而基于半球的cos积分为π,这个怎么理解呢?

还记得already中的球面度吗?我们那时候说过那个区域A的微分形式(基于球坐标)为

dA = sinθ dθdφ

所以,半球面积 =

所以,Lambertian表面散射pdf为:

  s(direction) = cosθ / π        [公式3]

如果我们采样也使用同样的pdf函数,

即: p(direction) = cosθ/π          [公式4]

那么分子分母可以消去,就得到了

  Color = A * color(direction)

注:

书中表示的是 Color = A * s(direction),不是很明白意图

联立公式2、3、4,难道不是约分剩下color()了么??

这是我们原始的color函数中的设定,但我们现在需要概括一下完整的形式,以便我们可以向重要方向发送额外的光线,例如朝向灯光。

如果你看过其他相关书籍,你可能会看到双向反射分布函数(BRDF)描述的反射。 它的表示形式非常简单:

BRDF =  A * s(direction) / cosθ      [公式5]

例如,对于朗伯表面,BRDF = A / Pi。(联立公式3、5可得)

我们的表达方式和BRDF之间的转换很容易。而对于参与媒体(卷),我们的反照率通常被称为散射反照率,而我们的反照片通常被称为相位函数。

这一篇主要讲一些理论相关的东西,可能没什么直观感受,但是下一篇学习的时候就需要用到这些东西了,没感觉的也没关系,结合下一篇可能会体会更深刻一点

感谢您的阅读,生活愉快~

原文地址:https://www.cnblogs.com/lv-anchoret/p/10500918.html

时间: 2024-11-06 07:20:03

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-3 蒙特卡罗 (三)的相关文章

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-5 random direction &amp; ONB

 Preface 往后看了几章,对这本书有了新的理解 上一篇,我们第一次尝试把MC积分运用到了Lambertian材质中,当然,第一次尝试是失败的,作者发现它的渲染效果和现实有些出入,所以结尾处声明要通过实践,改进当前的效果 于是乎,就有了后面的章节,几乎整本书都在讲,如何一步一步地改进上一篇的画质,使其更加符合现实,上一篇其实是抛砖引玉 这本书的小标题名为the rest of your life 通过前面几章,我们可以更好地理解这句话:我们通过MC积分优化效果,采用的是pdf函数,之前说过,

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-6 直接光源采样

Chapter7 Sample Lights Directly  Preface 今天我们来讲这个还算牛逼的技术——直接光源采样 之前我们提到过,在2-7 前两篇我们也提到要减少噪点,就是图片上的黑点点,所以,所有的矛头都指向了这一篇. 简单说一下为什么会有那么多小点点,就是因为光线路径中没有触碰到光源,路径计算之后就会是黑色的点,可以通过发射大量的光线,比如计算每个像素点的时候发射8k~1w条采样光线进行路径计算:也可以路径计算方面做文章,比如加深路径计算递归深度:等等诸如此类.但是上述方法都

【RAY TRACING THE REST OF YOUR LIFE 超详解】 光线追踪 3-1

今天起,我们就开始学习第三本书了 这本书主要讲的是蒙特卡罗渲染,以及相关的数学.术语概念等 我们先来一个简单的开胃菜 chapter 1:A Simple Monte Carlo Program 蒙特卡罗方法(MC)是一种统计模拟方法,是一类很重要的数值计算方法,它是一种使用随机数解决好很多实际问题的方法. 先来看一个很简单的例子:估计π 有很多经典的方法,其中之一是 假设你扔了很多随机的点到方框中,那么有一部分在圆内,其中圆内点和方框点的比例应该就是圆的面积和方框面积的比例,由此: 比例 =

POJ 1659 Frogs&#39; Neighborhood(可图性判定—Havel-Hakimi定理)【超详解】

Frogs' Neighborhood Time Limit: 5000MS   Memory Limit: 10000K Total Submissions: 9897   Accepted: 4137   Special Judge Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和Fj互称为邻居.现在已知每只青蛙的邻居数目x1, x2, ..

CentOS6启动过程超详解分析

CentOS 6 开机流程--linux由kernel和rootfs组成.kernel负责进程管理.内存管理.网络管理.驱动程序.文件系统.安全等;rootfs由程序和glibc组成,完善操作系统的功能.同时linux内核的特点是模块化,通过对模块装载卸载可以对内核功能自定义.linux内核文件:/boot/vmlinuz-2.6.32-696.el6.x86_64 整体的流程 BIOS/开机自检 MBR引导(Boot Loader) 启动内核 启动第一个进程init 一.BIOS/开机自检 1

【Ray Tracing in One Weekend 超详解】 光线追踪1-10

<Ray Tracing in One Weekend>完结篇 最近课程上机实验,封面图渲染时间也超长,所以写东西就落下了,见谅 这篇之后,我会继续<Ray Tracing The Next Week>,还请多多关注 这几天我在渲染这本书的封面图,封面图还没出,不算结束,刚好安排了10节 今天呢,有两件事: 1.阐述整个工程的文件组织即内容 2.阐述封面,完结 12.1工程文件组织 试过很多方法,问过很多老师,无奈,子类继承实现的父类纯虚函数实在无法和类声明分成两个文件(即声明放于

【Ray Tracing The Next Week 超详解】 光线追踪2-3

 Preface 终于到了激动人心的纹理章节了 然鹅,看了下,并不激动 因为我们之前就接触过 当初有一个 attenuation 吗? 对了,这就是我们的rgb分量过滤器,我们画出的红色.蓝色.绿色等等,都是通过它来控制的 专业点的词语叫做rgb衰减比例,比如rtvec(1.,0.,0.),最后呈现出来的是红色,因为r保留了100% 它是怎么控制的呢,我们来回顾一下这个过程 首先,我们创建一个材质球 后面那个rtvec(0.4,0.2,0.1)就是衰减比例(衰减到原来的百分之..) 之后 进入数

【Ray Tracing The Next Week 超详解】 光线追踪2-6 Cornell box

Chapter 6:Rectangles and Lights 今天,我们来学习长方形区域光照  先看效果 light 首先我们需要设计一个发光的材质 /// light.hpp // ----------------------------------------------------- // [author] lv // [begin ] 2019.1 // [brief ] the areaLight-class for the ray-tracing project // from t

【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 &amp;&amp; 场景案例

上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画质问题及优化方案 3. 新的场景几何体——长方体 轴平行长方体 任意长方体 我们这一篇重实践轻理论阐述 ready 1. 需要上一章的知识 但是,上一章的Cornell box画质优化仅限于盒子本身,如果作为场景和其他物体放在一起就不能那么优化画质 即,Cornell box像素计算失败应该返回黑色