青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

D3D中的Alpha顏色混合(1)

 

提示:

閱讀本文需要一定的3D圖形學和DirectX9基礎,如果你發現閱讀困難,請參閱D3D中的材質和光照處理
本文用到的坐標系統變換函數請參閱DirectX 9的坐標系統變換



渲染管道流水線通常需要將來自頂點的顏色,紋理像素的顏色,光照顏色以及物體表面材質反射光顏色進行混合,生成計算機屏幕的像素顏色。將多種顏色混合在一起,必須考慮各種顏色的成分比例,這個比例由Alpha因子決定。對于游戲開發來說,利用Alpha顏色混合可產生背景透明的渲染效果。

顏色混合原理

一般的,屏幕像素的當前顏色值SrcColor可與目標像素顏色值DestColor進行如下運算,然后將獲得的顏色值Color作為該像素的新顏色,以實現像素的目標顏色與源顏色的混合。

Color = SrcColor * SrcBlend + DestColor * DestBlend

這里,SrcBlend和DestBlend為源混合因子和目標混合因子,分別乘以源顏色和目標顏色。SrcColor ,SrcBlend , DestColor ,DestBlend都是一個4維向量,而乘法運算 * 則是一個一個向量點積運算。

假設4維向量SrcColor=(Rs, Gs, Bs, As),SrcBlend=(S1, S2, S3, S4), DestColor=(Rd, Gd, Bd, Ad),DestBlend(D1, D2, D3, D4),則混合顏色Color可用4維向量表示為:

Color = (Rs * S1 + Rd * D1, Gs * S2 + Gd * D2, Bs * S3 + Bd * D3, As * S4 + Ad * D4)

利用Direct3D設備接口提供的SetRenderState函數可將所要使用的混合因子設置給渲染管道流水線。此時,函數的第一個參數必須指定為D3DRS_SRCBLEND或D3DRS_DESTBLEND,分別表示設置源混合因子和目標混合因子,如下所示:
 
// IDirect3DDevice9* _d3d_device;

// set alpha blend for source color
 _d3d_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);

 
// set alpha blend for dest color
  _d3d_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

D3DBLEND_SRCALPHA和D3DBLEND_INVSRCALPHA均為DirectX預定義的混合因子宏,來看看具體定義:

Defines the supported blend mode.

typedef enum D3DBLEND
{
D3DBLEND_ZERO = 1,
D3DBLEND_ONE = 2,
D3DBLEND_SRCCOLOR = 3,
D3DBLEND_INVSRCCOLOR = 4,
D3DBLEND_SRCALPHA = 5,
D3DBLEND_INVSRCALPHA = 6,
D3DBLEND_DESTALPHA = 7,
D3DBLEND_INVDESTALPHA = 8,
D3DBLEND_DESTCOLOR = 9,
D3DBLEND_INVDESTCOLOR = 10,
D3DBLEND_SRCALPHASAT = 11,
D3DBLEND_BOTHSRCALPHA = 12,
D3DBLEND_BOTHINVSRCALPHA = 13,
D3DBLEND_BLENDFACTOR = 14,
D3DBLEND_INVBLENDFACTOR = 15,
D3DBLEND_FORCE_DWORD = 0x7fffffff,
} D3DBLEND, *LPD3DBLEND;

Constants

