一步一步实现基于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之服务限流
在一般的互联网应用中限流是一个比较常见的场景,也有很多常见的方式可以实现对应用的限流比如通过令牌桶通过滑动窗口等等方式都可以实现,也可以在整个请求流程中进行限流比如客户端限流就是在客户端通过随机数直接 ...
随机推荐
- a high-level neural networks AP
Keras Documentation https://keras.io/ You have just found Keras. Keras is a high-level neural networ ...
- oracle导入dmp文件时出现异常
oracle导入dmp文件时出现错误 今天在给oracle导入dmp文件时老是出现错误,无论是命令行或PL/SQL,错误截图如下: 经查是导入用户的权限不足,导入用户并没有DBA权限,而导出的dmp文 ...
- Eclipse 工程配置与目录结构及各种文件夹(常用插件)
.classpath..project 是 Eclipse 工程所必须的文件. OpenExplorer: 该 jar 包的下载地址:samsonw/OpenExplorer 安装配置方法:eclip ...
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- attr 和 prop的区别和使用
一. attr和prop的区别 要想弄清楚attr和prop的区别,就要先搞清楚js中使用DOM方法获取设置属性和使用对象方法获取设置属性的区别. 在javascript中使用DOM方法设置获取属性值 ...
- [LOJ#10064]黑暗城堡
Description 在顺利攻破 Lord lsp 的防线之后,lqr 一行人来到了 Lord lsp 的城堡下方.Lord lsp 黑化之后虽然拥有了强大的超能力,能够用意念力制造建筑物,但是智商 ...
- K Seq HihoCoder - 1046 || BZOJ4504 k个串
这题与超级钢琴类似,然而重复的不重复计算贡献.. 那么先求出数组nxt,nxt[i]表示第i个元素之后的第一个与其相等的元素的下标,不存在则nxt[i]=0 考虑取的区间左端点为1时的情况. 将读入序 ...
- php pdo oracle
<?php/** * Created by mestars. * User: mestars * Date: 6/13/16 * Time: 10:52 PM */header('Access- ...
- [转]TFS下的源代码控制
本文转自:http://www.cnblogs.com/ajiefj/archive/2010/04/23/1718450.html 以下主要描述了: TFS源代码控制系统的基本场景 如何把一个项目添 ...
- Centos 开机自动联网
默认情况下,Centos不是自动连接上网的,要点击右上角有个电脑图标,选择system eth0进行连接, 可以修改开机启动配置只需修改:/etc/sysconfig/network-scripts/ ...