清华大学DirectX游戏编程第6章(全20章)

时间:2026-01-17

清华大学DirectX游戏编程

清华大学DirectX游戏编程

2

第6章 光照主要目标: 学习Direct3D提供的光源以及这些光源 所发出的光的类型。 掌握定义光源的方法,以及光源如何作 用于受光照影响的物体表面。 学习如何使用数学方法来描述三角形表 面的方向,然后可以用于决定光线以哪 种角度作用于三角形上。

清华大学DirectX游戏编程

3

6.1 光 的 组 成的光照模型中, 在Direct3D的光照模型中,由光源发出的光 的光照模型中 主要有3种类型 种类型: 主要有 种类型:环境光(Ambient Light)——该类型的光将会被多个 表面反射,常用于照亮整个场景。 散射光(Diffuse Light)——该类型的光沿着特定方 向传播。 镜面光(Specular Light)——该类型的光也沿着特 定的方向传播,当遇到物体表面时将沿着特定的 方向进行反射,这样在一定的角度上就可以看到 一个高亮区域。

清华大学DirectX游戏编程

4

6.1 光 的 组 成镜面光比其他两种类型的光需要更多的计算,因此, 镜面光比其他两种类型的光需要更多的计算,因此, 中提供关闭镜面光的功能。 在Direct3D中提供关闭镜面光的功能。实际上,在默 中提供关闭镜面光的功能 实际上, 认状态下,镜面光是关闭的,要使镜面光起作用, 认状态下,镜面光是关闭的,要使镜面光起作用,需 要设置D3DRS_SPECULARENABLE渲染状态: 渲染状态: 要设置 渲染状态Device->SetRenderState(D3DRS_SPECULARENABLE, true);

每种类型的光都可以使用D3DCOLORVALUE结构 结构 每种类型的光都可以使用 来描述光的颜色, 或D3DXCOLOR来描述光的颜色,例如: 来描述光的颜色 例如:D3DXCOLOR redAmbient(1.0f, 0.0f, 0.0f, 1.0f); D3DXCOLOR blueDiffuse(0.0f, 0.0f, 1.0f, 1.0f); D3DXCOLOR whiteSpecular(1.0f, 1.0f, 1.0f, 1.0f);

清华大学DirectX游戏编程

5

6.2 材

材质被定义为物体表面对光的反射百分比。 材质被定义为物体表面对光的反射百分比。 在代码中,材质使用D3DMATERIAL9结构来 在代码中,材质使用 结构来 表示: 表示: typedef struct _D3DMATERIAL9 { D3DCOLORVALUE Diffuse, Ambient, Specular, Emissive; float Power; } D3DMATERIAL9;

清华大学DirectX游戏编程

6

6.2 材

观察下面的示例,假设想得到红球。 观察下面的示例,假设想得到红球。那么定义球的 材质只能反射红光,其他颜色的光应该被吸收: 材质只能反射红光,其他颜色的光应该被吸收:D3DMATERIAL9 red; ::ZeroMemory(&red, sizeof(red)); red.Diffuse = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Ambient = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Specular = D3DXCOLOR(1.0f, 0.0f, 0.0f, 1.0f); // red red.Emissive = D3DXCOLOR(0.0f, 0.0f, 0.0f, 1.0f); // no emission red.Power = 5.0f;

自己手动去设置材质结构是件烦人的事情, 自己手动去设置材质结构是件烦人的事情,因此在 d3dutility.h/cpp中定义了以下的实用函数和全局材质: 中定义了以下的实用函数和全局材质:

中定义了以下的实用函数和全局材质参见教材P97

清华大学DirectX游戏编程

7

6.2 材

IDirect3DDevice9::SetMaterial(CONST D3DMATERIAL9 *pMaterial)函数用于指定当 函数用于指定当 前材质。 前材质。 使用不同的材质来渲染物体的程序如下: 使用不同的材质来渲染物体的程序如下:D3DMATERIAL9 blueMaterial, redMaterial; ...// set up material structures Device->SetMaterial(&blueMaterial); drawSphere(); // blue sphere Device->SetMaterial(&redMaterial); drawSphere(); // red sphere

清华大学DirectX游戏编程

8

6.3 顶 点 法 线平面法线是用于描述多边形朝向的向量(见图 平面法线是用于描述多边形朝向的向量 见图 6.1)。 。 顶点法线和平面法线类似, 顶点法线和平面法线类似,但是不同之处在 于每一个多边形只有一个平面法线, 于每一个多边形只有一个平面法线,而多边形 的每个顶点都拥有一个顶点法线,如图6.2所示 所示。 的每个顶点都拥有一个顶点法线,如图 所示。

清华大学DirectX游戏编程

9

6.3 顶 点 法 线注意顶点法线不一定和平面法线相同。 注意顶点法线不一定和平面法线相同。球或者圆就 是一个很好的例子, 是一个很好的例子,在这两个物体上顶点法线和所在 三角形的法线不相同(见图 见图6.3)。 三角形的法线不相同 见图 。 要使顶点可以描述法线,必须更改顶点结构: 要使顶点可以描述法线,必须更改顶点结构:struct Vertex { float _x, _y, _z; float _nx, _ny, _nz; static const DWORD FVF; } const DWORD Vertex::FVF = D3DFVF_XYZ | D3DFVF_NORMAL;

清华大学DirectX游戏编程

10

6.3 顶 点 法 线下面是一个C函数, 下面是一个 函数,用于通过三角形的三个顶点来 函数 计算平面法线: 计算平面法线:void ComputeNormal(D3DXVECTOR3 *p0, D3DXVECTOR3 *p1, D3DXVECTOR3 *p2, D3DXVECTOR3 *out) { D3DXVECTOR3 u = *p1 - *p0; D3DXVECTOR3 v = *p2 - *p0; D3DXVec3Cross(out, &u, &v); D3DXVec3Normalize(out, out); }

清华大学DirectX游戏编程

11

6.4 光Direct3D支持三类光源。 支持三类光源。 支持三类光源

(1) 点光源。光源处于世界空间中,并且向各个 方向发射光线,如图6.4所示。 (2) 平行光。这种光源没有固定的位置,但却是 在一个特定的方向上射出平行的光线,如图6.5所 示。

清华大学DirectX游戏编程< …… 此处隐藏:2347字,全部文档内容请下载后查看。喜欢就下载吧 ……

清华大学DirectX游戏编程第6章(全20章).doc 将本文的Word文档下载到电脑

    精彩图片

    热门精选

    大家正在看

    × 游客快捷下载通道(下载后可以自由复制和排版)

    限时特价:4.9 元/份 原价:20元

    支付方式:

    开通VIP包月会员 特价:19元/月

    注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
    微信:fanwen365 QQ:370150219