2011-01-05 31 views
4

映画レンダリングソフトウェアを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図面を使用しても正常に動作します。

答えて

2

私は同じ問題を抱えていました。以下は私のために働いています(D2D1_ALPHA_MODE_PREMULTIPLIEDではなくD2D1_ALPHA_MODE_IGNOREを使用してレンダリングターゲットを作成する必要があります)。

ID2D1HwndRenderTarget* pRenderTarget; // render target created sometime earlier 

D2D1_PIXEL_FORMAT pixelFormat = D2D1::PixelFormat(
    DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE); 

ID2D1BitmapRenderTarget* pOffscreenRT = NULL; 
pRenderTarget->CreateCompatibleRenderTarget(NULL, NULL, &pixelFormat, 
    D2D1_COMPATIBLE_RENDER_TARGET_OPTIONS_GDI_COMPATIBLE, &pOffscreenRT); 
1

GDIでレンダリングすると、ちょっとした秘密があります。常にアルファチャンネルを壊してしまいます。あなたが描画するものは、その領域のアルファ値を0に設定します。私はそれがアルファチャンネルまたはあらゆる種類の合成で動作するように設計されていなかったからだと思う。これは、アルファチャンネルが存在しないスクリーンとプリンタに直接レンダリングするように設計されています。

関連する問題