前言:CG画面的“效果”最重要,至于达到这一效果所使用的技术倒是其次,一切的一切对于观众来说都是透明的。即使是Pixar都认为仅仅One Bounce Indirect Illumination对构建一个足够真实可信的光照效果足矣。看过这里的SII,我想你对Realtime Gobal Illumination的实现又会有一些新的认识。我实现了真实可信的Indirect Illumination效果,对比3dsmax附带的mental ray所得到的效果,同样不开阴影,我觉得我的画质更胜一筹。提供我的Demo下载,不过有个小小的BUG :-)期盼好心人帮我看一下。

  Splatting Indirect Illumination(以下简称SII)是我目前所看过最简单的实现Indirect Illumination间接光照方法。它结合了Shadow Mapping与Defered Shading,大部分使用了Reflective Shadow Map(以下简称RSM)技术的思想。虽然说技术很简单,完全没有Realtime Raytracing夸张的计算量,也没有Realtime Radiosity的局限,是一种很适合实时渲染程序尤其是游戏的技术,用来实现逼真可信的Indirect Illumination间接光照效果,再结合现有的Local Illumination算法如IBL光照,Ambient Occlusion等,完全可以实现电影级别的渲染质量。这一点在Pixar的设计思想中就有所提及。

  SII是源自于RSM的算法,所以在实现SII前需要解释一下RSM。RSM由4个Render Target(以下简称RT)组成:Depth Component、World Space Coordinates、World Space Normal、Flux。前面三者都很大众化了,直接绑定浮点纹理到FramebufferObject在Fragment Shader中输出就可以了,而最后一个Flux需要解释。

  在RSM的思路中,每一个在Light View的Depth Map中出现的点,都是对场景的间接光照效果有贡献的,这里叫做pixel light。对于每一个pixel light,我们可以首先设想它是无限小的,那么它在ω方向上发出的光强就是,

  同理,对于点x及其向量n来说,pixel light对它光照的贡献就是,

  然后,我们可以近似的认为,场景中每一个点的光照都可以通过积分这些pixel light的贡献获得,

  对于Glossy物体,如果使用类似于Phong的光照模型我们有,

  对于原始的RSM算法,从RSM贴图中收集gather所有的象素点进行计算耗费很大,于是在SII中就采用了改进的策略,采样。这里我们先不做处理,使用Hammersley点集分布。如下图,样本数目为64,

  下面准备开始实现。

1、首先我们从LightView渲染整个场景,渲染到World Position、World Normal、Flux 3张RenderTarget中去。

2、然后我们准备Defering Shading RenderTarget,也就是从摄像机渲染场景,得到World Position、World Normal、Diffuse、Specular、Shininess等光照计算需要的参数。

3、使用点集采样[1]中得到的纹理,再输出到同[1]中相同的RT中去。

4、在最终渲染遍中,使用[2]、[3]中的数据进行光照计算。

  在这个里面有几个技巧,第一个是怎样快速的生成RTs,答案当然是MRT。我使用了GL_RGBA_FLOAT16_ATI作为FBO的Attachment,相比GL_RGBA32F_ARB,FP16格式可以保证足够的精度,最重要的是硬件可以做GL_LINEAR过滤,而FP32硬件只支持NEAREST过滤。在我的7300GO上使用两种浮点纹理,效果几乎没有任何差别,而通过内存监测可以得知FP32让一切都变得很巨大。

  这里是只使用一个VPL进行渲染得到的黑白效果图,可以看到Local Illumination的效果很明显。右边是使用了64个VPLs得到的效果

  这里是使用3dsmax的mental ray渲染的,使用了一个SpotLight,没有开启GI,因为开了GI后Photon Mapping得到的图简直惨不忍睹,实在没有耐心去调整参数。

  导出整个3DS场景,这是实时渲染的结果,使用了一个Spot Texture,仅仅是为了玩 :-)。同样,没有渲染阴影。

  这是使用了128个VPLs后渲染得到的场景。为了简化计算我把SpotLight当成了Point Light。

  在这个经典的Cornel Box中站立着圣母、圣子的雕像,左边右边分别是红色与绿色的Diffuse面,雕像的身上体现了两种漫反射颜色的影响,天花板上也有浅浅的红色和绿色。如果再加上阴影和Ambient Occlusion和IBL那么效果将更加的完美,在这里我成功的实现了间接光照,最重要的是,一切的一切都是实时的。

  DEMO可以在这里下载,不过有个小小的BUG,渲染几个Frame后就黑屏了,不知道是不是缓冲切换的问题还是其他什么的,我还不是很清楚,如果你看程序麻烦帮我看看,有结果的可以联系我,谢谢!

转载于:https://www.cnblogs.com/Jedimaster/archive/2007/09/22/902242.html

