《学一辈子光线追踪》 三 光散射

2024-04-07 20:38
文章标签 一辈子 追踪 光线 散射

本文主要是介绍《学一辈子光线追踪》 三 光散射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

蒙特卡洛光线追踪技术系列 见 蒙特卡洛光线追踪技术

这一小节全都是文字,但是比较重要。虽然之前在

三维渲染 光能辐射基础

三维渲染 BRDF双向反射分布函数

三维渲染 相位函数

三维渲染 体照明模型

这几个章节也都很详细的描述过光学了,这里从概率的方面再进行描述。

在这一章中,我们实际上不会实现任何东西。我们将在第四章中为我们的节目设置一个大的灯光变化。

我们上一本书中的程序已经散射了表面或体积的光线。这是光与表面相互作用的常用模型。一种自然的建模方法是概率。首先,光线被吸收了吗?

光散射概率:A

光被吸收的概率:1-A

这里A代表albedo(拉丁文代表白色)。反照率在某些学科中是一个精确的技术术语,但在所有用途中,它都意味着某种形式的分数反射率。当我们在玻璃上实现时,反照率可能会随着入射方向的变化而变化,并且会随着颜色的变化而变化。在大多数基于物理的渲染器中,我们将使用一组波长作为灯光颜色,而不是RGB。我们几乎总是可以利用我们的直觉,把R、G和B看作特定的长、中、短波长。

如果光确实散射,它将具有方向性分布,我们可以将其描述为立体角上的pdf。我将其称为散射pdf:s(direction)。散射pdf也可以随着入射方向的变化而变化,这一点你会注意到,当你观察道路上的反射时,它们会变得像镜子一样。

根据这些数量,表面的颜色为:

color = INTEGRAL A * s(direction) * color(direction)

即: color = \int A *s(direction)*color(direction)

请注意,A和s() 可能取决于视图方向,因此颜色当然可以随视图方向而变化。A和s() 也可能随表面或体内的位置而变化。

如果我们应用MC基本公式,我们得到以下统计估计:

Color = (A * s(direction) * color(direction)) / p(direction)

其中p(direction) 是我们随机生成的任意方向的pdf。对于Lambertian曲面,我们已经隐式地实现了这个公式,用于p() 是余弦密度的特殊情况。

注意该球产生的光线中很明显theta角越小,产生光线的可能性更大:注意下图,同样大小的立体角中很明显接近法线的立体角里产生的光线比重更大。

Lambertian曲面的 s() 与 cos(theta) 成正比,其中 theta 是相对于曲面法线的角度。记住,所有pdf都需要积分为1。对于cos(θ)<1,我们有s(direction)=0,cos在半球上的积分是π(可以自己算算):

因此对于朗伯曲面,散射pdf为:

s(direction) = cos(theta) / Pi

如果我们使用相同的pdf进行采样,那么p(direction) =cos(theta)/Pi,分子和分母会抵消,我们得到:

Color = A * color(direction)   (我强烈认为书中是写错了,所以我在这里写的是我认为的版本,当然也可能我的书版本比较老,所以错误比较多)

这正是我们在原始 color() 函数中得到的结果!但是我们现在需要概括一下,这样我们就可以在一些重要的方向上,比如朝着灯光发射额外的光线。

上面的处理方法有点不标准,因为我希望对曲面和体使用相同的数学方法。否则会生成一些难看的代码。如果您阅读文献,您将看到双向反射分布函数(BRDF)描述的反射。它与我们的条款非常简单:

BRDF = A * s(direction) / cos(theta)

例如,对于Lambertian曲面,BRDF=A/Pi。我们的术语和BRDF之间的转换很容易。

对于参与介质(体积),我们的反照率通常称为散射反照率,我们的散射pdf通常称为相位函数。

这篇关于《学一辈子光线追踪》 三 光散射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883614

相关文章

SpringCloud之Sleuth(Micrometer)+ZipKin分布式链路追踪

(学习笔记) 1、分布式链路追踪概述 问题:在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条复杂的分布式服务调用链路,链路中的任何一环出现高延时或错误都会引起整个请求最后的失败。 在分布式与微服务场景下,我们需要解决如下问题:   在大规模分布式与微服务集群下,如何实时观测系统的整体调用链路情况。

