计算机图形学入门26:高级光线传播
1.有偏与无偏
在做光线追踪很多方法都是用蒙特卡洛积分去估计,蒙特卡洛积分有些是无偏的(Unbiased),所谓无偏估计就是无论使用多少个样品,所估计的期望值都是正确的。那么,所有其他情况都是有偏的(Biased),就是估计的期望值与最后的结果不一样。在有偏估计里还有一种特性情况,如果样品足够多,那么得到的期望值会收敛到正确值。
2.无偏光线传播方法
2.1 双向路径跟踪(BDPT)
回顾一下,一条路径连接相机和光源就是路径追踪,而双向路径跟踪(Bidirectional path tracing (BDPT))就是一个拓展,从光源和相机分别发射一条射线,称为半路径,然后把半路径的端点连接起来。如下图所示。
双向路径跟踪计算非常缓慢,并且难以实现,但是适用于光线传输复杂的情况。如下图所示,左边图是单向路径追踪,而右图是双向路径追踪,都使用了每个像素32个样本,可以发现双向路径追踪效果好很多。为什么呢?
如果在光线追踪中,如果想找一条带有大量能量的路径,对于这种场景来说不太容易。这种场景中光源往上打灯,整个场景其实是由间接光照亮的,在单向路径追踪中光线从相机出发第一个反射点是漫反射,可能很难达到光源(能量集中的区域)。
2.2 Metropolis light transport (MLT)
MLT的思想是用统计学上的一个采样的工具,这种工具可以帮助采样,这种工具名称叫做马尔可夫链(Markov Chain)。马尔可夫链可以根据当前的样本,生成下一个样本。在样本周围生成新样本来估计函数的值。好处是给定足够的时间,这个马尔可夫链的蒙特卡洛方法(MCMC)可以生成一系列以任意函数为形状的PDF生成的样本,使得这些样本的分布就是和这些被积的函数形状一致。
既然有个方法可以变成更多的样本来,那么反映到产生路径这个事情上,就是有一个路径的情况可以产生周围更多相似的路径。也就是说是个局部的方法,给定任意一条路径可以生成周围相似的路径。如下图所示,通过一条原本的路径(蓝色),生成一条相似新的路径(橙色)。
优点:MLT方法特别适合复杂或者困难的光路的传播,如下图是与BDPT的对比图。为什么说以下场景比较复杂呢,可以发现左图的光线是从小门传播进来的,其余都是间接照亮。而右图是游泳池,光线聚焦到水底形成的特殊效果。
缺点:收敛速度难以估计,并且不能保证每个像素的收敛速度相等。所以,通常会产生“脏”的结果,如下图所示。通常不用于渲染动画。
3.有偏光线传播方法
3.1 光子映射(Photon mapping)
光子映射是一个有偏的估计方法,特别适合渲染产生的Caustics,所谓Caustics就是由于光线聚焦产生非常强烈的图案,如下图所示。
还适合以Specular-Diffuse-Specular(SDS)这样的光线路径。
光子映射主要分为两步做法,举例一种实现为例。(光子映射可以有很多种方法)
阶段1:光子追踪(Photon tracing)
从光源发射光子(光线),在周围反射,然后在漫反射表面上记录光子。
阶段二:光子收集(Photon collection)
从相机中发射路径,将它们四处弹射,直到它们击中漫反射表面。
计算:局部密度估计
思路是光子越多的地方越亮。对于每个着色点找到最近的N个光子,取它们覆盖的表面积,光子密度就等于光子数量N除以所覆盖的表面积。如下图所示。
如果取得的光子数量N很少,那么得到很有噪声的图。如果得到N的数量太多,就会得到模糊的图。因为光子映射是个有偏的方法,在做密度估计的时候,想算的密度应该是一个点dN除以一个微小面积dA,得到里面有多少个光子。但是,这里是给定一定光子数N算覆盖的面积A。正确情况下,这俩不是一回事,如下。只有dA无限小才是正确的估计。
那么什么情况下dA会无限小,就是当发射的光子数量非常多,无限多的时候。那么找附近N个光子数一定是覆盖更小的区域。区域更小,这个区域就更接近dA。所以,当有足够多的光子的时候,就可以得到一个正确的结果。虽然是有偏的,但是是一致(Consistent)的。一致的意思是当样品足够多的时候,结果会收敛到正确的值。
3.2 顶点连接和合并(VCM)
顶点连接和合并(Vertex connection and merging (VCM))是BDPT和光子映射结合的方法。关键理念是如果BDPT中的子路径(sub-paths)的端点不能连接但可以合并,那么我们就不要浪费它们了。使用光子映射来处理附近“光子”的合并。如下图所示。
4.实时辐射度(VPL/许多光方法)
实时辐射度(Instant Radiosity)也被称为多光方法,关键理念是被照亮的表面可以被视为光源。通过发射光的子路径,并假设每个子路径的终点是一个虚拟点光(VPL),使用这些VPL发射光线去渲染场景。如下图所示。
优点:速度快,通常在漫反射场景中效果很好,如下左图。
缺点:当VPL靠近着色点时,尖峰会出现,如下右图。不能处理有光泽的材料。
相关文章:

计算机图形学入门26:高级光线传播
1.有偏与无偏 在做光线追踪很多方法都是用蒙特卡洛积分去估计,蒙特卡洛积分有些是无偏的(Unbiased),所谓无偏估计就是无论使用多少个样品,所估计的期望值都是正确的。那么,所有其他情况都是有偏的(Biased),就是估计的期…...

