【GAMES101笔记速查——Lecture 16 Ray Tracing4】

上节课的内容:辐射度量学、光线传播、反射方程、渲染方程、全局光照、概率论复习

这节课要介绍一种真实的渲染方法-蒙特卡洛路径追踪

目录

1 简单回顾

1.1 渲染方程(The Rendering Equation)

1.2 概率

2 蒙特卡洛积分(Monte Carlo Integration)

2.1 宏观把握问题(为什么、是什么、怎么做)

2.2 具体公式

2.3.1 举例:

2.3.2 好用在哪里?

2.3.3 需要注意的地方:

3 路径追踪(Path Tracing)

3.1 对比之前的Whitted-Style Ray Tracing

3.1.1 Whitted-Style Ray Tracing无法处理Glossy材质

3.1.2 Whitted-Style Ray Tracing无法处理漫反射物体的反射光线

3.2 渲染方程的物理正确性

3.3 蒙特卡洛解决方案

3.1.1 考虑某一个点的直接光照

3.3.2 如果要引入间接光照?

3.3.3 问题及改进策略

问题1:在递归中,光线数量会以指数级增加,难以承受的计算量。

问题2:递归算法shade没有停止条件

问题3:路径追踪算法效率

问题4:如果光源和着色点之间存在遮挡物

3.4 关于路径追踪的其他问题

3.4.1 遗留问题:点光源怎么办?

3.4.2 学习路径追踪的作用

3.4.3 ray-tracing一词在不同时期的含义

3.4.4 没涉及到的部分


1 简单回顾

1.1 渲染方程(The Rendering Equation)

1.2 概率


2 蒙特卡洛积分(Monte Carlo Integration)

2.1 宏观把握问题(为什么、是什么、怎么做)

为什么要学习蒙特卡洛积分?

答:要解一个定积分。

定积分就是一个函数在某个区间与坐标轴围成的面积,解出来就是一个数。

蒙特卡洛方法怎么做?

一种采样的思想

在积分域内不断采样,得到x对应的y坐标的值。对每一个小长方形都这么做,最后求个平均。

2.2 具体公式

2.3.1 举例:

假设在a~b之间均匀采样,那么采样的概率相同,记作C。

此概率在a~b区间上的积分就是1。

此时C可以解出来,就是1/b-a。

对应于均匀采样的蒙特卡洛积分可以推出来了,将这些值代入之前的公式,并把每一项都有的b-a提出去就可以了。

推广到一般情况,无论我们怎么采样,只要知道采样的PDF(概率密度函数)就可以用f(x)对p(x)求平均,从而得到对函数定积分的近似。

2.3.2 好用在哪里?

只需要知道采样的PDF就可以了

不用关心积分域,积分域已经在PDF中体现了。

2.3.3 需要注意的地方:

采样越多,结果越准确。

对谁采样,就对谁积分:对x积分,就对x采样。


3 路径追踪(Path Tracing)

3.1 对比之前的Whitted-Style Ray Tracing

光线打到光滑物体:沿镜面方向反射或者折射

光线打到漫反射物体:停止

这两件事情是不合理的。

高级: 让我们逐步改进Whitted-Style光线跟踪并形成我们的路径跟踪算法!

3.1.1 Whitted-Style Ray Tracing无法处理Glossy材质

光线打到壶上之后,反射光线不一定是镜面反射的

比如右边金色壶就带点磨砂的感觉,如果还是按照之前的那种方式,就会得到错误的结果。

3.1.2 Whitted-Style Ray Tracing无法处理漫反射物体的反射光线

光线打到漫反射物体时,是会反射光线的,但是whitted选择不处理这部分光,直接停止光线的弹射,那就会在漫反射物体相互作用的一些地方显示为纯黑。我们更希望看到全局光照的那种情况,而且物体上会出现墙面或者其他物体给它的光线,这些光线丰富了物体的暗部。

3.2 渲染方程的物理正确性

渲染方程是一个积分,把从四面八方来的光积分起来。

那么,我们要做的事:

1 解半球积分

2 递归执行

如何用数值方法解一个积分?

3.3 蒙特卡洛解决方案

假设:

场景内有一个相对较大的面光源。

场景内还有一个物体box

各个方向进来的光是均匀的。

