一步一步实现基于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之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
随机推荐
- [疑问] C# 多线程程序,如果在并行程序块中开空间会远远慢于将空间开在并行块之外
// int[,] label = new int[m, n]; Parallel.For(, thread_num, (n) => { ]; i++) { int[] tmp = new in ...
- Could not find modernizr-2.6.2 in any of the sources
- E20180109-E
auxilary adj. 辅助的; 备用的,补充的; 附加的; 副的; n. 助动词; 辅助者,辅助人员; 附属机构,附属团体; 辅助设备;
- 【BZOJ2525】[Poi2011]Dynamite(二分,树形dp)
[BZOJ2525][Poi2011]Dynamite Description Byteotian Cave的结构是一棵N个节点的树,其中某些点上面已经安置了炸.药,现在需要点燃M个点上的引线引爆所有 ...
- nginx 多进程 + io多路复用 实现高并发
一.nginx 高并发原理 简单介绍:nginx 采用的是多进程(单线程) + io多路复用(epoll)模型 实现高并发 二.nginx 多进程 启动nginx 解析初始化配置文件后会 创建(for ...
- 公司5:JrVue表格
组件名称:jr-dynamic-query-table 组件布局 table组件名称: jr-dynamic-query-table 分页组件名称: el-pagination <div re ...
- 洛谷 P1233 木棍加工
题目描述 一堆木头棍子共有n根,每根棍子的长度和宽度都是已知的.棍子可以被一台机器一个接一个地加工.机器处理一根棍子之前需要准备时间.准备时间是这样定义的: 第一根棍子的准备时间为1分钟: 如果刚处理 ...
- java HashMap和LinkedHashMap区别
我们用的最多的是HashMap,在Map 中插入.删除和定位元素,HashMap 是最好的选择.但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.如果需要输出的顺序和输入的相同,那么用 ...
- 【js】callback时代的变更
最近团队开始越来越多的使用es7标准的async/await,从最开始的promise到后面的generator,再到现在async,对于异步,每个时期都有着其特有的解决方案,今天笔者就以自己的接触为 ...
- 题解报告:hdu 1686 Oulipo(裸KMP)
Problem Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, w ...