STM32蓝牙HID实战:打造低功耗、高性能的客制化键盘
一、项目概述 本项目旨在使用STM32单片机打造一款功能强大的蓝牙客制化键盘,它拥有以下特点: 九键布局,小巧便携: 满足日常使用需求,方便携带。全键可编程: 所有按键和旋钮均可通过电脑软件自定义快捷键,实现个性化功…...
C++ STL容器:序列式容器-队queue,deque
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...
简谈设计模式之单例模式
上一篇博客已经介绍了设计模式及其设计原则, 在这篇博客中笔者会介绍一下单例模式, 也是最简单的一种设计模式 单例模式 单例模式属于创建型模式. 它涉及到一个单一的类, 该类负责创建自己的对象, 同时确保只有单个对象被创建, 这个类提供了一种访问其唯一对象的方式, 可以直…...
在Spring Boot中实现多线程任务调度
在Spring Boot中实现多线程任务调度 大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 1. Spring Boot中的任务调度 Spring Boot通过集成Spring框架的Task Execution和Scheduling支持,提供…...
dify/api/models/account.py文件中的数据表
源码位置:dify\api\models\account.py accounts 表结构 字段英文名数据类型字段中文名字备注idStringUUIDIDnameString名称emailString邮箱passwordString密码password_saltString密码盐avatarString头像interface_languageString界面语言interface_themeString界…...
SQLAlchemy迁移数据库
SQLAlchemy迁移数据库 目录 SQLAlchemy迁移数据库安装Alembic配置Alembic编辑 alembic.ini编辑env.py生成迁移文件建表语句示例修改迁移文件命名格式 安装Alembic pip install alembic配置Alembic 执行初始化后会创建一个 alembic 目录,包含Alembic的配置文件 ale…...

Django文档简化版——Django快速入门——创建一个基本的投票应用程序
Django快速入门——创建一个基本的投票应用程序 准备工作1、创建虚拟环境2、安装django 1、请求和响应(1)创建项目(2)用于开发的简易服务器(3)创建投票应用(4)编写第一个视图1、编写…...

安全防御第三天(笔记持续更新)
1.接口类型以及作用 接口 --- 物理接口 三层口 --- 可以配置IP地址的接口 二层口 普通二层口 接口对 --- “透明网线” --- 可以将一个或者两个接口配置成为接口对,则 数据从一个接口进,将不需要查看MAC地址表,直接从另一个接口出;…...

【12321骚扰电话举报受理中心-短信验证安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
杂项——循迹模块调节方法
1-4 路灰度传感器的调节方法: 调节时探头应对着颜色较浅的上方(如果是黑白线赛道则应该将探头 对着白色上方调),轻轻的将全部可调电阻顺时针拧到底,再逆时针 慢慢回旋,直到对应探头的信号指示灯亮起后&…...

揭秘:源代码防泄密的终极秘籍
在当今信息科技高度发达的时代,源代码作为企业最核心的资产之一,其安全性不言而喻。源代码的泄露可能导致企业技术机密被竞争对手获取,进而威胁到企业的市场竞争力和长远发展。因此,源代码防泄密成为了企业信息安全工作的重中之重…...
avcodec_send_packet函数阻塞
用ffmpeg4.1.4开发一个播放器,解码过程如下,在每个函数前设置标志,测试发现程序阻塞在avcodec_send_packet函数。 while(true){av_read_frameavcodec_send_packetavcodec_receive_frameav_packet_unref } 解释如下: avcodec_se…...
一个parquet-go例子
一个parquet-go例子 使用go读写parquet,使用到了框架github.com/xitongsys/parquet-go 代码: package mainimport ("log""time""github.com/xitongsys/parquet-go-source/local""github.com/xitongsys/parquet-go/parquet&qu…...

扩散模型笔记
长参数“T”决定了生成全噪声图像所需的步长。在本文中,该参数被设置为1000,这可能显得很大。我们真的需要为数据集中的每个原始图像创建1000个噪声图像吗?马尔可夫链方面被证明有助于解决这个问题。由于我们只需要上一步的图像来预测下一步,…...

上海-LM科技(面经)
上海-LM科技 hr电话面 个人简介 个人信息的询问 是否知道芋道框架 技术面 算法题 14. 最长公共前缀(写出来即可) 聊一下Docker Docker核心概念总结Docker实战 聊一下AOP Spring AOP详解 聊一下JWT JWT 基础概念详解JWT 身份认证优缺点分析 Spring…...

用 Echarts 画折线图
https://andi.cn/page/621503.html...

C++的map / multimap容器
一、介绍 在C的map / multimap容器中,所有的元素均是pair类型(有关pair类型可以参考我之前写的 《C的set / multiset容器》的3.2中有介绍到)。 每对pair的第一个元素被称为关键字key,第二个元素被称为值value。因此,ma…...

双向链表 -- 详细理解和实现
欢迎光顾我的homepage 前言 双向链表是一种带头双向循环的链表。在双向链表中,首先存在着一个头结点;其次每个节点有指向下一个节点的指针next 和指向上一个节点的指针prev ;…...
WebGIS面试题
文章目录 1. 前端1.1. 选择器的优先级1.2. CSS 中它的布局有哪些?1.3. CSS3 的新特性1.4. CSS 的两种盒子模型1.5. CSS 的伪元素选择器和伪类选择器有哪些?1.6. ES6 的新特性1.7. 谈谈你对 promise 的理解1.8. 简单说一下原型链1.9. 简单说一下深浅拷贝1…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...

快速排序算法改进:随机快排-荷兰国旗划分详解
随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...