一步一步实现基于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之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
随机推荐
- Linux服务器 /var/spool/clientmqueue 目录下产生大量文件的删除办法
检查linux发现server中的磁盘分区空间超过98%,登录到服务器查看 [root@localhost etc]# df -hFilesystem 容量 已用 可用 已用% 挂载点/dev/hda ...
- BZOJ_3280_小R的烦恼_最小费用最大流
BZOJ_3280_小R的烦恼_最小费用最大流 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难 ...
- bzoj1999 (洛谷1099) 树网的核——dfs
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 https://www.luogu.org/problemnew/show/P109 ...
- hdu3018 Ant Trip (并查集+欧拉回路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018 题意:给你一个图,每条路只能走一次.问至少要多少个人才能遍历所有的点和所有的边. 这是之前没有接 ...
- Python网咯爬虫 — Scrapy框架应用
Scrapy框架 Scrapy是一个高级的爬虫框架,它不仅包括了爬虫的特征,还可以方便地将爬虫数据保存到CSV.Json等文件中. Scrapy用途广泛,可以用于数据挖掘.监测 ...
- P1128 [HNOI2001]求正整数
传送门 rqy是我们的红太阳没有它我们就会死 可以考虑dp,设\(dp[i][j]\)表示只包含前\(j\)个质数的数中,因子个数为\(i\)的数的最小值是多少,那么有转移方程 \[f[i][j]=m ...
- 【转】20道Spring Boot面试题
面试了少量人,简历上都说自己熟习 Spring Boot, 或者者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总 ...
- hdu6198 number number number(递推公式黑科技)
number number number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- SQL数据库语言基础
表的创建: 1.创建列(字段):列名+类型 2.设置主键列:能够唯一标识一条数据 3.设置唯一:内容不能重复 4.外键关系: 一张表(从表)其中的某列引用自另外一张表(主表)中的主键列 设计表: 数据 ...
- IKanalyzer、ansj_seg、jcseg三种中文分词器的实战较量
转自:http://lies-joker.iteye.com/blog/2173086 选手:IKanalyzer.ansj_seg.jcseg 硬件:i5-3470 3.2GHz 8GB win7 ...