当前位置: 首页 > news >正文

计算机图形学入门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地址表,直接从另一个接口出&#xff1b…...

【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个噪声图像吗?马尔可夫链方面被证明有助于解决这个问题。由于我们只需要上一步的图像来预测下一步&#xff0c…...

上海-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 &#xff1b…...

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…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​,覆盖应用全生命周期测试需求,主要提供五大核心能力: ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

AI,如何重构理解、匹配与决策?

AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...