一步一步实现基于GPU的pathtracer(三):path tracing 简述
全局光照这个名词在计算机图形学里已经不算一个新名词了,现在一提到拟真度,很多人基本上都会去想到全局光照,这个名词上世纪七八十年代就有了,好像是由一个叫Jim Kajiya的大神在他那篇已经被引用了不知道多少次的论文里《The Rendering Equation》里提出来的,现在很多全局光照算法基本上都是由这论文里面的一个公式推导出来的,可知其厉害之处了,其实主要思想很简单。
但是说到全局光照,其实就是对自然界的光子在场景中的实际行为进行模拟,把模拟的结果呈现给我们而已,但是模拟的话就得考虑一个效率的问题。。。每秒钟射入人眼的光子就有上亿个,我们不能把上亿个光子的路径都画出来,那太浪费时间了,所以研究者们必须找到一个简化的方法,在不过于降低一张静帧图像质量的同时,把用于渲染该图像的所需时间降到最小,这里就牵涉到性能和拟真度这二者之间的权衡了。既然模拟上亿个光子没必要,考虑到最最简单的光路可逆,如果有一束光,从光源处不远万里,经过各种折射反射等过程射入到了我们的眼睛里,那么我们也可以假想是有一束“光”从我们的眼睛里射出,经过同样但方向相反的路径,最终回到光源处。这就是前文提到的逆向光线追踪,在这种方法下,我们就没必要模拟每个从光源处射出的光子了,直接从屏幕出射光线,不过这里的“光线”被称为“采样光线”更为恰当一些,毕竟是我们通过一束假想的光线,向场景进行采样,采样的结果就是屏幕中这个位置对应像素的颜色。对于一个1920*1080的2k屏,每帧就要发射1920*1080 = 2073600条光线,最终产生一幅完整的图像,但是这仅是该场景在这一时刻的一个成像估计,为啥叫估计?因为单帧的每一个像素的颜色并不能代表正确结果,光线漫布场景时是充满不确定性的,即便是场景中一个确定的位置,确定的时刻,连续生成的多帧图像都是不同的,这些帧都可称为这个场景在这个时刻这个位置的成像估计,但是把同一处像素的一堆估计值平均一下,平均结果就更能贴近理论值,这就跟概率论里的“多个随机变量的平均值,其方差会随着随机变量个数的增加而下降”的道理是一样的,那么多少个估计值就够了呢?答案是:只要像素颜色在连续n帧内稳定下来了,没有变化,就够了。n取的越大,相当于判定一个像素颜色收敛的条件就越严格,一般取100就好,严格的话可以取500,一帧中已收敛的像素占整个帧像素的百分比可以作为衡量整张静帧图像质量的一个参量。
其实上面的一段话,就已经把path tracing的思想说出来了,path就是指的采样光线的路径,tracing就是我们要跟踪这条采样光线,看它在场景里面都发生了什么动作(反射,折射等等),并把这些动作都记录下来,最后算出一个颜色出来,整个算法其实就已经完成了。但是有一些难点在里面:
1)如何跟踪?
2)怎么记录光线与场景的交互?
3)最终像素的颜色怎么算?
4)“多个随机变量的平均值,其方差会随着随机变量个数的增加而下降”,但是如何让下降速率变得更快?(更快的下降速率意味着单像素收敛的速度越快,所需迭代次数越少,成像速度越快,实时性越好。)
5)一些还没注意到的其它难点。。。
即便有这些难点存在,路径追踪算法也算是全局光照诸多算法中一个比较简单的算法了,因为它原始暴力。。。但是,上述几个问题的不同解决方案,实际代表着不同的渲染风格,这也是计算机图形学的魅力所在。读者也可以试着用截然不同的处理手段,构建出一个类似卡通风格样式的非真实风格渲染,自由度极高,取决于您们的想象。
(PS:如果读者们有兴趣,也有耐心等我更完的话,如果不出意外,应该可以得到如下的渲染结果,也算是一个渲染成品预览,这里就先贴出来供大家欣赏~)