钓鱼邮件真相追踪:XDR见招拆招!

钓鱼陷阱,财富“蒸发” 如果一家规模5000人、业务遍布全球的企业之中有一位员工不小心点进了一个钓鱼邮件,会发生什么……?终端失陷?数据泄露?失去客户信任? 最让人破碎的当然是……核心资产泄露,钱没了!! 人有失手,"鱼"有逃命 某大型零售企业财务部门小张收到一封看似来自公司财务部的邮件,由于内容与其实际工作情况相符,小张打开了邮件中的附件,并点击了附件里的下载链接

用异步序列优雅的监听 SwiftData 2.0 中历史追踪记录(History Trace)的变化

概述 WWDC 24 一声炮响为我们送来 Swift 6.0 的同时,也颇为“低调”的推出了 SwiftData 2.0。在新版本的 SwiftData 中,苹果为其新增了多个激动人心的新特性,其中就包括历史记录追踪(History Trace)。 不过,历史记录追踪目前看起来似乎有些“白璧微瑕”,略微让人有些不爽。在这里就让我们看看如何利用 Swift 结构化并发中的异步序列(Asy

是噱头还是低成本新宠?加州大学用视觉追踪实现跨平台的机器手全掌控?

导读: 在当今科技飞速发展的时代,机器人的应用越来越广泛。从工业生产到医疗保健,从物流运输到家庭服务,机器人正在逐渐改变我们的生活方式。而机器人的有效操作和控制,离不开高效的遥操作系统。今天,我们要介绍的是UC San Diego 的新研究,一种创新的跨平台视觉外骨骼系统ACE。©️【深蓝AI】编译 1. ACE系统的背景与概述 近年来,机器人研究者们通常利用真实世界的机器人数据,来训练

GAMES202——作业5 实时光线追踪降噪(联合双边滤波、多帧的投影与积累、À-Trous Wavelet 加速单帧降噪)

任务         1.实现单帧降噪         2.实现多帧投影         3.实现多帧累积         Bonus:使用À-Trous Wavelet 加速单帧降噪 实现         单帧降噪         这里实现比较简单,直接根据给出的联合双边滤波核的公式就能实现          Buffer2D<Float3> Denoiser::Fil

追踪uboot下tftp命令的代码执行过程-Nagul

一、网卡驱动的添加  网络在uboot中的启动是在uboot的第二阶段启动代码中 /lib_arm/board.c [cpp]  view plain copy void start_armboot (void){}   里面有网络初始化函数 [cpp]  view plain copy eth_initialize(gd->bd)

SpringBoot链路追踪②:如何集成?

首先下载Zipkin的jar包:Central Repository: io/zipkin/zipkin-server (maven.org) 根据自己的项目版本。我的版本分别是: <spring-boot.version>2.7.18</spring-boot.version> <spring-cloud.version>2021.0.8</spring-cloud.version> 选

分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用

目录 一、什么是链路追踪? 二、核心思想Dapper (一)Dapper链路追踪基本概念概要 (二)Trace、Span、Annotations Trace Span Annotation 案例说明 (三)带内数据与带外数据 带外数据 带内数据 数据的传递与集中 (四)采样 采样的目的 采样率的调整 采样机制的实现 (五)存储 为什么选择 BigTable 存

windows平台调用函数堆栈的追踪方法

转自:http://blog.csdn.net/lanuage/article/details/52203447 在windows平台,有一个简单的方法来追踪调用函数的堆栈,就是利用函数CaptureStackBackTrace,但是这个函数不能得到具体调用函数的名称,只能得到地址,当然我们可以通过反汇编的方式通过地址得到函数的名称,以及具体调用的反汇编代码,但是对于有的时候我们需要直接得

旅行追踪和行程规划工具AdventureLog

什么是 AdventureLog ? AdventureLog 是一种记录您的旅行并与世界分享的简单方法。您可以在日志中添加照片、笔记等。跟踪您访问过的国家、探索去过的地区和地方。您还可以查看您的旅行统计数据和里程碑。AdventureLog 旨在成为您终极的旅行伴侣,帮助您记录您的冒险经历并轻松规划新的冒险经历。 主要功能: 使用姓名、日期、地点、描述和评级等字段记录过去的冒险经