本篇是
創建游戲內核(6)的續篇,其中涉及到的材質知識請參閱
D3D
中的材質和光照處理。
材質和MATERIAL
通過改變繪制表面的顏色值,就可以改變渲染對象的外觀,MATERIAL類可以使改變材質顏色值變得更容易一些。
來看看MATERIAL類的定義:
//================================================================================
// Defines for class MATERIAL.
//================================================================================
class MATERIAL
{
protected:
D3DMATERIAL9 _material;
public:
MATERIAL();
D3DMATERIAL9* Get_Material();
void Set_Diffuse_Color(unsigned char red, unsigned char green, unsigned char blue);
void Get_Diffuse_Color(unsigned char* red, unsigned char* green, unsigned char* blue);
void Set_Ambient_Color(unsigned char red, unsigned char green, unsigned char blue);
void Get_Ambient_Color(unsigned char* red, unsigned char* green, unsigned char* blue);
void Set_Specular_Color(unsigned char red, unsigned char green, unsigned char blue);
void Get_Specular_Color(unsigned char* red, unsigned char* green, unsigned char* blue);
void Set_Emissive_Color(unsigned char red, unsigned char green, unsigned char blue);
void Get_Emissive_Color(unsigned char* red, unsigned char* green, unsigned char* blue);
void Set_Power(float power);
float Get_Power();
};
接著是類MATERIAL的實現:
//-------------------------------------------------------------------
// Constructor, set a default material (white).
//-------------------------------------------------------------------
MATERIAL::MATERIAL()
{
ZeroMemory(&_material, sizeof(D3DMATERIAL9));
Set_Diffuse_Color(255, 255, 255);
Set_Ambient_Color(255, 255, 255);
Set_Specular_Color(255, 255, 255);
Set_Emissive_Color(255, 255, 255);
Set_Power(1.0f);
}
//-------------------------------------------------------------------
// Set diffuse color.
//-------------------------------------------------------------------
void MATERIAL::Set_Diffuse_Color(unsigned char red, unsigned char green, unsigned char blue)
{
_material.Diffuse.r = red / 255.0f;
_material.Diffuse.g = green / 255.0f;
_material.Diffuse.b = blue / 255.0f;
}
//-------------------------------------------------------------------
// Get diffuse color.
//-------------------------------------------------------------------
void MATERIAL::Get_Diffuse_Color(unsigned char* red, unsigned char* green, unsigned char* blue)
{
if(red != NULL)
*red = (unsigned char)(255.0 * _material.Diffuse.r);
if(green != NULL)
*green = (unsigned char)(255.0 * _material.Diffuse.g);
if(blue != NULL)
*blue = (unsigned char)(255.0 * _material.Diffuse.b);
}
//-------------------------------------------------------------------
// Set ambient color.
//-------------------------------------------------------------------
void MATERIAL::Set_Ambient_Color(unsigned char red, unsigned char green, unsigned char blue)
{
_material.Ambient.r = red / 255.0f;
_material.Ambient.g = green / 255.0f;
_material.Ambient.b = blue / 255.0f;
}
//-------------------------------------------------------------------
// Get ambient color.
//-------------------------------------------------------------------
void MATERIAL::Get_Ambient_Color(unsigned char *red, unsigned char *green, unsigned char *blue)
{
if(red != NULL)
*red = (unsigned char)(255.0f * _material.Ambient.r);
if(green != NULL)
*green = (unsigned char)(255.0f * _material.Ambient.g);
if(blue != NULL)
*blue = (unsigned char)(255.0f * _material.Ambient.b);
}
//-------------------------------------------------------------------
// Set specular color.
//-------------------------------------------------------------------
void MATERIAL::Set_Specular_Color(unsigned char red, unsigned char green, unsigned char blue)
{
_material.Specular.r = red / 255.0f;
_material.Specular.g = green / 255.0f;
_material.Specular.b = blue / 255.0f;
}
//-------------------------------------------------------------------
// Get specular color.
//-------------------------------------------------------------------
void MATERIAL::Get_Specular_Color(unsigned char* red, unsigned char* green, unsigned char* blue)
{
if(red != NULL)
*red = (unsigned char)(255.0 * _material.Specular.r);
if(green != NULL)
*green = (unsigned char)(255.0 * _material.Specular.g);
if(blue != NULL)
*blue = (unsigned char)(255.0 * _material.Specular.b);
}
//-------------------------------------------------------------------
// Set emissive color.
//-------------------------------------------------------------------
void MATERIAL::Set_Emissive_Color(unsigned char red, unsigned char green, unsigned char blue)
{
_material.Emissive.r = red / 255.0f;
_material.Emissive.g = green / 255.0f;
_material.Emissive.b = blue / 255.0f;
}
//-------------------------------------------------------------------
// Get emmisive color.
//-------------------------------------------------------------------
void MATERIAL::Get_Emissive_Color(unsigned char *red, unsigned char *green, unsigned char *blue)
{
if(red != NULL)
*red = (unsigned char)(255.0 * _material.Emissive.r);
if(green != NULL)
*green = (unsigned char)(255.0 * _material.Emissive.g);
if(blue != NULL)
*blue = (unsigned char)(255.0 * _material.Emissive.b);
}
//-------------------------------------------------------------------
// Set power for material, which specifying the sharpness of specular
// highlights.
//-------------------------------------------------------------------
void MATERIAL::Set_Power(float power)
{
_material.Power = power;
}
//-------------------------------------------------------------------
// Get power for material, which specifying the sharpness of specular
// highlights.
//-------------------------------------------------------------------
float MATERIAL::Get_Power()
{
return _material.Power;
}
//-------------------------------------------------------------------
// Get material.
//-------------------------------------------------------------------
D3DMATERIAL9* MATERIAL::Get_Material()
{
return &_material;
}
MATERIAL類保存了一個D3DMATERIAL9結構體,還提供了能夠設置和取得各種顏色分量的函數。要設置一個顏色分量,指定一個0 -
255之間的數字即可。要取得一個顏色分量,給適當的函數提供一個unsigned char類型的指針即可。