本文最后更新于96 天前,其中的信息可能已经过时,请自行注意文章有效性。
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); }
太强辣!(ฅ´ω`ฅ)