计算机图形学入门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…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
.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 适用场…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