An Implemention of Realtime Gobal Illumination相关推荐

  1. 实时全局光照(Real-time Global Illumination)与Reflective Shadow Maps(RSM)

    文章目录 1 概述 1.1 什么是全局光照(GI)? 1.2 光照模型处理间接光照的方法 1.3 实时全局光照的思想 2 GI的主要问题 3 方法一:Reflective Shadow Maps(RS ...

  2. Unity全局光照/Bake GI/Precomputed Real-time GI/Lightmap/Light Probe

    目录 Baked GI Lightmap和Light Probe Precomputed Real-time GI Unity的全局光照系统采用Enlighten解决方案,包含Baked GI和Pre ...

  3. Unity Global Illumination(Unity 全局光照 ) 官方手册笔记系列之Enlighten

    Enlighten 本文档主要是对Unity官方手册的个人理解与总结(其实以翻译记录为主:>) 仅作为个人学习使用,不得作为商业用途,欢迎转载,并请注明出处. 文章中涉及到的操作都是基于Unit ...

  4. GPGPU实时光线刻蚀模拟

    前言:Caustics光线刻蚀效果极大的影响着存在透明光学物体场景的真实性.光线在透明物体里发生衰减与二次折射,最终汇聚在一个小区域内,导致这个区域的能量比周围的光子密度高的多.比如一把放大镜将太阳光 ...

  5. 通用渲染管线(URP)_学习笔记

    通用渲染管道概述 通用渲染管线 (Universal Render Pipeline, URP) 是由Unity制作的预构建可编程渲染管线 (Scriptable Render Pipeline).U ...

  6. ugui unity 取消选择_Unity暑期萌新入门:环境篇

    大家好,新一期又跟大家见面了. 上一节我们完成了角色的移动控制,然而John只能在空白的场景中移动.因此接下来这一节我们将添加关卡.调节光照,让John来到阴森的鬼屋.然后设置NavMesh(导航网格 ...

  7. 【GPU精粹与Shader编程】(一) 全系列核心知识点总览

    系列文章前言 <GPU Gems>1~3 .<GPU Pro>1~7 以及<GEM Zen>组成的GPU精粹系列书籍,是游戏开发.计算机图形学和渲染领域的业界大牛们 ...

  8. KlayGE游戏引擎

    From KlayGE游戏引擎, post address http://www.klayge.org/about/features/转载请注明出处为KlayGE游戏引擎,本文地址为http://ww ...

  9. 游戏编程里面有哪些经典或者很酷的算法?

    光栅化 Bresenham's line algorithm [1]:经典的绘画直线算法,后来还可以稍作修改用于绘画圆弧[2],都不用三角函数或除数,只需用整数加法.减法和乘法. Perspectiv ...

最新文章

  1. PHP数组实际占用内存大小的分析
  2. 《编写高质量Python代码的59个有效方法》——第10条:尽量用enumerate取代range
  3. 获取有效工作日封装类(原创)
  4. 关于vs2012、tfs2012、windows server 2008r2一些记录
  5. python读txt文件报错UnicodeDecodeError: ‘gbk‘ codec can‘t decode
  6. 设计原则在设计模式的应用
  7. 5页面放大再正常显示_一加5/5TFlyme8 9.9.24 功能一览
  8. 详细解说STL string
  9. Python3.6 用Django连接MySQL
  10. =、:=、?=、+=
  11. Copula函数实战(Matlab)
  12. Java根据关键字在PDF/Word插入图片
  13. c语言里10h代表什么,bios 10h中断是什么意思啊?
  14. 4.1 心跳机制和垃圾回收机制
  15. 坐标系,坐标系转换,梯度计算
  16. SDUT F - 判断回文串
  17. python实现直播功能_Python实现直播推流效果
  18. 计讯物联二次供水水池泵站监测方案,从根本上保障居民饮用水安全
  19. 分布式系统以及分布式系统架构的优缺点
  20. 【日常Exception】第二十四回:nested exception is java.lang.NoClassDefFoundError: redis/clients/jedis/util/Pool

热门文章

  1. oracle+5秒钟一个间隔,ORACLE日期时间函数大全 (二)
  2. java向上和向下的区别_Java的向上和向下转型
  3. 基于深度学习的青菜病害区域图像语义分割与定位
  4. android design support library最新版,总结一下现在关于Design Support Library的几个博客...
  5. 浏览器访问sftp服务器_Mountain Duck for Mac(FTP服务器管理工具)v4.0.0.16698
  6. 斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
  7. 安装计算机主板应注意,组装计算机并仅更换主板时要注意的事项
  8. activiti jsp 流程设计器_「Activiti精品 悟纤出品」Activiti插件来助你一臂之力 - 第327篇...
  9. eureka自我保护时间_Eureka的自我保护机制
  10. html5游戏开发-零基础开发《圣诞老人送礼物》小游戏