D3DBLEND_ZERO
Blend factor is (0, 0, 0, 0).
D3DBLEND_ONE
Blend factor is (1, 1, 1, 1).
D3DBLEND_SRCCOLOR
Blend factor is (Rs, Gs, Bs, As).
D3DBLEND_INVSRCCOLOR
Blend factor is (1 - Rs, 1 - Gs, 1 - Bs, 1 - As).
D3DBLEND_SRCALPHA
Blend factor is (As, As, As, As).
D3DBLEND_INVSRCALPHA
Blend factor is ( 1 - As, 1 - As, 1 - As, 1 - As).
D3DBLEND_DESTALPHA
Blend factor is (Ad Ad Ad Ad).
D3DBLEND_INVDESTALPHA
Blend factor is (1 - Ad 1 - Ad 1 - Ad 1 - Ad).
D3DBLEND_DESTCOLOR
Blend factor is (Rd, Gd, Bd, Ad).
D3DBLEND_INVDESTCOLOR
Blend factor is (1 - Rd, 1 - Gd, 1 - Bd, 1 - Ad).
D3DBLEND_SRCALPHASAT
Blend factor is (f, f, f, 1); where f = min(As, 1 - Ad).
D3DBLEND_BOTHSRCALPHA
Obsolete. Starting with DirectX 6, you can achieve the same effect by setting the source and destination blend factors to D3DBLEND_SRCALPHA and D3DBLEND_INVSRCALPHA in separate calls.
D3DBLEND_BOTHINVSRCALPHA
Source blend factor is (1 - As, 1 - As, 1 - As, 1 - As), and destination blend factor is (As, As, As, As); the destination blend selection is overridden. This blend mode is supported only for the D3DRS_SRCBLEND render state.
D3DBLEND_BLENDFACTOR
Constant color blending factor used by the frame-buffer blender. This blend mode is supported only if D3DPBLENDCAPS_BLENDFACTOR is set in the SrcBlendCaps or DestBlendCaps members of D3DCAPS9.
D3DBLEND_INVBLENDFACTOR
Inverted constant color-blending factor used by the frame-buffer blender. This blend mode is supported only if the D3DPBLENDCAPS_BLENDFACTOR bit is set in the SrcBlendCaps or DestBlendCaps members of D3DCAPS9.
D3DBLEND_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

Remarks

In the preceding member descriptions, the RGBA values of the source and destination are indicated by the s and d subscripts.

The values in this enumerated type are used by the following render states:

  • D3DRS_DESTBLEND
  • D3DRS_SRCBLEND
  • D3DRS_DESTBLENDALPHA
  • D3DRS_SRCBLENDALPHA

由于渲染管道流水線的默認Alpha顏色混合功能是禁用的,因此必須調用SetRenderState函數設置D3DRS_ALPHABLENDENABLE為true.
 
// enable alpha-blended transparency
_d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);

 

來看一個具體的例子:

需要在工程中設置鏈接d3dx9.lib d3d9.lib。
由于文件中用到了GE_APP這個類,它的具體使用說明請參閱 主窗口和DirectInput的封裝。


若發現代碼中存在錯誤,敬請指出。

源碼下載

來看看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[i], 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[i], 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;
}

//------------------------------------------------------------------------------------
// Set camera position.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Set_Camera()
{
    D3DXVECTOR3 eye(-6.0, 1.5, 10.0);
    D3DXVECTOR3 at(6.0, 2.0, 3.0);
    D3DXVECTOR3 up(0.0, 1.0, 0.0);

    D3DXMATRIX view_matrix;

    // Builds a left-handed, look-at matrix.
    D3DXMatrixLookAtLH(&view_matrix, &eye, &at, &up);

    // Sets d3d device view transformation state.
    _d3d_device->SetTransform(D3DTS_VIEW, &view_matrix);

    D3DXMATRIX proj_matrix;

    // Builds a left-handed perspective projection matrix based on a field of view.
    D3DXMatrixPerspectiveFovLH(&proj_matrix, D3DX_PI/2, WINDOW_WIDTH / WINDOW_HEIGHT, 1.0, 1000.0);
    
    // Sets d3d device projection transformation state.
    _d3d_device->SetTransform(D3DTS_PROJECTION, &proj_matrix);
    // enable automatic normalization of vertex normals
    _d3d_device->SetRenderState(D3DRS_NORMALIZENORMALS, true);
}

//------------------------------------------------------------------------------------
// Set point light.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Set_Point_Light()
{
    D3DLIGHT9 light;

    // clear memory with 0
    ZeroMemory(&light, sizeof(D3DLIGHT9));

    light.Type          = D3DLIGHT_POINT;

    light.Diffuse.r     = 1.0;
    light.Diffuse.g     = 0.0;
    light.Diffuse.b     = 0.0;

    light.Ambient.r     = 0.0;
    light.Ambient.g     = 1.0;
    light.Ambient.b     = 0.0;

    light.Specular.r    = 0.0;
    light.Specular.g    = 0.0;
    light.Specular.b    = 0.0;
    
    light.Position.x    = 5.0;
    light.Position.y    = 6.0;
    light.Position.z    = -20.0;

    light.Attenuation0  = 1.0;
    light.Attenuation1  = 0.0;
    light.Attenuation2  = 0.0;

    light.Range         = 1000.0;

    // Assigns point lighting properties for this device
    _d3d_device->SetLight(0, &light);
    // enable point light
    _d3d_device->LightEnable(0, TRUE);
    // enable light 
    _d3d_device->SetRenderState(D3DRS_LIGHTING, TRUE);
    // add ambient light
    _d3d_device->SetRenderState(D3DRS_AMBIENT, D3DCOLOR_XRGB(50, 50, 50));
}

