0

DirectX を使用してビットマップを作成してペイントし、後でそのビットマップを使用して画面にペイントしようとしています。いくつかの情報源からまとめた次のテスト コードがあります。エラーなしでビットマップを作成できるようで、赤で塗りつぶしてみます。ただし、ビットマップを使用して画面にペイントすると、黒い四角形が表示されます。誰かが私が間違っているかもしれないことを教えてもらえますか? 違いがある場合、これは Windows 8 Metro アプリとして実行されていることに注意してください。

フォーマッタが山かっこを削除しているように見えることに注意してください。それを止める方法はありません。「device」変数はクラス ID3D11Device、「context」変数は ID3D11DeviceContext、d2dContext 変数は ID2D1DeviceContext、dgixDevice 変数は IDXGIDevice、「d2dDevice」は ID2D1Device です。

void PaintTestBitmap(GRectF& rect)
{
    HRESULT   hr;
    UINT      creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

    D3D_FEATURE_LEVEL featureLevels[] = 
    {
        D3D_FEATURE_LEVEL_11_1,
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_10_0,
        D3D_FEATURE_LEVEL_9_3,
        D3D_FEATURE_LEVEL_9_2,
        D3D_FEATURE_LEVEL_9_1
    };

    ComPtr<ID3D11Device>        device;
    ComPtr<ID3D11DeviceContext> context;
    ComPtr<ID2D1DeviceContext>  d2dContext;

    hr    = D3D11CreateDevice(  NULL,
                                D3D_DRIVER_TYPE_HARDWARE,
                                NULL,
                                creationFlags,
                                featureLevels,
                                ARRAYSIZE(featureLevels),
                                D3D11_SDK_VERSION,
                                &device,
                                NULL,
                                &context);

    if (SUCCEEDED(hr))
    {
        ComPtr<IDXGIDevice> dxgiDevice;
        device.As(&dxgiDevice);

        // create D2D device context
        ComPtr<ID2D1Device> d2dDevice;
        hr = D2D1CreateDevice(dxgiDevice.Get(), NULL, &d2dDevice);

        if (SUCCEEDED(hr))
        {
            hr = d2dDevice->CreateDeviceContext(D2D1_DEVICE_CONTEXT_OPTIONS_NONE, &d2dContext);

            if (SUCCEEDED(hr))
            {
                ID2D1Bitmap1 *pBitmap;
                D2D1_SIZE_U  size = { rect.m_width, rect.m_height };
                D2D1_BITMAP_PROPERTIES1 properties = {{ DXGI_FORMAT_R8G8B8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED }, 96, 96, D2D1_BITMAP_OPTIONS_TARGET, 0 };

                hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
                if (SUCCEEDED(hr))
                {
                    d2dContext->SetTarget(pBitmap);
                    d2dContext->BeginDraw();    
                    d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));     // Clear the bitmap to Red
                    d2dContext->EndDraw();

                    // If I now use pBitmap to paint to the screen, I get a black rectange
                    // rather than the red one I was expecting
                }
            }
        }
    }
}

私は DirectX と Metro スタイル アプリの両方にかなり慣れていないことに注意してください。

ありがとう

4

1 に答える 1

0

おそらく忘れているのは、コンテキストにビットマップを描画しないことです。

あなたが試すことができるのは

 hr = d2dContext->CreateBitmap(size, (const void *) 0, 0, &properties, &pBitmap);
            if (SUCCEEDED(hr))
            {
                ID2D1Image *pImage = nullptr;
                d2dContext->GetTarget(&image);

                d2dContext->SetTarget(pBitmap);
                d2dContext->BeginDraw();    
                d2dContext->Clear(D2D1::ColorF(D2D1::ColorF::Red));     // Clear the bitmap to Red
                d2dContext->SetTarget(pImage);
                d2dContext->DrawBitmap(pBitmap);
                d2dContext->EndDraw();


            }

あなたがすることは、レンダーターゲットを保存してからビットマップを描画し、最後にコンテキストを適切なレンダーターゲットに設定して、その上にビットマップを描画させることです

于 2013-05-23T08:12:53.280 に答える