| 
 源码下载 来看看AlphaBlend.h的定义: /************************************************************************************* [Include File] PURPOSE:      Define for alpha blend. *************************************************************************************/ #ifndef ALPHA_BLEND_H #define ALPHA_BLEND_H struct CUSTOM_VERTEX {     float x, y, z;     float nx, ny, nz; }; #define CUSTOM_VERTEX_FVF   (D3DFVF_XYZ | D3DFVF_NORMAL) class ALPHA_BLEND { private:     IDirect3D9* _d3d;     IDirect3DDevice9* _d3d_device;     IDirect3DVertexBuffer9* _vertex_buffer1;     IDirect3DVertexBuffer9* _vertex_buffer2; public:     ALPHA_BLEND();     ~ALPHA_BLEND();     bool Create_D3D_Device(HWND hwnd, bool full_screen = true);     bool Init_Vertex_Buffer1();     bool Init_Vertex_Buffer2();     void Compute_Triangle_Normal(D3DXVECTOR3& v1, D3DXVECTOR3& v2, D3DXVECTOR3& v3, D3DVECTOR& normal);     void Set_Camera();     void Set_Point_Light();     void Set_Object_Material(D3DCOLORVALUE& dif, D3DCOLORVALUE& amb, D3DCOLORVALUE& spe,                               D3DCOLORVALUE& emi, float power);     void Render();     void Release_COM_Object(); }; #endif 以上的头文件定义了两个三棱锥的顶点格式和顶点结构体,函数Init_Vertex_Buffer1个Init_Vertex_Buffer2分别用来装入这两个三棱锥的顶点数据,Render函数则设置了渲染管道流水线的 Alpha颜色混合状态值。 再来看看AlphaBlend.cpp的定义: /************************************************************************************* [Implement File] PURPOSE:      Define for alpha blend. *************************************************************************************/ #include "GE_COMMON.h" #include "AlphaBlend.h" //------------------------------------------------------------------------------------ // Constructor, initialize all pointer with NULL. //------------------------------------------------------------------------------------ ALPHA_BLEND::ALPHA_BLEND() {     _d3d            = NULL;     _d3d_device     = NULL;     _vertex_buffer1 = NULL;     _vertex_buffer2 = NULL; } //------------------------------------------------------------------------------------ // Destructor, release all COM object. //------------------------------------------------------------------------------------ ALPHA_BLEND::~ALPHA_BLEND() {     Release_COM_Object(); } //------------------------------------------------------------------------------------ // Create direct3D interface and direct3D device. //------------------------------------------------------------------------------------ bool ALPHA_BLEND::Create_D3D_Device(HWND hwnd, bool full_screen) {     // Create a IDirect3D9 object and returns an interace to it.     _d3d = Direct3DCreate9(D3D_SDK_VERSION);     if(_d3d == NULL)         return false;     // retrieve adapter capability     D3DCAPS9 d3d_caps;         _d3d->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3d_caps); 
		     bool hardware_process_enable = (d3d_caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT ? true : false);     // Retrieves the current display mode of the adapter.     D3DDISPLAYMODE display_mode;     if(FAILED(_d3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode)))         return false;     // set present parameter for direct3D device     D3DPRESENT_PARAMETERS present_param;     ZeroMemory(&present_param, sizeof(present_param));     present_param.BackBufferWidth      = WINDOW_WIDTH;     present_param.BackBufferHeight     = WINDOW_HEIGHT;     present_param.BackBufferFormat     = display_mode.Format;     present_param.BackBufferCount      = 1;     present_param.hDeviceWindow        = hwnd;     present_param.Windowed             = !full_screen;     present_param.SwapEffect           = D3DSWAPEFFECT_FLIP;     present_param.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;     // Creates a device to represent the display adapter.     DWORD behavior_flags;     behavior_flags = hardware_process_enable ? D3DCREATE_HARDWARE_VERTEXPROCESSING : D3DCREATE_SOFTWARE_VERTEXPROCESSING;     if(FAILED(_d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, behavior_flags,                                   &present_param, &_d3d_device)))     {         return false;     } 
		     // create successfully     return true; } //------------------------------------------------------------------------------------ // Initialize vertex buffer for cone. //------------------------------------------------------------------------------------ bool ALPHA_BLEND::Init_Vertex_Buffer1() {     CUSTOM_VERTEX custom_vertex[12]; 
		     D3DXVECTOR3 v[] =      {         D3DXVECTOR3(5.0f, 6.0f, 5.0f),    // left triangle         D3DXVECTOR3(6.0f, 0.0f, 3.0f),         D3DXVECTOR3(1.0f, 0.0f, 7.0f),          D3DXVECTOR3(5.0f, 6.0f, 5.0f),    // right triangle         D3DXVECTOR3(10.0f, 0.0f, 8.0f),         D3DXVECTOR3(6.0f, 0.0f, 3.0f),          D3DXVECTOR3(5.0f, 6.0f, 5.0f),    // back triangle         D3DXVECTOR3(1.0f, 0.0f, 7.0f),         D3DXVECTOR3(10.0f, 0.0f, 8.0f),         D3DXVECTOR3(1.0f, 0.0f, 7.0f),    // bottom triangle         D3DXVECTOR3(6.0f, 0.0f, 3.0f),         D3DXVECTOR3(10.0f, 0.0f, 8.0f)           };     D3DVECTOR normal;     // compute all triangle normal     for(int i = 0; i < 12; i += 3)     {         // compute current triangle's normal         Compute_Triangle_Normal(v, v[i+1], v[i+2], normal);         // assign current vertex coordinate and current triangle normal to custom vertex array         for(int j = 0; j < 3; j++)         {             int k = i + j;             custom_vertex[k].x = v[k].x;             custom_vertex[k].y = v[k].y;             custom_vertex[k].z = v[k].z;             custom_vertex[k].nx = normal.x;             custom_vertex[k].ny = normal.y;             custom_vertex[k].nz = normal.z;         }     }     BYTE* vertex_data;     // create vertex buffer     if(FAILED(_d3d_device->CreateVertexBuffer(12 * sizeof(CUSTOM_VERTEX), 0, CUSTOM_VERTEX_FVF,                             D3DPOOL_DEFAULT, &_vertex_buffer1, NULL)))     {         return false;     }     // get data pointer to vertex buffer     if(FAILED(_vertex_buffer1->Lock(0, 0, (void **) &vertex_data, 0)))         return false;     // copy custom vertex data into vertex buffer     memcpy(vertex_data, custom_vertex, sizeof(custom_vertex));     // unlock vertex buffer     _vertex_buffer1->Unlock();     return true; } //------------------------------------------------------------------------------------ // Initialize vertex buffer for cone. //------------------------------------------------------------------------------------ bool ALPHA_BLEND::Init_Vertex_Buffer2() {     CUSTOM_VERTEX custom_vertex[12];     float add = 1.3f; 
		     D3DXVECTOR3 v[] =      {         D3DXVECTOR3(5.0f + add, 6.0f + add, 5.0f + add),    // left triangle         D3DXVECTOR3(6.0f + add, 0.0f + add, 3.0f + add),         D3DXVECTOR3(1.0f + add, 0.0f + add, 7.0f + add),          D3DXVECTOR3(5.0f + add, 6.0f + add, 5.0f + add),    // right triangle         D3DXVECTOR3(10.0f + add, 0.0f + add, 8.0f + add),         D3DXVECTOR3(6.0f + add, 0.0f + add, 3.0f + add),          D3DXVECTOR3(5.0f + add, 6.0f + add, 5.0f + add),    // back triangle         D3DXVECTOR3(1.0f + add, 0.0f + add, 7.0f + add),         D3DXVECTOR3(10.0f + add, 0.0f + add, 8.0f + add),         D3DXVECTOR3(1.0f + add, 0.0f + add, 7.0f + add),    // bottom triangle         D3DXVECTOR3(6.0f + add, 0.0f + add, 3.0f + add),         D3DXVECTOR3(10.0f + add, 0.0f + add, 8.0f + add)           };     D3DVECTOR normal;     // compute all triangle normal     for(int i = 0; i < 12; i += 3)     {         // compute current triangle's normal         Compute_Triangle_Normal(v, v[i+1], v[i+2], normal);         // assign current vertex coordinate and current triangle normal to custom vertex array         for(int j = 0; j < 3; j++)         {             int k = i + j;             custom_vertex[k].x = v[k].x;             custom_vertex[k].y = v[k].y;             custom_vertex[k].z = v[k].z;             custom_vertex[k].nx = normal.x;             custom_vertex[k].ny = normal.y;             custom_vertex[k].nz = normal.z;         }     }     BYTE* vertex_data;     // create vertex buffer     if(FAILED(_d3d_device->CreateVertexBuffer(12 * sizeof(CUSTOM_VERTEX), 0, CUSTOM_VERTEX_FVF,                             D3DPOOL_DEFAULT, &_vertex_buffer2, NULL)))     {         return false;     }     // get data pointer to vertex buffer     if(FAILED(_vertex_buffer2->Lock(0, 0, (void **) &vertex_data, 0)))         return false;     // copy custom vertex data into vertex buffer     memcpy(vertex_data, custom_vertex, sizeof(custom_vertex));     // unlock vertex buffer     _vertex_buffer2->Unlock();     return true; }  |