一步一步实现基于GPU的pathtracer(三):path tracing 简述的更多相关文章
- 一步一步实现基于GPU的pathtracer(一):基础
出于3D计算机图形学和图形渲染方面的个人兴趣,脑子里便萌生出了自己实现一个渲染器的想法,主要是借助pathtracing这种简单的算法,外加GPU加速来实现,同时也希望感兴趣的朋友们能够喜欢,也欢迎提 ...
- 一步一步实现基于GPU的pathtracer(二):求交算法
不管是哪种全局光照算法,最根本的都要落实到光线与物体的求交.主要分为光线与参数曲面和非参数曲面的求交,典型的参数曲面有球.盒.圆柱等基本体及基本体的组合体,以及一些更为复杂的参数曲面.非参数曲面就是所 ...
- 一步一步搭建基于ffmpeg和sdl2的流媒体播放器
一. 背景: 一步一步从资料收集.技术选型.代码编写.性能优化,动手搭建一款支持rtsp.rtmp等常用流媒体格式的视频播放器,ffmpeg用于流媒体解码,sdl2用于视频画面渲染和声音播放. 二. ...
- 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计
本帖最后由 xinxincaijq 于 2013-1-9 10:27 编辑 一步一步学ZedBoard & Zynq(四):基于AXI Lite 总线的从设备IP设计 转自博客:http:// ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(四)——一步一步教你如何撸Dapr之订阅发布
之前的章节我们介绍了如何通过dapr发起一个服务调用,相信看过前几章的小伙伴已经对dapr有一个基本的了解了,今天我们来聊一聊dapr的另外一个功能--订阅发布 目录:一.通过Dapr实现一个简单的基 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(三)——一步一步教你如何撸Dapr
目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实现一个简单的基于.net的微服务电商系统(二)--通讯框架讲解 三.通过Dapr实现一个简单的基于.net的微服务电 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(五)——一步一步教你如何撸Dapr之状态管理
状态管理和上一章的订阅发布都算是Dapr相较于其他服务网格框架来讲提供的比较特异性的内容,今天我们来讲讲状态管理. 目录:一.通过Dapr实现一个简单的基于.net的微服务电商系统 二.通过Dapr实 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(六)——一步一步教你如何撸Dapr之Actor服务
我个人认为Actor应该是Dapr里比较重头的部分也是Dapr一直在讲的所谓"stateful applications"真正具体的一个实现(个人认为),上一章讲到有状态服务可能很 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(七)——一步一步教你如何撸Dapr之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
随机推荐
- bzoj4031 [HEOI2015]小Z的房间——矩阵树定理
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4031 矩阵树定理的模板题(第一次的矩阵树定理~): 有点细节,放在注释里了. 代码如下: # ...
- bzoj1415 [Noi2005]聪聪和可可——概率期望
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1415 看博客:http://www.cnblogs.com/Narh/p/9206642.h ...
- [转] 本地项目上传github (新项目 / 旧项目)
前置:安装Git Bash,在github上新建仓库repository 1.右键点击项目所在文件夹,运行: git bash here.在git bash窗口运行命令 git init 把这个目录变 ...
- bzoj 4031: [HEOI2015]小Z的房间【矩阵树定理】
是板子题,因为mod不是质数所以需要辗转相除然而并不知道为啥 高斯消元部分还不知道原理呢--先无脑背过的 #include<iostream> #include<cstdio> ...
- bzoj 1724: [Usaco2006 Nov]Fence Repair 切割木板【堆】
如果反着看,看成合并木板,就和合并果子一样了,把若干块放进一个小根堆,然后每次取出两个合并,把合并结果加进答案和堆里 代码里小根堆用优先队列实现(懒 #include<iostream> ...
- eclipse mybatis 快速生成工具
1.首先,得先看看eclipse有没安装mybatis generator插件,如果有的话,请忽略这一步 eclipse在线安装mybatis generator 1.打开eclipse,找到help ...
- PowerDesigner 的使用教程
PowerDesigner 的使用这两篇博客挺好,我也是跟着学习,就不再写了: 初步学习: http://www.cnblogs.com/huangcong/archive/2010/06/14/17 ...
- 使用mysqldump导出数据库(表)
mysqldump用来备份数据库或在不同数据库之间迁移数据,mydqldump的备份内容包括用来创建表和装载表的SQL语句. 一.mysqldump使用方法 (1).备份单个数据库或数据库中的部分表, ...
- java list遍历三种方法
JSONArray jsonArray = new JSONArray(); jsonArray.add("1"); jsonArray.add("2"); j ...
- git reset作用
git reset: 1. 文件从暂存区回退到工作区,撤销add 2. 版本回退 一:文件从暂存区回退到工作区,撤销add 如果想取消某个add的文件,可以使用该命令来进行撤销操作 撤消add:gi ...