//------------------------------------------------------------------------------------
// Sets the material properties for the device.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Set_Object_Material(D3DCOLORVALUE& dif, D3DCOLORVALUE& amb, D3DCOLORVALUE& spe, 
                                       D3DCOLORVALUE& emi, float power)
{
    D3DMATERIAL9 material;

    material.Diffuse  = dif;
    material.Ambient  = amb;
    material.Specular = spe;
    material.Emissive = emi;
    material.Power    = power;

    // Sets the material properties for the device.
    _d3d_device->SetMaterial(&material);
}

//------------------------------------------------------------------------------------
// Compute triangle normal.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Compute_Triangle_Normal(D3DXVECTOR3& v1, D3DXVECTOR3& v2, D3DXVECTOR3& v3, D3DVECTOR& normal)
{
    D3DXVECTOR3 vec1 = v1 - v2;
    D3DXVECTOR3 vec2 = v1 - v3;
    D3DXVECTOR3 normal_vec;

    D3DXVec3Cross(&normal_vec, &vec1, &vec2);
    D3DXVec3Normalize(&normal_vec, &normal_vec);

    normal = (D3DVECTOR) normal_vec;
}

//------------------------------------------------------------------------------------
// Draw cones.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Render()
{
    if(_d3d_device == NULL)
        return;

    // clear surface with black
    _d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0, 0);

    // begin scene
    _d3d_device->BeginScene();

    // 1) draw cone 1

    // Binds a vertex buffer to a device data stream.
    _d3d_device->SetStreamSource(0, _vertex_buffer1, 0, sizeof(CUSTOM_VERTEX));

    // Sets the current vertex stream declaration.
    _d3d_device->SetFVF(CUSTOM_VERTEX_FVF);

    // Renders a sequence of nonindexed, geometric primitives of the specified type from the current 
    // set of data input streams.
    _d3d_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

    // enable alpha-blended transparency
    _d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
    
    // set alpha blend for source cone
    _d3d_device->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
    // set alpha blend for dest cone
    _d3d_device->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

    // 2) draw cone 2

    // Binds a vertex buffer to a device data stream. 
    _d3d_device->SetStreamSource(0, _vertex_buffer2, 0, sizeof(CUSTOM_VERTEX));

    // Sets the current vertex stream declaration.
    _d3d_device->SetFVF(CUSTOM_VERTEX_FVF);

    // draw square
    _d3d_device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 4);

    // disable alpha blend for d3d device
    _d3d_device->SetRenderState(D3DRS_ALPHABLENDENABLE, false);

    // end scene
    _d3d_device->EndScene();

    // Presents the contents of the next buffer in the sequence of back buffers owned by the device.
    _d3d_device->Present(NULL, NULL, NULL, NULL);
}

//------------------------------------------------------------------------------------
// Release all COM object.
//------------------------------------------------------------------------------------
void ALPHA_BLEND::Release_COM_Object()
{
    Safe_Release(_vertex_buffer1);
    Safe_Release(_vertex_buffer2);
    Safe_Release(_d3d_device);
    Safe_Release(_d3d);
}

main.cpp的實現很簡單,它首先調用類ALPHA_BLEND的函數創建兩個三棱錐的頂點緩沖區,然后進行取景并設置材質光源,最后調用Render函數進行混色渲染。

 
/*************************************************************************************
 [Implement File]

 PURPOSE: 
    Test for alpha blending.
*************************************************************************************/


#define DIRECTINPUT_VERSION 0x0800

#include "GE_COMMON.h"
#include "GE_APP.h"
#include "AlphaBlend.h"

#pragma warning(disable : 4305 4996)

