Alpha 混合(三)Texture alpha


Texture alpha

前兩篇分別學習了Vertex alpha和Material alpha,今天來研究一下Texture alpha,所謂Texture alpha就是使用Texture的alpha通道進行混合,這需要texture包含alpha通道。所以首先要為texture添加alpha通道。

為texture添加alpha通道

使用DirectX texture tool添加

一般的圖片格式都是不包含alpha通道的,使用DX的texture tool可以為texture添加alpha通道,這實際上是做一次格式轉換,沒有alpha通道的texture格式一般是R8G8B8格式,轉換后的格式就是A8R8G8B8或者R8B8G8A8格式,這里A表示alpha值。

用texture tool打開圖片后,可以看到圖片的當前格式,如下圖,可知當前格式為X8R8G8B8,不包含alpha通道。

在菜單中選擇Format-Change surface format,在下拉列表中選擇A8R8G8B8,這樣就為texture添加了alpha通道,只是通道還是空的,沒有alpha值。

找一張alpha通道的圖片,比如下面這張,這張圖片的顏色不是為了顯示,而是用來控制顏色的透明程度,在這里黑色表示完全不透明,白色表示完全透明,由黑到白透明度逐漸增加,下面這張圖片混合后的效果就是一個圓形的紋理。

在texture tool的菜單上選擇File - Open on to alpha channel of this surface並選擇上面的圖片。這樣就將這個圖片作為alpha channel加入了前一個圖片中,效果如下。

混合

下面的代碼使用texture的alpha控制texture的顏色,第一行啟用alpha混合,第五六行設置顏色值的來源,這里指定來源為texture,第九十行設置alpha值的來源,這里指定來源為texture,因為我們使用的就是texture的alpha通道,最后三行設置混合因子及混合操作。

 1 // Enable alpha blending
 2 g_pd3dDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
 3 
 4 // Set color source and operation, color from texture
 5 g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
 6 g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
 7 
 8 //Set alpha source and operation, alpha from texture alpha channel
 9 g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
10 g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);
11 
12 // Set blend factor and blend operation
13 g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
14 g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
15 g_pd3dDevice->SetRenderState(D3DRS_BLENDOP,   D3DBLENDOP_ADD);

效果圖

如果想同時使用頂點的顏色和紋理的顏色,那么可以將定點定義為如下格式。

struct Vertex
{
    float x, y, z ; // Vertex position
    DWORD color;    // Vertex color
    float u, v ;    // Texture coordinates
};

#define VertexFVF D3DFVF_XYZ | D3DFVF_TEX1 | D3DFVF_DIFFUSE

然后定義是個頂點用來繪制Quad

Vertex Quad[] = 
{
    {-5.0f,  5.0f, 0, g_Color,    0,    0},    // 1
    { 5.0f,  5.0f, 0, g_Color, 1.0f,    0},    // 2
    {-5.0f, -5.0f, 0, g_Color,    0, 1.0f},    // 4
    { 5.0f, -5.0f, 0, g_Color, 1.0f, 1.0f},    // 3
} ;

混合的時候,在設置顏色來源時,將Arg1設置為紋理,Arg2設置為頂點顏色,操作設置為Modulate。alpha值的來源仍然設置為texture alpha channel。

// Set color source and operation, color from texture
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);

//Set alpha source and operation, alpha from texture alpha channel
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
g_pd3dDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_SELECTARG1);

// Set blend factor and blend operation
g_pd3dDevice->SetRenderState(D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
g_pd3dDevice->SetRenderState(D3DRS_BLENDOP,      D3DBLENDOP_ADD);

效果圖,這里我們設置頂點的diffse color為藍色,所以最終的結果就是藍色加上紋理的顏色。

Happy Coding!!!

==


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM