如何在Direct2D中创建一个透明位图

5
我需要使用Direct2D创建一个透明位图,并通过使用我的设备上下文在其上绘制。
ID2D1DeviceContext1* d2dContext = ...
ID2D1Bitmap* pBitmap;

d2dContext->CreateBitmap(
    bitmapSize,
    nullptr,
    0,
    D2D1::BitmapProperties1(
        D2D1_BITMAP_OPTIONS_TARGET,
        D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED),
        dpiX, dpiY),
    &pBitmap);

d2dContext->BeginDraw();
d2dContext->SetTarget(pBitmap);
d2dContext->Clear(D2D1::ColorF(0, 0));
d2dContext->DrawLine(...);
hr = d2dContext->EndDraw();

很遗憾,我无法创建任何透明位图。我尝试了几种像素格式组合,包括D2D1_ALPHA_MODE_STRAIGHT,但没有成功。

有什么解决方案吗?


你如何知道图像不是透明的? - Nico Schertler
因为我是在创建位图之前绘制渲染目标的背景。只有在我在不清除渲染目标的情况下将这个新位图绘制在其他所有内容上面后,我才能看到这个新位图覆盖了下面的一切。 @NicoSchertler - Nick
那么可能与你绘制的方式有关。Alpha混合启用了吗?通常可以绘制透明位图吗? - Nico Schertler
@NicoSchertler 我使用ID2D1DeviceContext1DrawBitmap方法绘制位图I。步骤如下:1)我在目标上绘制几个形状;2)我将目标更改为使用alpha模式创建的位图;3)我在位图上绘制几个形状;4)我将目标更改回原始目标;5)我绘制位图。如何启用alpha混合?不,我不能一般地绘制透明位图(请具体说明)。 - Nick
我只知道在D3D中必须明确指定混合。不确定在D2D中是怎样的。DrawBitmap方法有一个不透明度参数。尝试减少不透明度并查看结果是否改变。 - Nico Schertler
2个回答

2

好消息 Nick:你正在创建透明的位图,然而你没有看到预期结果的原因与窗口创建有关。Kenny Kerr在2009年展示了正确的分层窗口创建,请点击这里

自那时以来,随着Win8和Win10使用组合引擎,并允许开发人员访问DirectComposition API,Windows渲染方面发生了很多变化。因此,Kenny Kerr在2014年提供了更新的文章

我的最近的项目需要支持Win7,所以我个人采用纯Direct2D。

编辑:当然要确保你的渲染目标被正确地创建。希望这可以帮助你。


0

当我需要创建缓存渲染(位图)时,这是我在Sciter中所做的:

ID2D1RenderTarget* src = ...
d2d::asset<ID2D1BitmapRenderTarget> dst = nullptr;

// creating temp surface - compatible render target:
src->CreateCompatibleRenderTarget(sz,dst.target());

dst->BeginDraw();
dst->Clear(init_color);

... drawing on that temp surface ...
dst->EndDraw();

d2d::asset<ID2D1Bitmap> dst_bmp;
hr = dst->GetBitmap(il->d2d_bmp.target());

return dst_bmp;

这个方法将位图的创建委托给ID2D1RenderTarget,因此该位图将始终与源兼容。该代码主要用于透明的init_color。

我不会使用SetTarget(),因为它对剪辑等内容的处理不够清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接