初入计算机图形学(二):对bidirectional path tracing的一些困惑
本人水平有限,若有错误也请指正~
前文提及了光线追踪的一些常用手法,但是其中path tracing的实现最为简单,但是其最致命的一个缺点就是图像收敛速度很慢。。原因在于从摄影机发射出的每一条光线若不与场景中的光源相交,则这条光线就是无贡献的,或者遇到了一个漫反射表面,该表面反射环境光的值很低,这时候这条光线就成为了一条低贡献的光线,同时也可能增加整体图像的噪点数量。
这时候bidirectional path tracing提出了,其基本思想是从摄影机和光源两个视角出发,如下图所示,

光线分别从视点和光源出发,我们不妨将视点发出的光线为采样光线,光源发出的称为实际光线,该算法即是取采样光线与场景的每一个交点,这些交点与实际光线与场景的每一个交点形成一条连线,对每一条连线应用BRDF,再将这些多个采样值进行加权求和得到一个像素在一次迭代中的采样,这样做实际上提高了每条光线的贡献度,使得图片收敛的速度更快,但是里面仍有一些算法细节还是比较困惑:
1)当场景中存在很多遮挡,例如发生如下情况(这种情况也很常见),

当连线与场景中的一个障碍物有交点时(图中虚线),这时候我们应该在虚线所代表的那个采样值的权重设为0,使得这条虚线不会对最终的采样造成影响。这个方法对于那些障碍物是不透光的实体是可行的,但是如果障碍物是一个透光物体,该如何处理?按理讲应该还是应当将其权重设为0,因为虚线两端连接的光线是无法一次到达的(透光物体折射使得光线偏转,而偏转后的光线再次到达虚线另一端的概率为0),但是设为0着实不太合适,因为如下情况发生也是有可能的:

如上图绿线标注的那样,这条连线也可以使A对A'的采样值产生贡献,但是这时候的贡献权重就很难计算,况且很多情况下的透光物体不像图中那么规则,这时候权重的求解就更麻烦。通过一些hack的方式可以弥补这种情况带来的误差,但是如果hack手段用得多了,就失去了图形渲染的意义(毕竟我们要将正确性放在首位,不然就与那些实时交互性强的游戏没其它优越性可言了。。。)如果简单暴力的将权重置为0,那么会使得图像与真实图像来得暗,而且对于如下的极端情况处理的也不好:

上图中的所有虚线的贡献均为0,使得该采样值为0,这样的误差就比较大了。
2)能量是否守恒

如上图,从视点发射出的两条光线的采样值(图中两条与光源的灰色连线)会产生相同的贡献度,在像素的呈现上就会呈现相同的颜色,这是不对的,要解决这个问题就需要引入距离权重,会使得求解方程的形式更复杂,同时距离权重的引入还要处理好能量守恒的问题。这一方面看起来也是挺麻烦的。。。
以上就是学习bidirectional path tracing后的一些困惑。。从其他利用了bdpt算法的人渲染出的图片来看,他们处理上述情形处理的很好,不知道用了何种补偿措施,希望知道如何处理的大神们给出一条指导性的建议~
初入计算机图形学(二):对bidirectional path tracing的一些困惑的更多相关文章
- 初入计算机图形学——BVH结构的实现
摘要: 本人水平有限,若有错误也请指正~ 光线追踪作为全局光照解决方案的一个重要思想,其与场景大量三角形的求交效率高低直接影响最终算法的速度,典型的一些渲染器都采用二叉树来将场景进行划分,最近自己实现 ...
- 初入计算机专业,学习c语言的第一周作业问答
2019年9月17日下午3点30,我来到了1117教室准备上我进入大学的第一堂计算机专业课,并需要完成以下作业. 2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 我所了解的计算机就是一台 ...
- 初入Spring-boot(二)
一.入口类 Spring boot通常有一个名为*Application的入口类,入口类里有一个main方法,这个main方法其实就是一个标准的java应用的入口方法.在main方法中使用Spring ...
- 回顾bidirectional path tracing
最近因为研究需要,回顾了一下BDPT,主要看VEACH的那篇论文,同时参考了pbrt,mitsuba的实现,自己写了一份新的bdpt实现.以前实现的那一份BDPT不是基于物理的,而且无法处理镜面和透明 ...
- 初入码田--ASP.NET MVC4 Web应用开发之二 实现简单的增删改查
初入码田--ASP.NET MVC4 Web应用之创建一个空白的MVC应用程序 初入码田--ASP.NET MVC4 Web应用开发之一 实现简单的登录 2016-07-29 一.创建M002Adm ...
- 0x00linux32位汇编初入--前期准备
0x00汇编初入--前期准备 一.汇编工具 在linux平台下常用的编译器为as,连接器为ld,使用的文本编辑器为vim,汇编语法为att 以下是一些工具: addr2line 把地址转换为文件名和行 ...
- Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]
最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
opengl 计算机图形学 第三版 第二部分 第三章更多的绘图工具 3.1 概述 第2章中 我们绘图使用的是屏幕窗口的基础坐标系 以像素为单位 屏幕坐标从左下角x从0延伸到scr ...
- 计算机图形学——梁友栋-Barsky算法
梁算法是计算机图形学上最经典的几个算法,也是目前唯一一个以中国人命名的出现在国内外计算机图形学课本的算法,我之前在介绍裁剪算法的时候介绍过这个算法 https://www.cnblogs.com/wk ...
随机推荐
- MySQL之字符集-校对规则
一.字符集(Character set) 是多个字符(英文字符,汉字字符,或者其他国家语言字符)的集合,字符集种类较多,每个字符集包含的字符个数不同. 特点: ①字符编码方式是用一个或多个字节表示字符 ...
- 读《effective C++》2
条款03:尽可能使用const(Use const whenever possible) 1.const == 奇妙的事 const的一件奇妙的事是,他允许你定义一个约束,(告诉编译器,这是一个“不该 ...
- Java线程详解----借鉴
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- angular的$http.post()提交数据到Java后台接收不到参数值问题的解决方法
本文地址:http://www.cnblogs.com/jying/p/6733408.html 转载请注明出处: 写此文的背景:在工作学习使用angular的$http.post()提交数据时, ...
- JavaScript获取html元素的实际宽度和高度
一.JavaScript获取html元素宽高 1.宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offs ...
- Linux-进程描述(4)之进程优先级与进程创建执行
进程优先级 进程cpu资源分配就是指进程的优先权(priority).优先权高的进程有优先执行权利. 权限与优先级.权限(privilege)是指在多用户计算机系统的管理中,某个特定的用户具有特定的系 ...
- SQLiteServer+SQLiteClient 用于.Net项目的SQLite服务端程序和客户端类库
SQLite没有官方的支持CS方式调用的方式,因项目需要我自行开发了一个简易的版本. 当前版本支持的方法 SQLiteOpen(fileName):bool SQLiteClose():void SQ ...
- final修饰的变量是引用不能变还是对象的内容不能变?
int a=1;此时a是变量: StringBuffer a=new StringBuffer();此时a就是引用变量,可以说是a引用String对象,通过a来操作String 对象 final St ...
- Arcgis Engine OMD
在UML 图中有三种类型的类:抽象类(abstract class).组件类(COclass)与普通类(instantiable class). 抽象类:不能创建或实例化,从来没有一个抽象类的实例用于 ...
- 进击 spring !!
1.spring简介 Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您选择使用某一个组件,同时为 J2EE 应用程序开发提供集成 ...