我有一个表面(OffScreenPlain或RenderTarget with D3DFMT_A8R8G8B8),我将像素(ARGB)复制到第三方函数。在像素复制之前,Bits由LockRect访问。
然后,这个表面是StretchRect到Backbuffer,它是(D3DFMT_A8R8G8B8)。 Surface和Backbuffer是不同的尺寸。过滤设置为D3DTEXF_NONE。
创建d3d设备后,我设置了以下RenderState设置
D3DRS_ALPHABLENDENABLE -> TRUE
D3DRS_BLENDOP -> D3DBLENDOP_ADD
D3DRS_SRCBLEND -> D3DBLEND_SRCALPHA
D3DRS_DESTBLEND -> D3DBLEND_INVSRCALPHA
但我发现没有发生alpha混合。我已经验证了alpha是以像素为单位指定的。
我做了一个简单的测试,创建了一个顶点缓冲区并绘制了一个三角形(DrawPrimitive),它显示了alpha混合。
在此测试表面中首先是StretchRect然后是DrawPrimitive,表面内容显示时没有alpha混合,三角形显示alpha混合。
我在这里缺少什么?感谢
答案 0 :(得分:2)
您提到的状态仅影响顶点。为了正确混合纹理,您需要指定纹理alpha与顶点的混合方式。你这样做:
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);
默认ALPHAOP
为SELECTARG1
,即在渲染时仅考虑纹理alpha。
另一种解决方案是使用ID3DXSprite::Draw
方法将纹理复制到后台缓冲区。只需传递颜色D3DCOLOR_ARGB(X, 255, 255, 255)
,其中X是你的alpha。此方法将执行所有状态调整,最终结果将符合您的期望。