0

我有一个表面(OffScreenPlain 或带有 D3DFMT_A8R8G8B8 的 RenderTarget),我将像素 (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 混合。

我在这里想念什么?谢谢

4

1 回答 1

2

您提到的状态仅影响顶点。为了正确混合纹理,您需要指定纹理 alpha 如何与顶点混合。你这样做:

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

默认ALPHAOPSELECTARG1,即在渲染中仅考虑纹理 alpha。

另一种解决方案是使用ID3DXSprite::Draw将纹理复制到后台缓冲区的方法。只需D3DCOLOR_ARGB(X, 255, 255, 255)在 X 是您的 alpha 的地方传递颜色。此方法将进行所有状态调整,最终结果将符合您的期望。

于 2012-04-06T08:44:06.900 回答