2012-04-05 58 views
0

我有一個表面(OffScreenPlain或RenderTarget與D3DFMT_A8R8G8B8),我從第三方函數複製像素(ARGB)到,。在像素複製之前,位由LockRect訪問。D3D9阿爾法在表面上的混合

這個表面然後是StretchRect到Backbuffer這是(D3DFMT_A8R8G8B8)。 Surface和Backbuffer是不同的尺寸。過濾設置爲D3DTEXF_NONE。

剛剛創建D3D設備後,我設置以下繪製狀態設置

D3DRS_ALPHABLENDENABLE -> TRUE 
D3DRS_BLENDOP   -> D3DBLENDOP_ADD 
D3DRS_SRCBLEND   -> D3DBLEND_SRCALPHA 
D3DRS_DESTBLEND  -> D3DBLEND_INVSRCALPHA 

但我看不出有任何alpha混合發生。我已驗證alpha是以像素指定的。

我已經做了一個簡單的測試,通過創建一個頂點緩衝區和繪製一個三角形(DrawPrimitive)顯示與alpha混合。

在此測試表面中,先是StretchRect,然後是DrawPrimitive,並且表面內容顯示時不顯示alpha混合,而三角形顯示爲alpha混合。

我在這裏錯過了什麼?謝謝

回答

2

您提到的狀態隻影響頂點。爲了讓紋理混合正確,您需要指定紋理alpha如何與頂點混合。你這樣做是這樣的:

d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); 
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE); 

默認ALPHAOPSELECTARG1,即只有質地阿爾法在渲染考慮。

另一種解決方案是使用ID3DXSprite::Draw方法將紋理複製到後臺緩衝區。只要通過顏色D3DCOLOR_ARGB(X, 255, 255, 255)其中X是你的alpha。這種方法將執行所有狀態調整,最終結果將符合您的期望。