【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.rhkb.cn/news/451977.html

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

相关文章

无人机初识及应用概览

随着科技的飞速发展&#xff0c;无人机作为一种新兴技术产品&#xff0c;逐渐走进了我们的日常生活和学习中。以下是对该文内容的全面总结&#xff0c;旨在帮助读者更好地理解和认识无人机的基本概念、分类、应用领域、国产标杆品牌以及四旋翼无人机的具体组成。 一、无人机的概…

第23章 - Elasticsearch 洞悉你的查询:如何在上线前发现潜在问题!

文章目录 1. 前言2. Profile API - 查询优化2.1 Profile API 简单介绍2.2 查询结果图形化2.3 Profile 注意事项 3. Explain API - 解释查询 1. 前言 在第 21 章中&#xff0c;我介绍了 Elasticsearch 的读优化&#xff0c;但你是否曾疑惑&#xff1a;如何在上线前判断查询的耗…

FFmpeg 4.3 音视频-多路H265监控录放C++开发二 : 18.04ubuntu安装,linux 下build ffmpeg 4.3 源码 并测试

测试环境 ubuntu 18.04 64 位&#xff0c;安装vmware and ubuntu 安装后调整 分辨率&#xff1a; 让windows 可以和 linux 互相复制黏贴 sudo apt-get autoremove open-vm-tools sudo apt-get update sudo apt-get install open-vm-tools-desktop 一直Y reboot 依赖安装 sud…

【数字图像处理】第5章 图像空域增强方法

上理考研周导师的哔哩哔哩频道 我在频道里讲课哦 目录 5.1 图像噪声 相关概念 ①图像噪声的产生 ② 图像噪声分类 ③ 图像噪声特点 5.2 图像增强方法分类 ①图像增强概念 ②图像增强目的 ③图像增强技术方法: 5.3 基于灰度变换的图像增强 1. 概述: 2. 灰度变换…

HCIP open-Euler学习文档

第一期 操作系统基础&#xff0c;web基础 OpenEuler 目录 学习系统常用应用(Apache Nginx DNS MySQL)服务器集群架构(HAProxy, Nginx, LVS,keepalived)存储管理(GlusterFS,NAS,SAN)自动化基础(Ansible,SaltStack)Shell脚本基础(变量&#xff0c;语法&#xff0c;函数&…

推荐一个处理数据非常好用的在线工具

推荐一个处理数据非常好用的在线工具 只要你的工作用到了电脑&#xff0c;经常需要处理数据的话&#xff0c;那么你肯定会遇到数据各种各样的问题&#xff0c;比如去重&#xff0c;对比&#xff0c;统计&#xff0c;排序等等 身为一名后端程序员&#xff0c;每天就是和数据打…

基于SpringBoot+Vue+uniapp的诗词学习系统的详细设计和实现

详细视频演示 请联系我获取更详细的演示视频 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不…

大数据-171 Elasticsearch ES-Head 与 Kibana 配置 使用 测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

Python案例小练习——小计算器

文章目录 前言一、代码展示二、运行展示 前言 这是用python实现一个简单的计器。 一、代码展示 def calculate(num1, op, num2):if op "":return float(num1) float(num2)elif op "-":return float(num1) - float(num2)elif op "*":return…

vue3--通用 popover 气泡卡片组件实现

背景 在日常开发中,我们一般都是利用一些诸如:element-ui、element-plus、ant-design等组件库去做我们的页面或者系统 这些对于一些后台管理系统来说是最好的选择,因为后台管理系统其实都是大同小异的,包括功能、布局结构等 但是对于前台项目,比如官网、门户网站这些 …

Ubuntu如何显示pcl版本

终端输入&#xff1a; apt-cache show libpcl-dev可以看到&#xff0c;Ubuntu20.04&#xff0c;下载的pcl&#xff0c;应该都是1.10版本的

dayjs日期格式化,开发uniapp或unicloud前后端进行时间格式转换

一、 为什么要用日期格式化 因为在开发项目过程中&#xff0c;会遇到各种各样的日期格式&#xff0c;有的显示完整的年-月-日 时:分:秒&#xff0c;而有的场景就只显示月-日等格式&#xff0c;还有就是显示当前时间和注册时间的间隔时长等&#xff0c;场景非常多&#xff0c;如…

Docker部署Kamailio,并使用LinPhone实现网络通话

前提条件 准备一个路由器&#xff0c;一个服务器&#xff0c;两个终端设备&#xff08;手机或电脑&#xff09; docker部署安装 我使用的是windows系统&#xff0c;docker desktop 先启动Docker desktop打开cmd&#xff0c;输入docker命令docker run --name kamailio --rm…

【MySQL】多表查询——内连接,左/右连接

目录 准备工作 1.多表查询 2.INNER JOIN&#xff08;内连接&#xff09; 2.1.笛卡尔积 1.2.笛卡尔积的过滤 1.3.INNER JOIN&#xff08;显式内连接&#xff09; 1.4.SELF JOIN&#xff08;自连接&#xff09; 3. LEFT JOIN&#xff08;左连接&#xff09; 3.1.一个例子…

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键

联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键 文章目录 联系拯救者Y9000P2022笔记本电脑进入BIOS快捷键1. 进入BIOS快捷键2. 快速进入BIOS设置界面3. 快速进入启动项选择界面 1. 进入BIOS快捷键 进入BIOS设置界面的快捷键为F2快速进入启动项选择界面的快捷键为F12 2. 快速进…

asyn queueRequest使用实例

使用queueRequest读写端口驱动的示例&#xff0c;驱动驱动程序使用一个基于asyn实现了asynCommon和asynOctet的驱动程序-CSDN博客中编写的驱动程序&#xff0c;本程序的C代码如下&#xff1a; #include <stdlib.h> #include <stdio.h> #include <string.h>#…

Sqli-labs less-27

Sqli-labs less-27 过滤union\select绕过方式 ### 1. 逻辑绕过 例&#xff1a; 过滤代码 union select user,password from users 绕过方式 1 && (select user from users where userid1)‘admin’### 2.十六进制字符绕过 select ——> selec\x74 union——>un…

nacos的使用

nacos的使用 本专栏的上一篇文章已经部署好了nacos&#xff0c;我们就可以使用nacos做配置中心和注册中心了。 一、配置中心 有了nacos&#xff0c;我们在微服务项目的配置文件里只需要做一些简单的配置就行了&#xff1a;服务名、服务端口、nacos的地址。其余的配置都可以用…

RBTree(红黑树)的介绍和实现

欢迎来到杀马特的主页&#xff1a;羑悻的小杀马特.-CSDN博客 目录 ​编辑 一红黑树介绍&#xff1a; 1.1红黑树概念&#xff1a; 1.2红黑树遵循的原则&#xff1a; 1.3红黑树效率分析&#xff1a; 二.红黑树的实现&#xff1a; 2.1红黑树结构&#xff1a; 2.2红黑树节点…

如意控物联网项目(二)-ML307R模组软件调试之MQTT+硬件接口调试笔记

目录 概要 1、 操作系统----RTOS kernel CMSIS-RTOS2 2、 程序API文档 3、 MQTT调试记录-2024年10月9日 4、 ML307_APP_DEMO_SDK使用指南 5、 MQTT登录onenet平台成功 6、 ML307R链接onenet平台成功-接收数据成功 7、 timer定时器调试 8、 操作系统--OS程序学习 1. 事件…