D3D9 Samples(4)--Lights

本文介绍了D3D9教程第四部分——光照的基本原理和实现方法。通过创建一个带有光照效果的3D模型,详细讲解了如何设置材质属性和光照参数。包括漫反射、镜面反射等光照特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

 

 

D3D9 Sample(4)—Lights

 

 

        打开Tutorial 4: Lights项目,编译后运行,界面如下:

 

 

       我们看到一个旋转的圆管形,这个例子主要演示光照计算。绘制的每一帧都会设置光照和材质,类似上一个Sample设置矩阵,在固定管道中,只需填充一个数据结构,然后把结构传给D3D9,固定渲染管道会根据设置自动进行光照运算。如果使用了Shader,则下面的SetMaterialSetLight都会失效,需要自己在Shader代码中进行光照计算。

 

 

1. 创建模型

 

首先是建立一个几何体。我们看顶点的数据结构有所变化:

 

struct CUSTOMVERTEX
{
    D3DXVECTOR3 position;	// The 3D position for the vertex
    D3DXVECTOR3 normal;	// The surface normal for the vertex
};

#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)

定义了一个位置信息和法线信息,顶点不再需要颜色值,它的颜色由材质Material来管理。法线用于计算光照在顶点上产生的颜色值影响,从而模拟光照效果。

 

 

 

2. 设置材质

 

typedef struct _D3DMATERIAL9 {

    D3DCOLORVALUE   Diffuse;        /* Diffuse color RGBA */

    D3DCOLORVALUE   Ambient;        /* Ambient color RGB */

    D3DCOLORVALUE   Specular;       /* Specular 'shininess' */

    D3DCOLORVALUE   Emissive;       /* Emissive color RGB */

    float           Power;          /* Sharpness if specular highlight */

} D3DMATERIAL9;

 

物体材质的一种配置结构。

 

 

打开3ds Max可以直观的看到,第二、三个材质球明暗渐变的颜色称为漫反射色(Diffuse)。第一个材质球两个原点(几乎白色)的颜色就是镜面反射色Specular。而环境光色(Ambient)是为了场景有一定的亮度而设置的简单颜色,如果没有环境光,那么没有上述两种光照的点都是漆黑一片。自发光(Emissive)是为了模拟现实中很多自发光物体,如LED霓虹灯,它只是有自发光效果,并不照亮别的物体。

 

IDirect3DDevice9::SetMaterial

将材质的配置告知D3D9

 

 

 

3. 设置光照

 

typedef struct _D3DLIGHT9 {
    D3DLIGHTTYPE    Type;            /* Type of light source */
    D3DCOLORVALUE   Diffuse;         /* Diffuse color of light */
    D3DCOLORVALUE   Specular;        /* Specular color of light */
    D3DCOLORVALUE   Ambient;         /* Ambient color of light */
    D3DVECTOR       Position;         /* Position in world space */
    D3DVECTOR       Direction;        /* Direction in world space */
    float           Range;            /* Cutoff range */
    float           Falloff;          /* Falloff */
    float           Attenuation0;     /* Constant attenuation */
    float           Attenuation1;     /* Linear attenuation */
    float           Attenuation2;     /* Quadratic attenuation */
    float           Theta;            /* Inner angle of spotlight cone */
    float           Phi;              /* Outer angle of spotlight cone */
} D3DLIGHT9;

光照的配置结构。灯光大致分成电光源(Point Light)、平行光(Directional Light)和聚光灯(SpotLight)三种。

 

IDirect3DDevice9::SetLight

将灯光的配置告知D3D9

 

g_pd3dDevice->LightEnable( 0, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

后面还得让固定渲染管道开启光照运算。

 

 

 

 

参考资料

 

http://msdn.microsoft.com/en-us/library/windows/desktop/bb174694(v=vs.85).aspx

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值