在 Windows Metro 下使用 DirectX 绘制位图

Posted

技术标签:

【中文标题】在 Windows Metro 下使用 DirectX 绘制位图【英文标题】:Paint to a bitmap using DirectX under Windows Metro 【发布时间】:2012-07-14 16:21:20 【问题描述】:

我正在尝试使用 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 风格的应用程序都很陌生。

谢谢

【问题讨论】:

一眼看上去还不错。我会研究位图格式,因为我相信 D2D 更喜欢 BGRA,而你如何渲染到碎石可能会影响你的结果。 感谢您的反馈。我尝试将像素格式更改为 DXGI_FORMAT_B8G8R8A8_UNORM(带和不带 alpha),但我仍然得到相同的结果。您知道如何使用 DirectX 写入位图的任何示例吗?谢谢 您可以查看此示例:code.msdn.microsoft.com/windowsapps/… 或者您可以查看其他 D2D 示例 code.msdn.microsoft.com/windowsapps/site/… 【参考方案1】:

您可能忘记的是您没有在上下文中绘制位图。

你可以尝试的是

 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();


            

您所做的是存储您的渲染目标,然后绘制您的位图,最后您将您的上下文设置为正确的渲染目标并让它在其上绘制您的位图

【讨论】:

以上是关于在 Windows Metro 下使用 DirectX 绘制位图的主要内容,如果未能解决你的问题,请参考以下文章

Windows 8 应用商店应用程序 (Metro) 是不是在 Windows 7 或 XP 中运行?

在 Windows 8/Metro/Store 中为 RectangleGeometry(在 Image.Clip 中)设置动画

Windows 8 Metro Settings Flyouts 似乎不适用于 Javascript?

下拉选择控件 - Windows 8 Metro - XAML

使用 C# 在 Windows 8 Metro App 上发送 POST 请求

Windows 8 Metro 风格应用示例