本来说等把课程作业做完再来弄这个,但是还是没有忍住,先做了,主要原因还是这个算法很容易实现。这个算法在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实现的更多相关文章

  1. SPX Instant Screen Capture

    Today I will recommend a NICE screen capture tool, which name is SPA Instant Screen Capture. http:// ...

  2. Instant Complexity - POJ1472

    Instant Complexity Time Limit: 1000MS Memory Limit: 10000K Description Analyzing the run-time comple ...

  3. 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 ...

  4. 如何安装Oracle Instant Client

    Oracle Instant Client是Oracle发布的轻量级数据库客户端,下面我们来看看官方的定义: Instant Client allows you to run your applica ...

  5. 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 ...

  6. 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能

    以往的Android开发有一个头疼的且拖慢速度的问题,就是你每改一行代码要想看到结果必须要编译运行到手机或者模拟器上,而且需要从头(可能是登录界面)一直点击到你修改的界面为止.开发一个完整的Andro ...

  7. Instant Python 中文缩减版

    前言 本文主要来自<Python基础教程(第2版)>([挪]Magnus Lie Hetland著,司维 曾军崴 谭颖华译 人民邮电出版社) 中的“附录A 简明版本”,对于其中的有问题之处 ...

  8. [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能

    reference to : http://www.cnblogs.com/soaringEveryday/p/4991563.html 以往的Android开发有一个头疼的且拖慢速度的问题,就是你每 ...

  9. [原创]Android Studio的Instant Run(即时安装)原理分析和源码浅析

    Android Studio升级到2.0之后,新增了Instant Run功能,该功能可以热替换apk中的部分代码,大幅提高测试安装的效率. 但是,由于我的项目中自定义了一些ClassLoader,当 ...

随机推荐

  1. 【hive】——Hive基本操作

    阅读本文章可以带着下面问题:1.与传统数据库对比,找出他们的区别2.熟练写出增删改查(面试必备) 创建表:hive> CREATE TABLE pokes (foo INT, bar STRIN ...

  2. Linux--shell脚本之正则表达式

    一.正则表达式的概念及特点: 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑.规 ...

  3. shell九九乘法表

    #!/bin/bash ..}; do ..}; do if [ $x -ge $y ]; then echo -ne "$y*$x=$[$y*$x] \t" fi done ec ...

  4. jQuery 3.0的buildFragment

    在 jQuery3.0中,buildFragment 是一个私有函数,用来构建一个包含子节点 fragment 对象.这个 fragment 在 DOM1 中就已经有了,所有浏览器都支持.当频繁操作( ...

  5. stm32 UART串口

    void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res; #ifdef OS_TICKS_PER_SEC //Èç¹ûʱÖÓ½ÚÅÄÊý¶ ...

  6. mysql常用基本操作

    mysql常用操作 查看都有哪些库 show databases; 查看某个库的表 use 库名; show tables; 查看表的字段 desc 表名; 当前是哪个用户 select user() ...

  7. 【小白的CFD之旅】17 需要编程?

    小白经过大半个多月对于CFD的学习,终于对其大概轮廓有了初步的了解,尤其是在与小牛师兄交流之后.小牛师兄毕竟是专业学流体力学的,小白认为在流体力学理论方面自己与牛师兄至少存在5年的差距.不过小白并不气 ...

  8. HTML ------ 关于表单 Form

    Form(表单)主要用于采集和提交用户输入的信息,是页面与WEB服务器交互过程中 最重要的信息来源. 掌握表单(Form)有以下几个要点: 重要form属性 form常用控件 form提交方式 § 重 ...

  9. java程序设计之完数

    题目:一个数如果恰好等于它的因子之和,这个数就称为"完数".例如6=1+2+3.编程 找出1000以内的所有完数. 解题过程也很简单: public class wanshu { ...

  10. Linux网卡配置及学习linux的注意事项

    一.网卡配置 1.ifconfig网卡信息,配置IP ifconfig eth0 192.168.2.102 2.修改网卡配置(连接不了可能是IP给占用了) 进入编辑界面命令:vi /etc/sysc ...