Direct3D 10教程6:光照
2014-04-25 15:01
246 查看
概览
在前面的教程中,因为所有物体都是以相同的方式被光照亮,因此还不够真实。本教程将介绍简单的光照概念以及如何施加光照,这个技术将使用Lambert光照模型。这个教程的会在前一个示例的基础上包含一个光源,光源链接在轨道运行的立方体上,光照的效果可以在中央立方体表面上看到。
![](http://shiba.hpe.sh.cn/jiaoyanzu/wuli/soft/directX/DirectXSDK/6_0.png)
源代码
(SDK root)\Samples\C++\Direct3D10\Tutorials\Tutorial06光照
在本教程中将介绍最简单的光照类型:Lambert光照。Lambert光照具有相同的光照强度而不考虑离开光源的距离。当光照射到表面时,反射光的强度根据光在表面上的入射角大小进行计算。当光线垂直射向表面,反射回所有光照,具有最大的光强。当入射角变大时,光的强度也会减弱。要计算表面的光照强度,必须计算光照方向和表面法线之间的夹角。法线定义为垂直于平面的一个矢量,角度的计算只需使用一个简单的点乘即可,返回的结果是光照方向矢量在法线上的投影长度。入射角越大,投影长度越短,这样,我们就有一个正确的方法调整漫反射光照。
![](http://shiba.hpe.sh.cn/jiaoyanzu/wuli/soft/directX/DirectXSDK/6_1.png)
本教程使用的光源接近于单向光,表示光源的矢量决定了光线的方向。因为这是一个近似,所以物体的位置无关紧要,我们认为光照方向都是一样的。这种光源的一个例子就是太阳,在一个场景中,太阳光总是被认为是同一方向的。
另一种类型的光源是点光源,从光源中心发出光线;还有一种是聚光灯,它发出的光线具有方向性但又不是均匀照射所有物体。
初始化光照
在本教程中,我们使用两个光源。一个静止放置在立方体的上后方,另一个绕着它旋转。因为光照是由shader进行计算的,所以必须首先声明变量然后将它们与technique绑定。在本例中,我们只需光照方向和颜色值。第一个光源为灰色不移动,第二个是一个沿轨道绕行的红色光源。
在像素着色器中绘制光照
设置了所有数据我们就可以计算每一个像素的lambert光照因子了,使用的是上面提到过的点乘规则。有了点乘结果后,就可以将这个结果乘以光照颜色计算光照的影响了。这个值被传递到saturate方法,这个方法将结果限定在[0, 1]区间。最后,两个光源的效果会相加获得最终的像素颜色。
物体表面材质并没有考虑在光照计算中,表面的最终颜色只包含光照颜色。
相关文章推荐
- Direct3D 10教程8:DXUT介绍
- Direct3D 10教程9:DXUT中的网格
- Direct3D 10教程4:3D空间
- DirectX 10 教程6:漫反射光照
- Direct3D 10教程5:3D变换
- Direct3D 10教程0:Win32编程基础
- Direct3D 10教程7:纹理映射和常量缓存
- Direct3D 10教程3:Shaders和Effect系统
- Direct3D 9学习笔记(10)网格(Mesh)1
- makefile教程(10)
- 10+ 最佳的 Node.js 教程和实例
- WebLogic10安装和配置(图文教程)
- vb.net 教程 5-10 Graphics类 4
- VMware 10 安装Mac OS X 教程
- VMware Workstation 10 简体中文安装图文教程
- Direct3D轮回:基于HLSL实现D3D中的光照特效
- net教程:定制水晶报表10的工具条
- VSCommand 10 for Visual Studio 2010 Professional 免费破解教程+使用教程
- RHCA教程:RHS333-10 httpd高级配置
- Android OpenGL ES 开发教程(10):绘制线段Line Segment