【路径追踪】前置知识1--辐射度测量学 Radiometry

2023-10-24 00:20

本文主要是介绍【路径追踪】前置知识1--辐射度测量学 Radiometry,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Intro

什么是辐射度测量学? 为什么需要辐射度测量学?
辐射度测量学为我们提供了用于描述光线传播和反射的相关概念以及数学工具.
图形学早期, 在各种条件的制约下, 我们一般通过诸如 Lambert 漫反射模型、Blinn-Phong 高光模型等计算表面光照. 这些经验模型能在一定程度上满足了人们对效率和效果的需求, 但是与产生令人信服的真实感渲染结果依旧存在较大的差距.
辐射度测量学就是用来解决这一问题的工具. 辐射度测量学通过精准表达光学的物理信息, 让我们得以在物理正确的基础上进行与光照相关的计算, 从而得到物理正确的结果.


光线追踪系统中对辐射度测量学的基本假设

虽然辐射度测量学是物理正确的, 但对于图形学来说, 我们只在集合光学领域进行计算. 在相关的讨论中都隐含着如下假设:

  1. 线性 Linearity: 光学系统中两个输入的合成效果通常等价于各自输入之和. 这一特性十分重要, 线性可加性极大的简化了我们对光线传输的分析与计算
  2. 能量守恒 Energy conservation
  3. 忽略偏振现象 No polarization
  4. 忽略荧光或磷光现象 No fluorescence or Phosphorescence
  5. 稳态 Steady state: 假设光线在环境中已经达到了稳定的状态, 所以 radiance 的分布不会随着时间的变化而变化. (在现实中光线的稳态往往在瞬间完成, 所以这一假设并不是系统产生的限制条件)

PS: 在这些条件下, 依旧难以有效表示的现象是光线的干涉和衍射现象. 产生这些现象的时候, 两片区域的全部 FLux 并不等于各自区域 Flux 的和.


辐射度测量学中的关键物理量

1. Radiant Energy
2. Flux(Power)
3. Intensity
4. Irradiance
5. Radiance

Radiant Energy

能量是辐射度测量学的起点, 单位是焦耳. 由于能量会随着时间不断累积, 所以在图形学领域很少使用能量进行研究, 但是我们需要使用的物理量都是由能量开始不断计算得出的.
Energy

Flux(Power)

Flux表示单位时间内辐射出的能量, Flux也被称为功率(Power).
Power
在渲染时, 我们一般用 Flux 来表示光源的总发射量. 以点光源为例, 我们通过设置包围点光源的球壳来分析 Flux. 需要注意的是, 虽然大球壳上通过任何一个微面元的能量都小于小球壳上的, 但是由于大球壳同时拥有更大的表面积, 所以大小两个球壳上的总 Flux 是相等的.

Point Light

衡量光源信息的重要物理量

Radiance

  • Intensity : 定义光源辐射出多少能量
  • Irradiance : 定义物体表面可以接收到多少能量
  • Radiance : 定义光线在传播时的能量

Intensity

Intensity 表示单位立体角(Solid Angle)上光源辐射的 power.
Intensity

那么什么是立体角? 我们知道平面上的一个角等于其对应的弧长除以半径. 立体角也采用非常类似的定义方式, 我们从球心发射一个类锥体会在球面上截取出一个面积, 立体角就等于这个面积除以半径的平方(注意! 我们所说的面积是在球面上的投影面积).
角和立体角下图展示了微分立体角, 计算非常直观不再赘述.

微分立体角

Irradiance

Irradiance 表示物体表面上单位面积上接收到的 power.

Irradiance

如下图所示, Irradiance 的定义同时也解释了 Lambert Cosine Law 的含义.
(Lambert Cosine Law : 到达物体表面的光能与光线方向和表面法线夹角的余弦成正比)

Lambert Cosine Law
与之类似, 我们同样可以直接利用 Irradiance 的定义来解释为什么点光源会以距离平方的形式不断衰减. 同时这里我们可以进一步明确一点, 我们所说的衰减, 是 Irradiance 在衰减, Intensity 并不会衰减.

点光衰减

Radiance

Irradiance 告诉了我们表面上单位面积内接收到的 power 是多少. 这其中有一个关键的问题是 Irradiance 并没有体现出 power 在不同方向上的分布, 而光线追踪的过程明显是与方向相关的, 所以我们定义了 Radiance 来表达这一属性.
Radiance 是指辐射源在某一方向, 每单位投影面积, 每单位立体角内的 power.
Radiance接下来我们尝试使用"传输理论"来解释 Radiance 定义中的余弦项从何而来.
传输理论涉及物理量(如能量, 电荷, 质量)的传输或流动. 假设我们已知 x 处的光粒子密度为 p(x), 那么在一个很小的体积 dV 内光粒子的个数就是 p(x)dV. 下面再考虑这些粒子在时间 dt 内穿过一些不同的表面 dA. 假设光粒子的速度为 c, 那么这段时间内流过表面的体积就是 cdtdAcosθ, 那么穿过表面的粒子数量就是 p(x)cdtdAcosθ. 这很直观的说明了我们为什么要使用投影面积以及 radiance 中余弦项的来源.

传输理论


参考资料

  • 全局光照算法技术(第2版) (Advanced Global Illumination, 2nd Edition) Philip Dutre等著, 黄刚译
  • Physically Based Rendering: From Theory To Implementation
  • GAMES101-现代计算机图形学入门-闫令琪 Lecture 14 Ray Tracing 2
  • PBRT-E5.4-辐射学(Radiometry) 知乎: 玉米

这篇关于【路径追踪】前置知识1--辐射度测量学 Radiometry的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python获取当前文件和目录路径的方法详解

《python获取当前文件和目录路径的方法详解》:本文主要介绍Python中获取当前文件路径和目录的方法,包括使用__file__关键字、os.path.abspath、os.path.realp... 目录1、获取当前文件路径2、获取当前文件所在目录3、os.path.abspath和os.path.re

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

sqlite3 相关知识

WAL 模式 VS 回滚模式 特性WAL 模式回滚模式(Rollback Journal)定义使用写前日志来记录变更。使用回滚日志来记录事务的所有修改。特点更高的并发性和性能;支持多读者和单写者。支持安全的事务回滚,但并发性较低。性能写入性能更好,尤其是读多写少的场景。写操作会造成较大的性能开销,尤其是在事务开始时。写入流程数据首先写入 WAL 文件,然后才从 WAL 刷新到主数据库。数据在开始

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

图的最短路径算法——《啊哈!算法》

图的实现方式 邻接矩阵法 int[][] map;// 图的邻接矩阵存储法map = new int[5][5];map[0] = new int[] {0, 1, 2, 3, 4};map[1] = new int[] {1, 0, 2, 6, 4};map[2] = new int[] {2, 999, 0, 3, 999};map[3] = new int[] {3, 7

vcpkg子包路径批量获取

获取vcpkg 子包的路径,并拼接为set(CMAKE_PREFIX_PATH “拼接路径” ) import osdef find_directories_with_subdirs(root_dir):# 构建根目录下的 "packages" 文件夹路径root_packages_dir = os.path.join(root_dir, "packages")# 如果 "packages"