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...

相关文章推荐

Direct3D9.0流水管线详解图

  • 2013年01月15日 13:56
  • 903KB
  • 下载

Direct3D渲染管线

转载至  Direct3D渲染管线简介 渲染管线负责执行一系列必要的步骤从而把3D场景转换为可以在显示器上显示的2D图像。在Direct3D中,渲染管线的步骤大致如下: (1)局部坐标系到世界...
  • Boyhou
  • Boyhou
  • 2013年08月21日 22:10
  • 815

游戏开发Direct3D基础

  • 2009年03月08日 23:03
  • 1.32MB
  • 下载

Direct3D光照和材质

Direct3D光照和材质 问题1:现实世界中物体的颜色是怎样产生的 在现实世界中,我们所观察到的物体的颜色是由该物体所反射的光的颜色决定的。例如,一个纯红色的球反射了全部的红色入射光,并吸收了所...

【阅读笔记之三】《DIRECTX.9.0.3D游戏开发编程基础》:Direct3D初始化

Direct3D初始化   一、Direct3D初始化预备知识           1. 表面             表面是Direct3D主要用于存储2D图像数据的一个像素矩阵。其组成部分如...

DirectX 9.0c游戏开发手记之“龙书”第二版学习笔记之2: Chap4: Direct3D Initialization

从这一期开始,我们正式来研究“龙书”第二版的课后习题啦!这一次讲的是第4章的习题。可能有人会奇怪:为何从第4章开始呢?手头有书的同学大概没有这样的疑问,因为前面3章是讲述3D图形的数学知识的,基本上就...

用Direct3D设计二维横版过关动作类游戏的角色运动(双倍速、二段跳)

用Direct3D设计二维横版过关动作类游戏的角色运动 演示程序下载地址:http://download.csdn.net/detail/jiangcaiyang123/4278008 ...

【Visual C++】游戏开发笔记二十九 一步一步教你用优雅的Direct3D11代码画一个三角形

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7774929作者:毛星云    邮箱: hap...
  • zhmxy555
  • zhmxy555
  • 2012年07月23日 13:37
  • 28069

【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍

本系列文章由zhmxy555(毛星云)编写,转载请注明出处。http://blog.csdn.net/zhmxy555/article/details/7707628作者:毛星云    邮箱: hap...
  • zhmxy555
  • zhmxy555
  • 2012年07月02日 05:15
  • 28889
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3D游戏基础 Direct3D(五) 固定管线之"光"(1):光的分类与材质
举报原因:
原因补充:

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