3.1.1 考虑某一个点的直接光照

忽略渲染方程里的发光项,这个点的直接光照就是四面八方入射光照经过BRDF作用后,反射到观察方向的结果。

要计算半球上不同方向的积分,需要先对半球方向采样

为算出一个积分,需要先在积分域上进行采样得到样本X,然后计算出蒙特卡洛方法中的f(x)和p(x),两者相除求平均即可。

我们的f(x):积分号里面的所有东西

我们的p(x):均匀采样,1/2*pai。

然后,我们就把一个积分变成了一个简单的求和式子。

对照这个式子就可以写出着色算法。

从摄像机观察方向w0观察,p点给了它多少光?

对半球面的所有方向以一定的概率采样N个方向,对于每一个采样方向wi,连接点p与wi,判断形成的向量是否打到光源,如果打到光源,就计算这一方向对应的值。(只考虑直接光照)

3.3.2 如果要引入间接光照?

如果P点的某个方向的光来自Q点,那么Q点到P点反射了多少光呢?

这个问题可以转化为:从P点观察,Q点给了它反射了多少直接光照

代码中加入递归部分:

打到光源就用Li,打到物体就是物体Q在-wi上的直接光照:shade(q,-wi)

3.3.3 问题及改进策略

问题1:在递归中,光线数量会以指数级增加,难以承受的计算量。

N=1的时候指数不会爆炸,所以只随机采样一个方向的样本。

N=1来做蒙特卡洛积分就叫做路径追踪

如果N!=1,叫分布式光线追踪,现在很少有人提了。

N=1,噪声很大?

那么对一个像素生成多个path,最后求平均即可。

路径追踪:对每个像素发出若干光线,对每条光线做蒙特卡洛积分。此即路径追踪算法。

问题2:递归算法shade没有停止条件

因为现实中光线就是弹射无数次,如果计算中间停下来会损失光线。

这时候人们引入了:俄罗斯轮盘赌

 弹夹内装两枚子弹,如果此时生存概率P ( 0 < P < 1)为4/6,那么死亡概率 (1-P)为2/6

我们利用这个机制:

1.以一定的概率P发射一条光线,得到一定的结果Lo之后再除以这个概率P

2.以1-P的概率不发射光线,那么得到的结果是0.

这样操作的话,最终结果的期望仍为Lo

向算法中加入这个思想

到此为止,就已经是一个正确的path tracing的方法了

问题3:路径追踪算法效率

但这个方法还有个小问题,它的效率不高。

如果一个像素的采样率小,速度快,但会有很多噪声。

问题在哪呢?

我们之前的算法是在看运气,被观测点发出的光线不一定能打到光源,如果光源很小的话,可能需要随机出非常多的光线才能打到光源,这就造成 很多光线都被浪费了

我们现在是从被观测点向周围均匀地采样,那么我们有没有别的采样方法PDF?

答:直接在光源方向采样。

现在我们想对光源采样,对被观测点积分。这个事蒙特卡洛积分是干不了的,但我们想在形式上先写出来。

只需要知道dA和dw之间的关系就可以写出来了

上式展示了dA和dw之间的关系。

替换式子中的dw,改变积分域。

现在情况就变成了:对光源采样、对光源积分。

改进算法

被观测点最终的radiance由两部分决定

1.光源(直接通过采样光源计算,不需要俄罗斯轮盘赌)

2.其他反射物(间接地,需要俄罗斯轮盘赌)

代码

问题4:如果光源和着色点之间存在遮挡物

那么就加个条件判断就行了

如果存在遮挡物,结果为0

如果不存在遮挡物,正常计算

到此为止,路径追踪就写完了。

3.4 关于路径追踪的其他问题

3.4.1 遗留问题:点光源怎么办?

对于路径追踪来说,点光源真的不好处理,想把点光源做对需要注意很多。

所以建议把点光源做成一个很小的面积光源,来规避问题。

3.4.2 学习路径追踪的作用

写对路径追踪不容易。学path tracing很有用

通过学习可以让我们查漏补缺,对涉及到的数学物理代码等知识加深理解

因为用路径追踪的方法几乎和现实情况100%相似。

真是让人震惊的算法效果!

3.4.3 ray-tracing一词在不同时期的含义

