3D游戏基础 Direct3D(五) 固定管线之"光"(1):光的分类与材质

原创 2007年09月21日 00:44:00

 

书接上回,说完了绘制(其实绘制说的很简略,有空再补上吧),现在就该聊一聊光照了。

因为光照比前面的绘制有趣些,所以就多说几句吧。:)

在D3D中(当然,OpenGL也如此),光被分成三种类型:

环境光(Ambient),漫射光(Diffuse),镜面光(Specular),这三种光可以同时混合使用,也可使用其中某一种或几种光。值得注意的是,镜面光在默认情况下是不会被D3D计算的,只有你将相应的绘制状态设置为true之后,才会做镜面光计算 device->SetRenderState(D3DRS_SPECULARENABLE, true) 。之所以在默认情况下,镜面光是关闭的,因为这种光涉及的计算量相当庞大,不太适合于实时渲染,所以通常是关闭的。

环境光:顾名思义,就是在环境中的光线,它是一个平行光(就像太阳光),来自某个方向,射向物体表面,形成明暗差别。这种方式的计算量较小,但拟真度不高,所以在低拟真度高实时性限制下,可以凑合着用。

漫射光:这种光来自某个光源,然后到达物体表面后,被均匀的漫反射开,所以,这就导致不管观察者从哪个角度看,物体所反射的亮度都差不多。也正是这个特性,帮我们大大简化了漫反射计算方程。当然,要注意的是,因为漫反射会均匀反射光线,所以,这种光用多了之后,会导致物体的立体感降低。

镜面光:显然,这种光的特性就是像镜子一样,将光按照规定的法线反射出去。比如,有些物体在某一点上会特别的亮,这就是镜面光使然。

上面说到的3种光,其实都是需要作用在物体表面才能被大家感知的。不同的物体表面特性,就会产生不同强度的 环境光分量,漫射光分量和镜面光分量(如果开启镜面光的话)。描述这种表面特性的参数 就叫 材质(material)。

D3D对 material定义如下:

typedef struct D3DMATERIAL9{

D3DCOLORVALUE Diffuse;

D3DCOLORVALUE Ambient;

D3DCOLORVALUE Specular;

D3DCOLORVALUE Emissive;

float Power;

} D3DMATERIAL9

大家可以发现,一个材质变量,包含了环境光、漫反射、镜面光这3个分量的反射强度描述。采用COLOR表示,也就是说,可以分别描述三个光分量对 R、G、B的反射特性。D3D会根据这些值来分别计算反射出来的光的强度和颜色。

除了3个光分量外,还有一个Emissive量,这个量描述了物体的自发光强度,就是说如果物体本身在发光,那么,就可以对Emissive进行设定,分别设定R、G、B强度。

最后一个成员,Power,它定义了高光点的锐度,值越大,锐度越大。

例子:

比如,我们想要一个物体,它只漫反射红光,镜面反射绿光,反射的环境光为蓝色,就可以设定为:

D3DMATERIAL9 color_obj;

color_obj.Diffuse = D3DXCOLOR(0.5, 0.0f, 0.0f, 0.0f); //RGBA

color_obj.Ambient = D3DXCOLOR(0.0f, 0.0f, 1.0f, 0.0f);

color_obj.Specular = D3DXCOLOR(0.0f, 1.0f, 0.0f, 0.0f);

上面就描述了一个材质,漫反射光只反射50%的红色,而蓝色和绿色被完全吸收(就是不反射);环境反射光对绿色100%反射,对红色和蓝色完全吸收......以此类推。

因此,当我们用蓝色光源照射只反射红色光的材质时,该物体将会是黑色,因为蓝色被完全吸收了。

 

To be continued...

D3D基础 – 光照,材质与着色

初接触d3d时,相信许多初学者和我一样,虽然对3D实时渲染的原理有所了解,但是却对整体的管线结构有所困惑,包括可能许多做3d游戏的程序员,由于常常采用封装好的引擎做上层逻辑开发,因此对底层的架构也未必...
  • wudijunjun
  • wudijunjun
  • 2011年05月14日 19:08
  • 4922

奥比中光3D传感摄像头Ubuntu系统安装ROS说明

奥比中光3D传感摄像头ROS系统应用
  • suijideren
  • suijideren
  • 2017年03月08日 17:15
  • 512

游戏开发-橙光游戏背景素材

点击缩略图可以查看详细和打包下载。 秋之回忆2背景有图片270张 图片尺寸为: 640×480 秋之回忆2背景素材下载(19M) ...
  • luju5
  • luju5
  • 2013年12月02日 16:07
  • 2966

橙光古风背景素材下载

《蒼天の彼方》,共87张图片 - 背景游戏素材 查看全部素材图片和下载请直接点击: 蒼天の彼方游戏素材下载 《王宫夜想曲》,共45张图片 - 背景游戏素材 ...
  • luju5
  • luju5
  • 2013年11月27日 17:54
  • 7164

【计算机视觉】结构光——格雷码模式捕获教程1 (代码)

格雷码是一种具有反射特性和循环特性的单步自补码,其循环和单步特性消除了随机取数时出现重大错误的可能,其反射和自补特性使得对其进行求反操作也非常方便,所以,格雷码属于一种可靠性编码,是一种错误最小化的编...
  • KYJL888
  • KYJL888
  • 2017年07月03日 16:14
  • 1067

机器视觉学习系列一:线结构光三维测量重建

项目背景: 项目用于工业零件的公差检测,主要是针对缝隙和高低差两种公差,具体应用领域如汽车、飞机的蒙皮对接检测,当然,对于别的公差改变一些代码,也是可以做到的; 技术方案: 采用线结构光进行三维...
  • opencv123456
  • opencv123456
  • 2015年06月27日 22:00
  • 8856

光之继承者完全攻略

一:武器出招   1:刺 B   2:连踢 连续按B   3:重斩 按住B不放,松开   4:连刺 主角方向 前+前+前+B  ...
  • flameaeon
  • flameaeon
  • 2006年02月07日 20:03
  • 1911

自制的结构光三维扫描系统

原理:PhaseShift计算相位(相位周期不确定); 再用GrayCode消除周期不确定性; 最后,用左右图的相位map进行立体匹配,得到亚像素级的视差图。 该方法投影仪不需要几何标定。...
  • xuyuhua1985
  • xuyuhua1985
  • 2015年07月15日 22:29
  • 5092

UnityShader实例03:边缘光材质

边缘光材质 边缘光材质原理和xray材质相类似,shader代码也就长得几乎一样了,一般游戏中做一些角色的背光效果,或者宝石材质(如下图所示),总之看怎么灵活运用了。 shader代码实现...
  • u011047171
  • u011047171
  • 2015年06月19日 11:51
  • 3458

光之继承者隐藏物品

秘诀:   观看成绩等级排行榜:   标题画面时同时按START和B键即可   绝招:   重斩:按住B键不放,然后松开   前冲重斩:按前、前快跑后,按B键   直冲斩:连按同一方向三次后,按B键 ...
  • flameaeon
  • flameaeon
  • 2006年02月07日 20:05
  • 2969
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3D游戏基础 Direct3D(五) 固定管线之"光"(1):光的分类与材质
举报原因:
原因补充:

(最多只允许输入30个字)