2012-04-05 90 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。这种方法将执行所有状态调整,最终结果将符合您的期望。