光照贴图(Lightmapping)与辐照度(Radiosity)

2008-05-23 08:44:13|  分类: 遊戲程序製作|字号 订阅

光照贴图(Lightmapping)与辐照度(Radiosity)

作者: 龚静

日期: 2006-8-22

 

 

对于一个3D场景光照是加强真实感的重要因素, 目前来说大概可以分为静态光照和动态光照.在这里我们主要讨论的是静态光照. 静态光照的好处很多, 比如: 渲染速度快, 效果好, 可以逐象素的计算光照和阴影.缺点就是光照的效果是静态的, 并且其需要一定的预处理时间. 我把这篇文章分为两部分, 上部分为计算光照贴图, 下部分为计算辐照度.

 

首先我们来看上半部分,也就是如何计算光照贴图, 这里有一篇文章讲的很清楚,大家可以去看.http://www.flipcode.com/articles/article_lightmapping.shtml.具体的算法我就不细说了.

 

其大概可以分为以下几个步骤:

1.       生成光照贴图的UV坐标. 这本身就是一个很复杂的问题, 但实际上我们可以跳过这个问题, 我们可以用3dsmax来展UV, 这是一个手工活, 虽然加大了一些工作量,但是它可以保证贴图的利用率, 并且不用写一行代码.

2.       我们需要根据光照贴图的所有有效的象素的UV坐标, 得到其在世界空间的坐标.这个算法在上面的文章里有, 但并不是很完整, 在我的源码(LightMapping.cpp)里大家可以看到这个算法的完整实现.

3.       为每个有效象素计算光照, 这个可以参照Direct3D里的光照公式. 至于阴影, 我用的是射线追踪, 从光源对目的点引一条直线判断其是否被遮挡, 如果是则其为阴影, 否则其为计算出来的光照值.

4.       填充无效的象素. 由于我们对光照贴图的采样方式为线性采样(D3DTEXF_LINEAR), 因此其会读取到周围8个邻居象素的值, 因此我们把所有效象素的8个邻居的象素值做一下线性采样, 这样最后就不会出现黑边.

5.       柔化光照贴图, 因为上面计算出来的光照图会产生很硬的边, 如果对其做一下线性采样, 这样就不会太硬.最后就是渲染出来啦.

 

下面是计算光照图后的效果图:

下面是经过柔化的效果图:

 

我们看上面的场景, 大家会发现除了受光照的地方其它地方都太黑, 一般来说我们可以给它加上环境光来解决这个问题, 但是其带来的结果就是颜色太平, 因为所有黑的地方都是一个颜色, 而真实世界不可能是这个样子, 对于真实世界中不仅仅只有光源能发光, 每一个表面都能散射光, 对于上面的场景被照亮的区域再向周围散射光能, 这样一次次进行下去直到每整个屋子都被照亮,这就是这篇文章的下部分: 辐照度.

 

关于辐照度这里也有一篇文章供大家参考: http://freespace.virgin.net/hugo.elias/radiosity/radiosity.htm. 具的算法我也不细说了,.其太致的思想就是, 把场景的的表面分为一个个小patch, 而对于我们来说这个小patch对应的就是光照图的一个象素. 然后把眼睛放到这个小patch上, 在从这个patch表面的法向方向观看场景. 这个过程我们可以通过D3D9的ID3DXRenderToEnvMap这个接口的BeginHemiSphere来实现,.它可以把场景渲染到一个半球体上.(这里我有一个疑惑, BeginHemiSphere

这个函数是接收两个参数,  第一个为: IDirect3DTexture9* pTexZPos,

第二个为: IDirect3DTexture9* pTexZNeg.

但最后我渲出的前半球的场景在pTexZNeg内里?).

 

因为越面向法向的象素其接收的光能应该越大, 并且要修正投影变换带来的负面影响, 我们需要把渲染出来的场景图乘上光能衰减图来纠正最后的结果.最后, 我们把场景图的颜色值加起来并归一化, 这就是这个象素的接收的辐射光能, 把它加上原来的颜色值就可以了, 当然这个辐射过程可能需要很多次才能达到比较好的效果.

 

关于这个算法它有一个缺点就是太慢, 我要根据上面那篇介绍辐射度的文章介绍的方法对其进行了优化, 具体的可以参考原文和我的源码.

 

对上面场景应用了12次辐射后的效果图如下:

对上面场景应用了16次辐射后的效果图如下:

如果大家有更好的想法或者什么疑惑可以给我发邮件. godmangj@126.com .

该文章的源代码:  radiosity_src.rar. (需要DXSDK_Feb_2006, 工程项目为Visual Studio.Net 2003)

