映画レンダリングソフトウェアをDirectDrawからDirect2Dに移植します。互換性の問題のため、GDIレンダリングはイメージの上で実行する必要があります。パフォーマンスを最適化するために、ある種のバックバッファメカニズムを実装したいのですが、アルファチャネル情報に問題があるようです。GDIのすべての描画が何とか透明に表示されます。direct2DへのGDIレンダリングID2D1BitmapRenderTargetは常に透明です
私は私のウィンドウハンドル用ID2D1HwndRenderTargetを作成して、とに画像をコピーするID2D1Bitmap。ビットマップのピクセル形式はDXGI_FORMAT_B8G8R8A8_UNORM、アルファモードはD2D1_ALPHA_MODE_IGNOREです。このバージョンでは完全に正常に動作し
HwdRenderTarget.BeginDraw;
HwdRenderTarget.DrawBitMap(myBitMap);
HwdRenderTarget.GetDC(dc);
... do GDI drawing here ...
HwdRenderTarget.ReleaseDC();
HwdRenderTarget.EndDraw;
:GDIはDrawTextExテキストは透明な背景を持っている、ソリッドカラーで描画オブジェクト。私のレンダリング機能は次のように何とか見えるようHwdRenderTargetは、GDI互換性があります
パフォーマンスを最適化するには、「バックバッファ」でGDIの描画を行いたいので、何かが変更されたときに実行する必要があります。 それ以外の場合は、キャッシュされたビットマップをレンダリングできます。ビットマップは空白で透明なので、描画されるオブジェクトのみが表示されます。
だから私はアルファモードがD2D1_ALPHA_MODE_PREMULTIPLIEDで、CompatibleRenderTarget ID2D1BitmapRenderTargetを作成します。
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にはアルファ情報もありません。
アルファ情報はどこから来ますか?誰でもアイデアがありますか?前もって感謝します!
Btw、CompatibleRenderTargetのDirect2D図面を使用しても正常に動作します。