int WINAPI WinMain(HINSTANCE instance, HINSTANCE, LPSTR cmd_line, int cmd_show)
{
    GE_APP ge_app;
    ALPHA_BLEND alpha_blend;

    MSG msg = {0};

    
// create window
    if(! ge_app.Create_Window("Alpha blending test", instance, cmd_show))
        
return false;

    HWND hwnd = ge_app.Get_Window_Handle();    

    SetWindowPos(hwnd, 0, 0,0,0,0, SWP_NOSIZE);
    SetCursorPos(0, 0);
    
    
// Create direct3D interface and direct3D device.
    if(! alpha_blend.Create_D3D_Device(hwnd, false))
        
return false;

    
// Initialize cone 1 vertex buffer with curstom vertex structure.
    if(! alpha_blend.Init_Vertex_Buffer1())
        
return false;

    
// Initialize cone 2 vertex buffer with curstom vertex structure.
    if(! alpha_blend.Init_Vertex_Buffer2())
        
return false;
    
    
// Set camera position.
    alpha_blend.Set_Camera();

    D3DCOLORVALUE dif = {1.0f, 1.0f, 1.0f, 0.6f};
    D3DCOLORVALUE amb = {1.0f, 1.0f, 1.0f, 0.0f};
    D3DCOLORVALUE spe = {0.0f, 0.0f, 0.0f, 0.0f};
    D3DCOLORVALUE emi = {0.0f, 0.0f, 0.0f, 0.0f};

    
// Sets the material properties for the device.
    alpha_blend.Set_Object_Material(dif, amb, spe, emi, 0);

    
// Set point light.
    alpha_blend.Set_Point_Light();

    
// Draw all cones
    alpha_blend.Render();

    
while(msg.message != WM_QUIT)
    {
        
if(PeekMessage(&msg, NULL, 0,0 , PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }    

    UnregisterClass(WINDOW_CLASS_NAME, instance);

    
return true;
}
 

運行效果:



閱讀下篇:D3D中的Alpha顏色混合(2)

posted on 2007-05-15 00:54 lovedday 閱讀(4849) 評論(0)  編輯 收藏 引用

公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美日韩精品免费观看视频完整| 欧美精品导航| 国产一区二区在线观看免费| 亚洲男女自偷自拍| 亚洲午夜精品国产| 韩国成人福利片在线播放| 久久久免费av| 免费在线成人| 亚洲女性裸体视频| 久久精品视频免费观看| 亚洲欧洲精品一区| 亚洲一区二区欧美| 亚洲电影免费观看高清完整版| 亚洲高清久久久| 欧美日韩国产探花| 久久精视频免费在线久久完整在线看| 久久精品欧美| 99视频一区二区| 亚洲男人的天堂在线观看| 欲香欲色天天天综合和网| 亚洲巨乳在线| 国内精品久久久久影院色| 亚洲激情第一页| 国产日韩综合| 99re6这里只有精品| 韩国av一区二区| 夜夜嗨av色综合久久久综合网| 国产日韩欧美亚洲| 亚洲精品一区二区三区蜜桃久 | 午夜精品一区二区三区在线| 伊人狠狠色丁香综合尤物| 99精品视频免费全部在线| 激情国产一区| 亚洲自拍偷拍网址| 在线中文字幕一区| 久久综合伊人77777尤物| 亚洲自拍高清| 欧美日韩精品一二三区| 麻豆成人91精品二区三区| 欧美日韩蜜桃| 亚洲国产精品一区二区久| 国产一区二区三区久久| 亚洲视频电影图片偷拍一区| 亚洲精品一区在线观看| 久久久久久69| 久久精品国产在热久久| 国产精品美女www爽爽爽| 亚洲国产欧美国产综合一区| 亚洲国产成人av| 欧美中文字幕第一页| 性做久久久久久久久| 欧美性片在线观看| 亚洲毛片视频| 日韩视频在线观看免费| 免费欧美高清视频| 欧美a级片网| 在线观看视频免费一区二区三区| 欧美一区二区成人| 欧美专区一区二区三区| 国产精品在线看| 亚洲欧美日韩一区在线| 欧美在线在线| 国产在线精品自拍| 欧美一区二区视频网站| 久久免费视频在线| 亚洲大片av| 美女免费视频一区| 亚洲国产精品一区在线观看不卡 | 欧美午夜精品电影| 亚洲影院在线| 久久精品99国产精品酒店日本| 国产精品尤物福利片在线观看| 午夜精品久久久久久久男人的天堂| 午夜亚洲性色福利视频| 国产欧美一区二区三区在线看蜜臀| 亚洲综合日韩中文字幕v在线| 性欧美超级视频| 国产视频欧美视频| 久久综合成人精品亚洲另类欧美| 欧美国产日产韩国视频| 亚洲精品九九| 国产精品久在线观看| 欧美在线不卡视频| 欧美不卡激情三级在线观看| 亚洲精品五月天| 国产精品久久久久久久7电影 | 亚洲国产精品一区制服丝袜| 一区二区三区成人精品| 国产精品有限公司| 老巨人导航500精品| 99精品欧美一区二区蜜桃免费| 午夜精品一区二区三区在线| 韩国亚洲精品| 欧美精品一区二区三区久久久竹菊| 一区二区三区欧美激情| 久久久久国色av免费观看性色| 亚洲国产片色| 国产精品欧美在线| 美女主播视频一区| 亚洲欧美成人一区二区在线电影| 你懂的亚洲视频| 亚洲欧美日韩国产中文在线| 狠狠入ady亚洲精品| 欧美日韩hd| 久久人体大胆视频| 亚洲砖区区免费| 亚洲激情在线观看视频免费| 欧美一区2区三区4区公司二百| 亚洲第一视频网站| 国产日韩欧美一区二区三区在线观看 | 国产麻豆91精品| 欧美国产精品va在线观看| 亚洲欧美日韩另类精品一区二区三区| 欧美黄色一区| 久久久一二三| 亚洲欧美日韩国产一区二区| 亚洲日本电影| 伊人久久综合| 国产一区二区三区在线播放免费观看 | 亚洲丶国产丶欧美一区二区三区| 欧美在线综合| 午夜精品影院| 一区二区三区精品在线 | 国产精品美女久久久久av超清| 牛夜精品久久久久久久99黑人| 性久久久久久久久| 亚洲欧美成人一区二区在线电影 | 亚洲综合清纯丝袜自拍| 99视频热这里只有精品免费| 欧美福利视频一区| 免费亚洲网站| 另类综合日韩欧美亚洲| 久久久精品国产一区二区三区| 午夜日韩在线观看| 午夜国产不卡在线观看视频| 一区二区激情| 亚洲一级影院| 亚洲天堂av综合网| 一区二区三区精品久久久| 亚洲精品欧美一区二区三区| 亚洲国产欧美一区| 亚洲国产成人精品视频| ●精品国产综合乱码久久久久| 国内精品国语自产拍在线观看| 国产欧美一区二区精品忘忧草| 国产精品视频精品视频| 国产日韩欧美91| 国产一区再线| 亚洲国产综合91精品麻豆| 亚洲欧洲日产国产综合网| 亚洲日本成人| 一本色道久久88精品综合| 一本色道久久99精品综合| 亚洲一区二区久久| 久久成人免费视频| 麻豆9191精品国产| 91久久精品一区| 亚洲性夜色噜噜噜7777| 新狼窝色av性久久久久久| 久久精品午夜| 欧美成黄导航| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 欧美日本韩国在线| 国产精品高潮呻吟视频| 国产日韩av在线播放| 精品成人国产| 99精品热6080yy久久| 亚洲女性裸体视频| 美日韩丰满少妇在线观看| 91久久视频| 欧美影院在线播放| 欧美国产综合视频| 国产精品一区二区你懂得| 国外成人性视频| 99国内精品久久久久久久软件| 欧美一区二区高清| 亚洲高清毛片| 欧美亚洲一区| 欧美日韩精品一区二区三区四区| 国产乱码精品一区二区三区忘忧草 | 欧美成年人网| 国产精品永久入口久久久| 亚洲欧洲一区二区在线观看| 亚洲欧美综合另类中字| 欧美大片在线影院| 亚洲一区中文| 欧美国产一区视频在线观看| 国产一区二区三区的电影 | 伊人久久av导航| 香蕉久久夜色精品国产使用方法| 蜜臀久久99精品久久久久久9| 夜夜精品视频一区二区| 美女久久网站| 国内精品福利| 欧美在线黄色| 亚洲精品免费网站| 嫩草影视亚洲| 韩国福利一区| 欧美在线在线| 亚洲欧美文学|