动行程序:        radiosity_bin.rar

注意: 以上代码仅供大家个人学习或研究使用, 未经允许不能用于商业用途.

http://www.cs.virginia.edu/~gfx/courses/2004/Intro.Fall.04/handouts/06-light.pdf相关推荐

  1. GRE Subject Test Computer Science (GRE Sub CS) 考试经验

    刚考完 Sub CS ,虽然考得不怎么样,但是在准备过程中总结了一些经验,由于每年考 Sub 的人非常少, Sub CS 资料又非常稀缺,所以把我个人的经验写出来,希望对后人有用. 考试报名 GRE ...

  2. 计算机科学CS学科分类

    体系结构.编译器和并行计算 Architecture, Compilers and Parallel Computing 系统与网络 Systems and Networking 理论与算法 Theo ...

  3. cs python课程 加州大学_B站的CS课程整理 搬运

    计算机系统基础:CMU 15-213 av24540152 操作系统原理:伯克利 CS162 av17833855 数据库原理:CMU 15-445 av39731185 计算机网络:斯坦福 CS14 ...

  4. 微型计算机computer,《微型计算机》(Micro Computer)更新至2004增刊2004年24期

    <微型计算机>(Micro Computer)更新至2004增刊2004年24期 來源:互聯網  2009-05-13 01:52:47  評論 中文名: 微型计算机 英文名: Micro ...

  5. 如何收集和整理论文(面向CS专业)

     论文(Paper)是每个研究生读研路上挥之不去的"阴云". 无论是否已经有了一个好的课题或想法,都首先要收集某个研究方向一定数量的论文,来了解相关的工作和最新进展(State ...

  6. 机器视觉开源处理库汇总

    从cvchina搞到的机器视觉开源处理库汇总,转来了,很给力,还在不断更新... 通用库/General Library OpenCV 无需多言. RAVL Recognition And Visio ...

  7. 图像处理与计算机视觉资源汇总——论文+代码+教材+视频等等

    历时一个多月,终于用业余时间把这些资料整理出来了,总算了却了一块心病,也不至于再看着一堆资料发愁了.以后可能会有些小修小补,但不会有太大的变化了.万里长征走完了第一步,剩下的就是理解和消化了.借新浪i ...

  8. 计算机视觉与模式识别方面的代码code

    UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhuang1/www/resources/vision/in ...

  9. 计算机视觉和模式识别的code

     [转]计算机视觉和模式识别的code UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhuang1/w ...

最新文章

  1. Android Studio导入Eclipse项目的两种方法
  2. 前后台使用ajax传list的时候,用value[] 获取值
  3. 脑机接口需要我们掌握什么样的知识?
  4. 【ThinkPHP3.2.3】学习ThinkPHP笔记:框架中的配置文件(3)
  5. 应用内评分_游戏评分低,怎么办?
  6. php计算时间顺延3分,PHP关于strtotime函数的大坑
  7. C++原子操作 atomic的使用及效率
  8. Orleans 知多少 | 3. Hello Orleans
  9. 程序员年入50万,我们该如何努力达到这个目标?
  10. python每日一题今天的答案_python每日一题总结1
  11. 数据库-MySQL-数据库和表
  12. js/jQuery中的宽高
  13. C++11实现模板手柄:委托构造函数、defaultkeyword分析
  14. codeforces 558 D Guess Your Way Out! II
  15. 怎样选择合适的电流继电器
  16. 嵌入式软件项目流程、项目启动说明书(示例)
  17. 用递归实现阶乘计算器
  18. 创业型公司,你要不要去?
  19. 【Flutter】Dart 数据类型 数字类型 ( Dart 文件创建 | num 类型 | int 类型 | double 类型 | num 相关 API )
  20. 谷歌浏览器访问抖音网页版白屏

热门文章

  1. 登录页面html代码菜鸟,CSS+html登录界面(菜鸟学前端)
  2. 百度坐标转gps坐标_论文推荐 | 明锋:GPS坐标时间序列分析研究
  3. 主观下线和客观下线的情况
  4. Tree Rotations HYSBZ - 2212
  5. 匿名科创--X2212版到手飞套件介绍
  6. 后台管理界面--管理页设计
  7. 解决Intellij编译Scala编译报错问题
  8. 计算机无法ghost安装系统安装系统安装,如何解决我的电脑装不上GHOST系统 惠普电脑安装不了ghost系统文件的解决方法...
  9. linux查看通道的命令,10个Linux新手必须记住的Linux基本命令,快速入门通道!!...
  10. cocos2dx-标签:Label的使用