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!!!
==