Я хочу портировать программное обеспечение для рендеринга фильмов с DirectDraw на Direct2D.Из-за проблем с совместимостью рендеринг GDI должен выполняться поверх изображения.Чтобы оптимизировать производительность, я хочу реализовать некоторый механизм резервного буфера, но, похоже, существует проблема с информацией об альфа-канале: весь рисунок GDI выглядит каким-то прозрачным .
Я создаю ID2D1HwndRenderTarget для моего дескриптора окна и ID2D1Bitmap для копирования изображений в.Пиксельный формат растрового изображения: DXGI_FORMAT_B8G8R8A8_UNORM , альфа-режим: D2D1_ALPHA_MODE_IGNORE .HwdRenderTarget совместим с GDI, поэтому моя функция рендеринга выглядит примерно так:
HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.GetDC(dc);
... do GDI drawing here ...
HwdRenderTarget.ReleaseDC();
HwdRenderTarget.EndDraw;
Эта версия прекрасно работает: объекты GDI рисуют сплошными цветами, DrawTextEx-Text имеет прозрачный фон.
Чтобы оптимизировать производительность, я хочу сделать чертеж GDI в «резервном буфере», так что это нужно делать только тогда, когда что-то меняется.В противном случае я просто могу отобразить кэшированное растровое изображение.Растровое изображение пустое и прозрачное, поэтому должны отображаться только нарисованные объекты.
Поэтому я создаю CompatibleRenderTarget ID2D1BitmapRenderTarget , альфа-режим равен D2D1_ALPHA_MODE_PREMULTIPLIED :
HwdRenderTarget.CreateCompatibleRenderTarget(nil, nil, nil, D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, CompatibleRenderTarget);
Теперь я выполняю рендеринг GDI в CompatibleRenderTarget:
CompatibleRenderTarget.BeginDraw;
if Supports(CompatibleRenderTarget, ID2D1GdiInteropRenderTarget, GdiInteropRenderTarget) then
begin
GdiInteropRenderTarget.GetDC(D2D1_DC_INITIALIZE_MODE_CLEAR, dc);
... do GDI drawing here ...
GdiInteropRenderTarget.ReleaseDC(fDstSize);
end;
GdiInteropRenderTarget := nil;
CompatibleRenderTarget.EndDraw;
CompatibleRenderTarget.GetBitmap(BackBuffer); // save the bitmap for drawing
, и теперь моя функция рендеринга выглядит следующим образом:
HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.DrawBitmap(BackBuffer);
HwdRenderTarget.EndDraw;
Теперь проблема в том, что все рисунки GDI являются прозрачными , а степень прозрачности зависит от значений пикселей основного изображения.Темный текст выглядит темным на темном фоне изображения, но становится белым на белом фоне.Но альфа-канал не используется в GDI, и myBitmap также не имеет альфа-информации.
Так откуда берется альфа-информация?У кого-нибудь есть идея?Заранее спасибо!
Кстати, использование Direct2D-рисования на CompatibleRenderTarget также работает нормально.