计算机图形学入门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…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
