Как создать прозрачное растровое изображение в Direct2D

Мне нужно создать прозрачное растровое изображение с использованием 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, но безуспешно.

Есть ли решение?

4

Решение

Хорошие новости Ник: Вы создаете прозрачные растровые изображения, однако причина, по которой вы не видите ожидаемых результатов, связана с созданием окна. Кенни Керр продемонстрировал правильное создание многослойных окон с Direct2D еще в 2009 году здесь.

С тех пор многое изменилось в отношении рендеринга окон: Win8 и Win10 используют механизм компоновки и предоставляют разработчикам доступ к API-интерфейсу DirectComposition. В результате Кенни Керр предоставил обновленная статья в 2014 году по теме.

Мои недавние проекты требовали поддержки Win7, поэтому я лично придерживался чистого Direct2D.

РЕДАКТИРОВАТЬ: И, конечно же, убедитесь, что ваш цель рендера создана правильно. Надеюсь это поможет.

2

Другие решения

Вот что я делаю в 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() как не понятно что это делает с клипами и тд

-1

По вопросам рекламы [email protected]