C++之(5)DirectX 9.0C 编程——Lighting类

LPDIRECT3DDEVICE9接口

IDirect3DDevice9 接口是通过调用 IDirect3D9::CreateDevice 方法获取的。

此接口与所有 COM 接口一样,继承 IUnknown 接口方法。

LPDIRECT3DDEVICE9和PDIRECT3DDEVICE9类型定义为 指向 IDirect3DDevice9 接口的指针。

程序源码

头文件

#include <vector>
#include <d3d9.h>
#include <d3dx9.h>

Lighting类声明

class Lighting {
private:
// 这是 Direct3D 设备的指针,用于执行所有的渲染操作。
    LPDIRECT3DDEVICE9 d3dDevice;
// vector, 存储多个光源的动态数组
//动态数组不需要在编译时就确定大小,它的大小在程序运行过程中确定。
//所以可以根据程序需要而灵活的分配数组的大小。
//相比静态数组,它更“灵活”、“自由”。但是动态数组需要进行显式的内存释放。
//详细解释:
//[详解-vector] C++必知必会 vector常用各种操作解析
    vector lights;  // 存储多个光源

public:
//有参构造函数,设置一个参数device
    Lighting(LPDIRECT3DDEVICE9 device);
//析构函数
    ~Lighting();

//初始化函数
    void Initialize();
//控制灯光的开关
    void EnableLighting(bool enable);
//创建点光源
    void CreatePointLight(D3DXVECTOR3 position, D3DXCOLOR color);
//创建平行光源
    void CreateDirectionalLight(D3DXVECTOR3 direction, D3DXCOLOR color);
//创建聚光灯光源
    void CreateSpotLight(D3DXVECTOR3 position, 
D3DXVECTOR3 direction, D3DXCOLOR color);
//设置环境光
    void SetAmbientLight(D3DXCOLOR color);
};

成员函数定义

//将参数device的值赋给d3dDevice
Lighting::Lighting(LPDIRECT3DDEVICE9 device) : d3dDevice(device) {}

Lighting::~Lighting() {
    // 清理代码,如果需要的话
}

//设置默认参数
void Lighting::Initialize() {
//开启灯光
    EnableLighting(true);
//设置环境光,RGBA
    SetAmbientLight(D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f));
}

void Lighting::EnableLighting(bool enable) {
//设置光照模式,用法见DirectX3D--SetRenderState函数详解
    d3dDevice->SetRenderState(D3DRS_LIGHTING, enable);
}

//Direct3D 9 光类型(配合着这个看)
//创建点光源,传入必要参数位置和颜色
void Lighting::CreatePointLight(D3DXVECTOR3 position, D3DXCOLOR color) {
//D3DLIGHT9 结构
    D3DLIGHT9 light;
//清空缓存区
    ZeroMemory(&light, sizeof(light));
    light.Type = D3DLIGHT_POINT;//设置光照类型为点光
    light.Diffuse = color;//设置颜色
    light.Position = position;//设置位置
    light.Range = 1000.0f;//设置光照范围,离开则无光
//公式为Atten = 1/( att0i + att1i * d + att2i * d²)
//其中d为光源到点的距离
//当att0和att2为0时,衰减强度为1/att1*D
    light.Attenuation0 = 0.0f;
    light.Attenuation1 = 0.125f;
    light.Attenuation2 = 0.0f;
//把light压进vector型的lights里,堆栈结构
    lights.push_back(light);
//lights.size()初始为0,进栈之后动态+1,减一之后为0作为第一个光源的编号
    d3dDevice->SetLight(lights.size() - 1, &light);
//设置0号光源Enable为true
    d3dDevice->LightEnable(lights.size() - 1, TRUE);
}

//创建平行光源
void Lighting::CreateDirectionalLight
(D3DXVECTOR3 direction, D3DXCOLOR color) {
    D3DLIGHT9 light;
    ZeroMemory(&light, sizeof(light));
//平行光样式
    light.Type = D3DLIGHT_DIRECTIONAL;
    light.Diffuse = color;
    light.Direction = direction;

    lights.push_back(light);
    d3dDevice->SetLight(lights.size() - 1, &light);
    d3dDevice->LightEnable(lights.size() - 1, TRUE);
}

//创建聚光灯源
void Lighting::CreateSpotLight(D3DXVECTOR3 position, 
D3DXVECTOR3 direction, D3DXCOLOR color) {
    D3DLIGHT9 light;
    ZeroMemory(&light, sizeof(light));
    light.Type = D3DLIGHT_SPOT;
    light.Diffuse = color;
    light.Position = position;
    light.Direction = direction;
//光照范围
    light.Range = 1000.0f;
    light.Theta = 0.5f;  // 内锥角
    light.Phi = 1.0f;    // 外锥角
//聚光的内锥 (Theta) 指定的角度和外锥 (Phi) 指定的角度之间的照明减少。
//落差对照明的影响很微妙。 此外,调整下降曲线会产生较小的性能损失。
//出于这些原因,大多数开发人员将此值设置为 1.0。
    light.Falloff = 1.0f;

    lights.push_back(light);
    d3dDevice->SetLight(lights.size() - 1, &light);
    d3dDevice->LightEnable(lights.size() - 1, TRUE);
}
//设置环境光
void Lighting::SetAmbientLight(D3DXCOLOR color) {
    d3dDevice->SetRenderState(D3DRS_AMBIENT, color);
}

如果这篇文章对您有所帮助,不妨打赏一下作者吧~

评论

  1. yolocoming
    Windows Edge
    2 月前
    2024-5-21 10:54:03

    太强辣!(ฅ´ω`ฅ)

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