·在较早前的时候:认为ray-tracing就是指whitted-style ray tracing

·近年来:说到ray-tracing可能在说所有光线传播方法的大集合,包括

-(单向/双向)路径追踪

-   光子映射

-   光线传输

-更复杂的,结合更多方法的光线传播方法。比如VCM/UPBP

反正,现在要生成一张图片,要么光栅化、要么光线追踪。

3.4.4 没涉及到的部分

·如何对一个函数均匀地采样?

·蒙特卡洛方法选取什么样的PDF最好?即如何针对性地对某一形状的函数最好地采样?

·编程中的随机数问题?low discrepency sequences可以解决一些问题

能不能结合采样被观测点和光源的方法?

平均问题

一个像素中的结果和radiance的转化:gamma矫正

等等......

最后,敬畏科学。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL Injection | SQL 注入概述

关注这个漏洞的其他相关笔记&#xff1a;SQL 注入漏洞 - 学习手册-CSDN博客 0x01&#xff1a;SQL 注入漏洞介绍 SQL 注入就是指 Web 应用程序对用户输入数据的合法性没有判断&#xff0c;前端传入后端的参数是可控的&#xff0c;并且参数会带入到数据库中执行&#xff0c;导致…

(10) GTest c++单元测试(mac版)

文章目录 概要安装实现机制-断言&#xff08;简单、独立的测试&#xff09;实现机制-测试套件实现机制-Test Fixture和事件 概要 官方文档 https://google.github.io/googletest/ 安装 git clone https://github.com/google/googletestcd googletestmkdir build && c…

数字化营销助企业在生态平台实现内卷突围

在当今数字化时代&#xff0c;企业竞争激烈&#xff0c;内卷化严重。而数字化生态平台建设与数字化营销为企业带来了新机遇。 数字化生态平台意义重大。它能整合企业内外资源&#xff0c;提高运营效率。打破地域限制&#xff0c;拓展市场&#xff0c;吸引更多客户。还能为企业创…

【AI副业项目】太离谱了!爆涨粉47W+,下一个风口项目AI+大健康养S赛道,单月变现30W,教你如何用AI做爆款健康养生账号

我一直说小红薯平台是最适合新手素人做的平台&#xff0c;去中心化的平台&#xff0c;任何普通人都可以在这个平台分一杯羹的平台。 但但但是很多朋友发小红薯作品都是超低的小眼睛&#xff0c;连最基本的流量都没拿到。 从他们的经历来看就是小红薯太难做了。那是没有掌握技…

【Vue】Vue3.0 (十二)、watchEffect 和watch的区别及使用

上篇文章&#xff1a; 【Vue】Vue3.0 &#xff08;十二&#xff09;、watch对ref定义的基本类型、对象类型&#xff1b;reactive定义的对象类型的监视使用 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Vue专栏&#xff1a;点击&#xff01; ⏰️创作时间&…

智慧油田智能安全管控方案-AI助力油气田安全管控升级

在科技日新月异的今天&#xff0c;万物纵横科技凭借其前沿的智慧油田智能安全管控方案&#xff0c;正引领着油气田行业向智能化、高效化转型。该方案深度融合了AI视频智能分析与AIoT&#xff08;物联网人工智能&#xff09;技术&#xff0c;为采油场、油气场的设备运维、环境监…

2024全网最详细CTF入门指南、CTF夺旗赛使用工具及刷题网站

2024年最新的CTF&#xff08;Capture The Flag&#xff0c;夺旗赛&#xff09;入门指南如下&#xff0c;涵盖了入门思路、常见题型及练习网站推荐&#xff0c;帮助你逐步了解并提升在CTF中的解题技巧。 如果你对网络安全入门感兴趣&#xff0c;我给大家整理好了相关资料&#…

Java集合剖析2】Java集合底层常用数据结构

一、数据结构与集合 接下来就要学习集合具体的实现类了&#xff0c;集合的实现类底层可能用1种或多种数据结构来存储数据。所以在学习集合的实现类前&#xff0c;我们有必要了解一下一些常见的数据结构&#xff0c;这样我们在后面查看集合实现类的底层源码时&#xff0c;才不会…

项目模块三:Socket模块

