源码下载 来看看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; } |