http://www.cs.virginia.edu/~gfx/courses/2004/Intro.Fall.04/handouts/06-light.pdf
光照贴图(Lightmapping)与辐照度(Radiosity)
2008-05-23 08:44:13| 分类: 遊戲程序製作|字号 订阅
作者: 龚静
日期: 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相关推荐
- GRE Subject Test Computer Science (GRE Sub CS) 考试经验
刚考完 Sub CS ,虽然考得不怎么样,但是在准备过程中总结了一些经验,由于每年考 Sub 的人非常少, Sub CS 资料又非常稀缺,所以把我个人的经验写出来,希望对后人有用. 考试报名 GRE ...
- 计算机科学CS学科分类
体系结构.编译器和并行计算 Architecture, Compilers and Parallel Computing 系统与网络 Systems and Networking 理论与算法 Theo ...
- cs python课程 加州大学_B站的CS课程整理 搬运
计算机系统基础:CMU 15-213 av24540152 操作系统原理:伯克利 CS162 av17833855 数据库原理:CMU 15-445 av39731185 计算机网络:斯坦福 CS14 ...
- 微型计算机computer,《微型计算机》(Micro Computer)更新至2004增刊2004年24期
<微型计算机>(Micro Computer)更新至2004增刊2004年24期 來源:互聯網 2009-05-13 01:52:47 評論 中文名: 微型计算机 英文名: Micro ...
- 如何收集和整理论文(面向CS专业)
论文(Paper)是每个研究生读研路上挥之不去的"阴云". 无论是否已经有了一个好的课题或想法,都首先要收集某个研究方向一定数量的论文,来了解相关的工作和最新进展(State ...
- 机器视觉开源处理库汇总
从cvchina搞到的机器视觉开源处理库汇总,转来了,很给力,还在不断更新... 通用库/General Library OpenCV 无需多言. RAVL Recognition And Visio ...
- 图像处理与计算机视觉资源汇总——论文+代码+教材+视频等等
历时一个多月,终于用业余时间把这些资料整理出来了,总算了却了一块心病,也不至于再看着一堆资料发愁了.以后可能会有些小修小补,但不会有太大的变化了.万里长征走完了第一步,剩下的就是理解和消化了.借新浪i ...
- 计算机视觉与模式识别方面的代码code
UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhuang1/www/resources/vision/in ...
- 计算机视觉和模式识别的code
[转]计算机视觉和模式识别的code UIUC的Jia-Bin Huang同学收集了很多计算机视觉方面的代码,链接如下: https://netfiles.uiuc.edu/jbhuang1/w ...
最新文章
- Android Studio导入Eclipse项目的两种方法
- 前后台使用ajax传list的时候,用value[] 获取值
- 脑机接口需要我们掌握什么样的知识?
- 【ThinkPHP3.2.3】学习ThinkPHP笔记:框架中的配置文件(3)
- 应用内评分_游戏评分低,怎么办?
- php计算时间顺延3分,PHP关于strtotime函数的大坑
- C++原子操作 atomic的使用及效率
- Orleans 知多少 | 3. Hello Orleans
- 程序员年入50万,我们该如何努力达到这个目标?
- python每日一题今天的答案_python每日一题总结1
- 数据库-MySQL-数据库和表
- js/jQuery中的宽高
- C++11实现模板手柄:委托构造函数、defaultkeyword分析
- codeforces 558 D Guess Your Way Out! II
- 怎样选择合适的电流继电器
- 嵌入式软件项目流程、项目启动说明书(示例)
- 用递归实现阶乘计算器
- 创业型公司,你要不要去?
- 【Flutter】Dart 数据类型 数字类型 ( Dart 文件创建 | num 类型 | int 类型 | double 类型 | num 相关 API )
- 谷歌浏览器访问抖音网页版白屏
热门文章
- 登录页面html代码菜鸟,CSS+html登录界面(菜鸟学前端)
- 百度坐标转gps坐标_论文推荐 | 明锋:GPS坐标时间序列分析研究
- 主观下线和客观下线的情况
- Tree Rotations HYSBZ - 2212
- 匿名科创--X2212版到手飞套件介绍
- 后台管理界面--管理页设计
- 解决Intellij编译Scala编译报错问题
- 计算机无法ghost安装系统安装系统安装,如何解决我的电脑装不上GHOST系统 惠普电脑安装不了ghost系统文件的解决方法...
- linux查看通道的命令,10个Linux新手必须记住的Linux基本命令,快速入门通道!!...
- cocos2dx-标签:Label的使用