Instant Radiosity实现
本来说等把课程作业做完再来弄这个,但是还是没有忍住,先做了,主要原因还是这个算法很容易实现。这个算法在1997年由Keller首次提出。虽然名字叫Instant Radiosity,但是它和Radiosity还是有很大区别的,主要表现为Radiosity是确定性的算法,而Instant Radiosity是一个随机算法。再说该算法的思想,就是从光源像场景透射出很多粒子,与场景中物体发生碰撞后,就在碰撞点处创建出虚拟点光源(VirtualPointLight),利用这些VPL来近似模拟间接光照,思想十分简单。下图形象地展示了整个算法过程:

对于图中的这个室内场景,先求出它的直接光照结果图(左边两列(图1-10),因为是面积光源,所以需要对光源进行采样获得软阴影),而后从光源发射粒子击中墙壁或者地面桌面后,就在交点处设置一个虚拟点光源,对场景进行照明,得到结果图片11-20,最后将这两组结果做加权和就可以得到最终结果。至于怎么加权都无所谓了,一切看最终效果来定吧,我在实现的时候是做的基于重要性采样下的直接光和间接光的一比一相加。实际运行结果显示,由于一些VPL会在采样的时候被拒绝,最终直接光照平均亮度是大于间接光照的。
由于之前有过光子映射算法的实现经历,实现这个算法也十分简单,因为它的从光源发射粒子的这一步骤和光子映射中的photon pass十分相似。一般说来,对于间接光源做一次反射足以达到人们要求的视觉效果,但是如果场景足够复杂,或者场景主要由间接光照明的时候这就不够了。我在自己的实现中,对间接光作了6次反射,这样就和之前光子映射算法中光子在场景中的反射次数一致了,也可以作为两种算法的对比。下图展示了crytek_sponza在两种光源(左,右)下的效果,上,中,下分别是direct light渲染,Instant Radiosity渲染,photon mapping渲染:

左图中可以明显看出只计算直接光照和Instant Radiosity的效果区别,右图我利用了之前PM算法已渲染好的一个场景,能感觉出PM渲染的场景还是比Instant Radiosity更加生动,个人感觉层次感更好,离光源更近的地方更亮,这是光子分布天生的特性决定的,距离光源近的物体,被光子击中的概率远大于远处一样大小的物体,从而远处表面上的光子密度就会相对比较低,所以PM不需要考虑光的衰减问题。而Instant Radiosity则是创建好虚拟点光源后,将整个场景看做一个多光源的场景,用raytrace进行渲染,这样一来,需要手动设置光源衰减模型,这里我用了一个简单的二次模型来模拟,但是效果仍然不理想。不过Instant Radiosity速度是远超PM的,而且噪声也没有PM那么明显,只是Instant Radiosity仅适用于理想漫反射场景。
最后附上常用GI算法的比较:(表中漏掉了光子映射算法,它的特性依次是:有(光子图), 静态, 动态, 低, 无实时处理能力)

Instant Radiosity实现的更多相关文章
- SPX Instant Screen Capture
Today I will recommend a NICE screen capture tool, which name is SPA Instant Screen Capture. http:// ...
- Instant Complexity - POJ1472
Instant Complexity Time Limit: 1000MS Memory Limit: 10000K Description Analyzing the run-time comple ...
- Error running app: This version of Android Studio is incompatible with the Gradle Plugin used. Try disabling Instant Run.
转自:http://blog.csdn.net/qq_15807167/article/details/51984920 参考:http://stackoverflow.com/questions/3 ...
- 如何安装Oracle Instant Client
Oracle Instant Client是Oracle发布的轻量级数据库客户端,下面我们来看看官方的定义: Instant Client allows you to run your applica ...
- This version of android studio is incompatible with the gradle version used.Try disabling the instant run解决办法
今天打开android studio又碰到一个奇怪的问题:This version of android studio is incompatible with the gradle version ...
- 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
以往的Android开发有一个头疼的且拖慢速度的问题,就是你每改一行代码要想看到结果必须要编译运行到手机或者模拟器上,而且需要从头(可能是登录界面)一直点击到你修改的界面为止.开发一个完整的Andro ...
- Instant Python 中文缩减版
前言 本文主要来自<Python基础教程(第2版)>([挪]Magnus Lie Hetland著,司维 曾军崴 谭颖华译 人民邮电出版社) 中的“附录A 简明版本”,对于其中的有问题之处 ...
- [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
reference to : http://www.cnblogs.com/soaringEveryday/p/4991563.html 以往的Android开发有一个头疼的且拖慢速度的问题,就是你每 ...
- [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析
Android Studio升级到2.0之后,新增了Instant Run功能,该功能可以热替换apk中的部分代码,大幅提高测试安装的效率. 但是,由于我的项目中自定义了一些ClassLoader,当 ...
随机推荐
- 一则因为numa引发的mysqldump hang住
新买的dell r430服务器,双CPU,64G内存,单CPU32g,swap 3G 出现故障现像:mysqldump时会hang住,innodb_buffer_pool_size = ...
- 不好的MySQL过程编写习惯
刚才为了测试一个东西,写了个存储过程: delimiter $$ drop procedure if exists sp_test$$ create procedure sp_test() begin ...
- python time和datetime的常用转换处理
一.time 1.获取当前时间和时区 >>> now = time.time() # 当前时间 float类型 >>> time.strftime("%Y ...
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
- 一个"如何使用示波器安全测试接市电电路板"的问题
最近犯了一个错误测试操作: 测试场景:直接从市电插座取电接入3W非隔离开关电源电路板,使用示波器测试输出电压,此时示波器通过另外一个插座直接从市电取电 测试后果:在将示波器接到输出负极的一瞬间,漏电保 ...
- NYOJ 734
奇数阶魔方 描述 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方.n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7 ...
- 第3章 Linux常用命令(6)_关机重启命令
8. 关机重启命令 8.1 关机重启命令 (1)shutdown [选项] 时间 ①选项 -c:取消前一个关机命令 -h:关机 -r:重启 ②应用举例:#shutdown –h now.shu ...
- ajax方法总结
ajax方法总结 1.原生ajax get请求和post请求区别:黄色小三角 以get请求为例,输出结果如下: 2.jquery中的ajax 列了常用的6个方法: 3.状态说明 readystate: ...
- Android 从网络中获取数据时 产生部分数据乱码的解决
产生部分数据乱码的解决 标签: android部分中文乱码 2014-04-12 23:24 12366人阅读 评论(10) 收藏 举报 分类: [Android 基础](15) 版权声明:本文为博主 ...
- fMRI: spatial smoothing
Source: Brain voyager support Theoretical Background Spatial smoothing means that data points are av ...