一、模块设计 1、套接字编程常用头文件展示 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <fcntl.h> 2、成员函数设计 &#xff08;1&#xf…

题目:连续子序列

解题思路&#xff1a; 首先&#xff0c;不能使用暴力枚举&#xff0c;时间为O(n2)&#xff0c;超时。以下为正确做法&#xff1a; 假设找到一段区间&#xff08;其和>m&#xff09;&#xff0c;如上图黄色部分&#xff0c;那么该区间加上i后面的元素形成的新区间和都>m&a…

Excel中如何进行傅里叶变换(FT),几步完成

在 Excel 中&#xff0c;虽然没有像 MATLAB 那样专门的函数库来直接进行傅里叶变换&#xff0c;但可以使用 Excel 内置的分析工具库提供的傅里叶变换&#xff08;FT &#xff0c;Fourier Transform&#xff09;功能。这个工具可以对数据进行频域分析。以下是如何在 Excel 中进行…

【.net core使用minio大文件分片上传】.net core使用minio大文件分片上传以及断点续传、秒传思路

版本&#xff1a;.net core 7 需求&#xff1a;net限制了上传的大小&#xff0c;只能上传25M上下的文件&#xff0c;如果上传一个八十多兆的文件&#xff0c;swagger接口报错&#xff0c;如果前端调用上传接口&#xff0c;会报CORS跨域错误&#xff0c;这篇文章介绍怎么使用分片…

C#学习笔记(九)

C#学习笔记&#xff08;九&#xff09; 第六章 面向对象编程&#xff08;一&#xff09;类与对象、字段与属性一、类与对象正确的理解1. 什么是类&#xff1f;2.什么是对象&#xff1f;3. 类与对象的区别 二、类的基本规范和对象使用1. 类的规范 三、类的访问修饰符&#xff08…

GoFly快速开发框架的utils-plugin扩展包开发演示教程

说明 本插件是教大家如何开发框架utils->plugin下扩展插件包&#xff0c;在开发时可安装本插件&#xff0c;参考本插件代码结构写你插件&#xff0c;这样可以达到规范插件代码&#xff0c;同时也也是为了兼容你安装其他人在代码仓通过扩展插件包&#xff0c;如果不规范可能…

Bolt 一款AI 全栈 Web 在线开发工具

参考&#xff1a; https://bolt.new/ github项目也可以支持Bolt在线打开编辑 直接连接前输入&#xff0c;比如 https://github.com/lyz1810/live2dSpeek更换成 https://bolt.new/github.com/lyz1810/live2dSpeek https://bolt.new/github.com/oh-my-live2d/oh-my-live2d 主要偏…

eUSB2规范介绍

一、说明 eUSB的全称是Embedded USB2,也支持低速、全速和高速三个速率,不过降低了电压幅值,从而使SOC更小、功耗更低,主要应用在芯片间互联,如需应用在设备间传输,一般需要加中继器。 eUSB2还支持USB2.0协议,仅物理层要求不同。 eUSB2支持2个模式:原生模式(native m…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

Turn-it:调整它:优化线材重构雕塑制造

&#x1f428;文章摘要abstract 电线雕塑在工业应用和日常生活中都很重要。 本文提出了一种新的制造策略&#xff0c;通过调整目标形状以适应电线弯曲机&#xff0c;然后由人工将其弯曲回目标形状。&#xff08;机器弯曲人工弯曲&#xff09; 该方法通过两阶段弯曲策略实现&a…

王爽汇编语言第三版实验2

实验任务 (1)使用Debug&#xff0c;将下面的程序段写 入程序&#xff0c;逐条进行&#xff0c;根据指令执行后的实际运行情况填空。 mov ax,ffff mov ds,ax mov ax,2200 mov ss,ax mov sp,0100 mov ax,[0] ;axC0EAH add ax,[2] ;axCOFCH mov bx,[4] ;bx30F0H add …

Flink消费Kafka实时写入Doris

本文模拟实际生产环境&#xff0c;通过FileBeat采集日志信息到Kafka&#xff0c;再通过Flink消费Kafka实时写入Doris。 文章目录 Filebeat采集日志到KafkaFlink消费Kafka实时写入Doris总结 Filebeat采集日志到Kafka 常见的日志采集工具有以下几种&#xff1a;Flume、Logstash和…