- A+
所属分类:Windows游戏开发 原创文章
接着那上次使用的程序
删除顶点的颜色
我们要用灯光加物体自身的材质
来反馈颜色
顶点结构体变为
1 2 3 4 5 6 7 8 9 10 11 12 |
struct Vertex { Vertex(float x, float y, float z) { _x = x; _y = y; _z = z; } float _x, _y, _z; static const DWORD FVF = D3DFVF_XYZ | D3DFVF_NORMAL; }; |
可以看出顶点格式变为法线
但是我没有设置_nx,_ny,_nz
因为我也不知道这些顶点的法线...
也不怕,等等用Direct3D自带的
在现实世界中
当光线照射到物体上
物体会反射自己拥有的颜色
同理的,我们需要为物体设置材质,再设置灯光
在Game_Init中
初始化顶点信息
设置投影矩阵,视图矩阵,渲染模式后
打开灯光
1 2 |
//打开灯光 d3ddev->SetRenderState(D3DRS_LIGHTING, true); |
创建一个Direct3D的Cube网格
用于区别自定义没有法线的Cube
1 2 |
//创建一个Cube网格 D3DXCreateBox(d3ddev, 2, 2, 2, &cube, NULL); |
cube是一个为LPD3DXMESH的变量
设置材质
1 2 3 4 5 6 7 |
//设置材质 D3DMATERIAL9 mat; mat.Ambient = D3DXCOLOR(1,1,1,1); mat.Diffuse = D3DXCOLOR(1, 1, 1, 1); mat.Emissive = D3DXCOLOR(0, 0, 0, 1); mat.Power = 5; d3ddev->SetMaterial(&mat); |
12345678910111213 typedef struct D3DMATERIAL9 {D3DCOLORVALUE Diffuse;D3DCOLORVALUE Ambient;D3DCOLORVALUE Specular;D3DCOLORVALUE Emissive;float Power;} D3DMATERIAL9, *LPD3DMATERIAL9;*Diffuse 指定此表面反射的漫反射光数量*Ambient 指定此表面反射的环境光数量*Specular 指定此表面反射的镜面光数量*Emissive 指定此表面自发光*Power 高光的锐利值
设置灯光信息
1 2 3 4 5 6 7 8 9 10 11 |
//设置灯光 D3DLIGHT9 light; light.Type = D3DLIGHT_DIRECTIONAL; light.Ambient = D3DXCOLOR(0.6, 0.6,0.6 , 1); light.Diffuse = D3DXCOLOR(0.5, 0.5, 0.5, 1); light.Specular = D3DXCOLOR(0.3, 0.3,0.3, 1); light.Direction = D3DXVECTOR3(1.0F, 0, 0); d3ddev->SetLight(0, &light); d3ddev->LightEnable(0, true); d3ddev->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, true); |
123456789101112131415161718192021222324 typedef struct D3DLIGHT9 {D3DLIGHTTYPE Type;D3DCOLORVALUE Diffuse;D3DCOLORVALUE Specular;D3DCOLORVALUE Ambient;D3DVECTOR Position;D3DVECTOR Direction;float Range;float Falloff;float Attenuation0;float Attenuation1;float Attenuation2;float Theta;float Phi;} D3DLIGHT9, *LPD3DLIGHT;*Type 定义灯光类型 可以是D3DLIGHT_POINT,D3DLIGHT_SPOT,D3DLIGHT_DIRECTIONAL*Diffuse 漫反射的颜色*Specular 镜面反射的颜色*Amibient 环境光的颜色*Position 灯光位置*Direction 灯光方向,点光源无效*Rang 灯光传播的最大范围*Falloff 用于聚光灯,由内圆锥到外圆锥之间强度的衰减
开始绘制
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
d3ddev->Clear(0, 0, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0); d3ddev->BeginScene(); d3ddev->SetStreamSource(0, VB, 0, sizeof(Vertex)); d3ddev->SetIndices(VI); d3ddev->SetFVF(Vertex::FVF); D3DXMatrixTranslation(&Tx, -2.0, 0, 0); D3DXMATRIX r = Rx * Ry * Tx; d3ddev->SetTransform(D3DTS_WORLD, &r); d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 8, 0, 12); D3DXMatrixTranslation(&Tx, 2.0, 0, 0); r = Rx * Ry * Tx; d3ddev->SetTransform(D3DTS_WORLD, &r); cube->DrawSubset(0); d3ddev->EndScene(); d3ddev->Present(0, 0, 0, 0); |
代码跟以前都差不多
这里就不多说了
最后看看结果
可以看出第一个没有顶点法向量的
灯光效果已经乱了