在d3dUtility.h中添加了全局常用颜色常量。
const D3DXCOLOR WHITE(D3DCOLOR_XRGB(255, 255, 255));
const D3DXCOLOR BLACK(D3DCOLOR_XRGB(0, 0, 0));
const D3DXCOLOR RED(D3DCOLOR_XRGB(255, 0, 0));
const D3DXCOLOR GREEN(D3DCOLOR_XRGB(0, 255, 0));
const D3DXCOLOR BLUE(D3DCOLOR_XRGB(0, 0, 255));
const D3DXCOLOR YELLOW(D3DCOLOR_XRGB(255, 255, 0));
const D3DXCOLOR CYAN(D3DCOLOR_XRGB(0, 255, 255));//青蓝
const D3DXCOLOR MAGENTA(D3DCOLOR_XRGB(255,0,255));//品红
为减轻手动初始化材质结构,在d3dUtility.h/cpp中添加了初始化材质函数和一些常用的全局材质常量。
D3DMATERIAL9 InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e ,float p);
//常用材质
const D3DMATERIAL9 WHITE_MTRL = InitMtrl(WHITE, WHITE, WHITE, BLACK, 8.0f);
const D3DMATERIAL9 RED_MTRL = InitMtrl(RED, RED, RED, BLACK, 8.0f);
const D3DMATERIAL9 GREEN_MTRL = InitMtrl(GREEN, GREEN, GREEN,BLACK, 8.0f);
const D3DMATERIAL9 BLUE_MTRL = InitMtrl(BLUE, BLUE, BLUE, BLACK, 8.0f);
const D3DMATERIAL9 YELLOW_MTRL = InitMtrl(YELLOW, YELLOW, YELLOW, BLACK, 8.0f);
D3DMATERIAL9 d3d::InitMtrl(D3DXCOLOR a, D3DXCOLOR d, D3DXCOLOR s, D3DXCOLOR e, float p)
{
D3DMATERIAL9 mtrl;
mtrl.Ambient = a;//环境光的反射率
mtrl.Diffuse = d;//漫射光的反射率
mtrl.Emissive = e;//增强物体的亮度(黑色代表不增强)
mtrl.Power = p;//镜面高光点的锐度,值越大锐度越大
mtrl.Specular = s;//镜面光的反射率
return mtrl;
}
对于光源的初始化处理
方向光
创建一个方向确定,发射较强漫射光,中等的环境光,较弱的镜面光
D3DLIGHT9 d3d::InitDirectionLight(D3DXVECTOR3* direction, D3DXCOLOR* color)
{
D3DLIGHT9 light;
::ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_DIRECTIONAL;
light.Ambient = *color * 0.6f;
light.Diffuse = *color;
light.Specular = *color * 0.3f;
light.Direction = *direction;
return light;
}
点光源
中等的环境光和镜面光,较强的漫射光,起点,衰减系数确定的点光源,
D3DLIGHT9 d3d::InitPointLight(D3DXVECTOR3* position, D3DXCOLOR* color)
{
D3DLIGHT9 light;
::ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_POINT;
light.Ambient = *color * 0.6f;
light.Diffuse = *color;
light.Specular = *color * 0.6f;
light.Position = *position;
//衰减系数
light.Attenuation0 = 1.0f;
light.Attenuation1 = 0.0f;
light.Attenuation2 = 0.0f;
return light;
}
聚光灯
中等环境光与镜面光, 较强的漫射光,起点,延伸方向与距离,内锥形和外锥形的圆锥角,衰减系数确定
D3DLIGHT9 d3d::InitSpotLight(D3DXVECTOR3* position,D3DXVECTOR3* spot,D3DXCOLOR* color)
{
D3DLIGHT9 light;
::ZeroMemory(&light, sizeof(light));
light.Type = D3DLIGHT_SPOT;
light.Ambient = *color * 0.0f;
light.Diffuse = *color;
light.Specular = *color * 0.6f;
light.Direction = *spot;
light.Position = *position;
light.Falloff = 1.0f;
//衰减系数
light.Attenuation0 = 1.0f;
light.Attenuation1 = 0.0f;
light.Attenuation2 = 0.0f;
//内锥形圆锥角
light.Theta = 0.4f;
//外锥形圆锥角
light.Phi =0.9f;
return light;
}
在D3D中,需要知道顶点的法线向量,光照的入射角才能够确定,
为此我们需要求出每个顶点的法线向量,在三角形图元中,每个顶点的法线向量,我们可以看成其表面对应的面法向量
便可以通过三角形2边向量叉乘得到面法向量。(顺时针输入顶点可获得朝上的面法向量,逆时针则是反方向)
void ComputerNormal(D3DXVECTOR3*p0,D3DXVECTOR3*p1,D3DXVECTOR3*p2,D3DXVECTOR3*out){
D3DXVECTOR3 u = *p1-*p0;
D3DXVECTOR3 v = *p2-*p0;
D3DXVec3Cross(out,&u,&v);
D3DXVec3Normalize(out,out);
}
将所新建的点的位置信息以及法线信息存放到顶点缓存中。
(若只是中间的辅助顶点(不需要绘制出来的),可用数组保存即可)
D3DXVECTOR3 *m;
m = new D3DXVECTOR3[16];
m[0] = D3DXVECTOR3(-1.0f, 0.0f, -1.0f);
m[1] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[2] = D3DXVECTOR3(1.0f, 0.0f, -1.0f);
ComputerNormal(m, m + 1, m + 2, m + 3);
m[4] = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);
m[5] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[6] = D3DXVECTOR3(-1.0f, 0.0f, -1.0f);
ComputerNormal(m + 4, m + 5, m + 6, m + 7);
m[8] = D3DXVECTOR3(1.0f, 0.0f, -1.0f);
m[9] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[10] = D3DXVECTOR3(1.0f, 0.0f, 1.0f);
ComputerNormal(m + 8, m + 9, m + 10, m + 11);
m[12] = D3DXVECTOR3(1.0f, 0.0f, 1.0f);
m[13] = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
m[14] = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);
ComputerNormal(m + 12, m + 13, m + 14, m + 15);
Vertex* v;
Pyramid->Lock(0, 0, (void**)&v, 0);
// front face
v[0] = Vertex(m, m + 3);
v[1] = Vertex(m + 1, m + 3);
v[2] = Vertex(m + 2, m + 3);
// left face
v[3] = Vertex(m + 4, m + 7);
v[4] = Vertex(m + 5, m + 7);
v[5] = Vertex(m + 6, m + 7);
// right face
v[6] = Vertex(m + 8, m + 11);
v[7] = Vertex(m + 9, m + 11);
v[8] = Vertex(m + 10, m + 11);
// back face
v[9] = Vertex(m + 12, m + 15);
v[10] = Vertex(m + 13, m + 15);
v[11] = Vertex(m + 14, m + 15);
Pyramid->Unlock();
其余基本也跟其他的demo差别不是很多在这里就略过了