【问题标题】:Error passing CoreWindow as function parameter将 CoreWindow 作为函数参数传递时出错
【发布时间】:2021-02-10 19:34:33
【问题描述】:

我是 UWP 和 WinRT 的新手,我已经了解 DirectX11 和 Win32,我对学习 UWP 和 WinRT 非常感兴趣。

DXMainResources是一个使用Diret3D和Direct2D的类,在创建资源的时候最重要的是窗口(CoreWindow),但是将窗口作为函数参数传递时,会出现很多错误如:

C2065 错误“bEnableDepthStencilBuffer”:未声明的标识符 错误 C2065“窗口”:未声明的标识符 错误 C2065 'window_': 未声明的标识符

面对这些错误,删除CoreWindow窗口参数,程序编译,但窗口作为参数是必要的,因为我需要它的高度和宽度来创建交换链和深度模板视图的纹理。

有没有办法将窗口作为参数传递?

我使用的是 DirectX 11.3 接口,我使用的 WinRT 版本是 2.0.201026.4

#pragma once

#include "pch.h"

#include <d3d11_3.h>
#include <d2d1_3.h>
#include <dxgi1_4.h>
#include <dwrite_3.h>

#include <array>

using namespace D2D1;

template<class Interface> void TSafeRelease(Interface** ppInterface)
{
    if (*ppInterface)
    {
        (*ppInterface)->Release();
        (*ppInterface) = nullptr;
    }
}

class DXMainResources
{
public:
    DXMainResources()
    {
        d3dDev = nullptr;
        d3dDevContext = nullptr;
        d3dRTView = nullptr;
        d3dDSView = nullptr;
        d2dDev = nullptr;
        d2dDevContext = nullptr;
        d2dTargetBitmap = nullptr;
        dxgiFactory = nullptr;
        dxgiDev = nullptr;
        dxgiDefaultAdapter = nullptr;
        dxgiSwapChain = nullptr;
        dwriteFactory = nullptr;
        dwriteTextFmt = nullptr;

        featureLevel = static_cast<D3D_FEATURE_LEVEL>(0);
        dxgiSwapChainFmt = DXGI_FORMAT_UNKNOWN;
        dxgiDepthStencilFmt = DXGI_FORMAT_UNKNOWN;
        viewPort = D3D11_VIEWPORT();
    }

    ~DXMainResources()
    {

    }

    void CreateResources(CoreWindow const& window, bool bOnlyDirect2D = false, bool bEnableDepthStencilBuffer = true
        , DXGI_FORMAT dxgiSwapChainFmt_ = DXGI_FORMAT_B8G8R8A8_UNORM, DXGI_FORMAT dxgiDepthStencilFmt_ = DXGI_FORMAT_D24_UNORM_S8_UINT
        , DXGI_SWAP_EFFECT swapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL)
    {
        dxgiSwapChainFmt = dxgiSwapChainFmt_;
        dxgiDepthStencilFmt = dxgiDepthStencilFmt_;

        CoreWindow window_ = window;

        std::array<D3D_FEATURE_LEVEL, 9> featureLevels =
        {
            D3D_FEATURE_LEVEL_12_1,
            D3D_FEATURE_LEVEL_12_0,
            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,
        };

        UINT deviceFlags = D3D11_CREATE_DEVICE_DEBUG | D3D11_CREATE_DEVICE_BGRA_SUPPORT;

        HRESULT hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr, deviceFlags, featureLevels.data(), static_cast<UINT>(std::size(featureLevels))
            , D3D11_SDK_VERSION, reinterpret_cast<ID3D11Device**>(&d3dDev), &featureLevel, nullptr);

        hr = d3dDev->QueryInterface(__uuidof(IDXGIDevice3), reinterpret_cast<void**>(&dxgiDev));

        hr = dxgiDev->GetAdapter(reinterpret_cast<IDXGIAdapter**>(&dxgiDefaultAdapter));

        hr = dxgiDefaultAdapter->GetParent(__uuidof(IDXGIFactory4), reinterpret_cast<void**>(&dxgiFactory));

        DXGI_SWAP_CHAIN_DESC1 swapChainDesc;
        ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC1));
        
        swapChainDesc.BufferCount = 2;
        swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
        swapChainDesc.Format = dxgiSwapChainFmt_;
        swapChainDesc.SampleDesc.Count = 1;
        swapChainDesc.SwapEffect = swapEffect;

        hr = dxgiFactory->CreateSwapChainForCoreWindow(d3dDev, reinterpret_cast<IUnknown*>(window_)
            , &swapChainDesc, nullptr, reinterpret_cast<IDXGISwapChain1**>(&dxgiSwapChain));
            
        if (bOnlyDirect2D)
        {
            IDXGISurface2* dxgiBackBufferSurface = nullptr;
            hr = dxgiSwapChain->GetBuffer(0, __uuidof(IDXGISurface2), reinterpret_cast<void**>(&dxgiBackBufferSurface));

            D2D1_CREATION_PROPERTIES creationProps = CreationProperties(D2D1_THREADING_MODE_SINGLE_THREADED, D2D1_DEBUG_LEVEL_INFORMATION, D2D1_DEVICE_CONTEXT_OPTIONS_NONE);
            D2D1_BITMAP_PROPERTIES1 bmpProps = BitmapProperties1(D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET
                , PixelFormat(dxgiSwapChainFmt_, D2D1_ALPHA_MODE_IGNORE));
            
            hr = D2D1CreateDevice(dxgiDev, creationProps, reinterpret_cast<ID2D1Device**>(&d2dDev));

            hr = d2dDev->CreateDeviceContext(creationProps.options, &d2dDevContext);

            hr = d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface, bmpProps, &d2dTargetBitmap);

            d2dDevContext->SetTarget(d2dTargetBitmap);

            TSafeRelease(&dxgiBackBufferSurface);
        }
        else
        {
            IDXGISurface2* dxgiBackBufferSurface = nullptr;
            hr = dxgiSwapChain->GetBuffer(0, __uuidof(IDXGISurface2), reinterpret_cast<void**>(&dxgiBackBufferSurface));

            D2D1_CREATION_PROPERTIES creationProps = CreationProperties(D2D1_THREADING_MODE_SINGLE_THREADED, D2D1_DEBUG_LEVEL_INFORMATION, D2D1_DEVICE_CONTEXT_OPTIONS_NONE);
            D2D1_BITMAP_PROPERTIES1 bmpProps = BitmapProperties1(D2D1_BITMAP_OPTIONS_CANNOT_DRAW | D2D1_BITMAP_OPTIONS_TARGET
                , PixelFormat(dxgiSwapChainFmt_, D2D1_ALPHA_MODE_IGNORE));

            hr = D2D1CreateDevice(dxgiDev, creationProps, reinterpret_cast<ID2D1Device**>(&d2dDev));

            hr = d2dDev->CreateDeviceContext(creationProps.options, &d2dDevContext);

            hr = d2dDevContext->CreateBitmapFromDxgiSurface(dxgiBackBufferSurface, bmpProps, &d2dTargetBitmap);
            d2dDevContext->SetTarget(d2dTargetBitmap);

            TSafeRelease(&dxgiBackBufferSurface);

            d3dDev->GetImmediateContext3(&d3dDevContext);

            ID3D11Texture2D1* d3dBackBufferTex = nullptr;
            hr = dxgiSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D1), reinterpret_cast<void**>(&d3dBackBufferTex));

            hr = d3dDev->CreateRenderTargetView1(d3dBackBufferTex, nullptr, &d3dRTView);

            TSafeRelease(&d3dBackBufferTex);

            if (bEnableDepthStencilBuffer)
            {
                ID3D11Texture2D1* d3dDepthStencilTex = nullptr;

                D3D11_TEXTURE2D_DESC1 depthStencilTexDesc;
                ZeroMemory(&depthStencilTexDesc, sizeof(D3D11_TEXTURE2D_DESC1));

                depthStencilTexDesc.ArraySize = 1;
                depthStencilTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
                depthStencilTexDesc.Format = dxgiDepthStencilFmt_;
                depthStencilTexDesc.Height = window_.Bounds().Height;
                depthStencilTexDesc.MipLevels = 1;
                depthStencilTexDesc.SampleDesc.Count = 1;
                depthStencilTexDesc.Width = window_.Bounds().Width;

                hr = d3dDev->CreateTexture2D1(&depthStencilTexDesc, nullptr, &d3dDepthStencilTex);
                hr = d3dDev->CreateDepthStencilView(d3dDepthStencilTex, nullptr, &d3dDSView);

                d3dDevContext->OMSetRenderTargets(1, reinterpret_cast<ID3D11RenderTargetView**>(&d3dRTView), d3dDSView);

                TSafeRelease(&d3dDepthStencilTex);
            }
            else
            {
                d3dDevContext->OMSetRenderTargets(1, reinterpret_cast<ID3D11RenderTargetView**>(&d3dRTView), nullptr);
            }

            viewPort.Height = window_.Bounds().Height;
            viewPort.MaxDepth = 1.0f;
            viewPort.Width = window_.Bounds().Width;

            d3dDevContext->RSSetViewports(1, &viewPort);
        }

        hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory3), reinterpret_cast<IUnknown**>(&dwriteFactory));
        hr = dwriteFactory->CreateTextFormat(L"Segoe", nullptr, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, 11.0f
            , L"en-US", reinterpret_cast<IDWriteTextFormat**>(&dwriteTextFmt));
    }

    ID3D11Device3* GetD3D11Device() const { return d3dDev; }
    ID3D11DeviceContext3* GetD3D11DeviceContext() const { return d3dDevContext; }
    ID3D11RenderTargetView1* GetD3D11RenderTargetView() const { return d3dRTView; }
    ID3D11DepthStencilView* GetD3D11DepthStencilView() const { return d3dDSView; }

    ID2D1Device2* GetD2DDevice() const { return d2dDev; }
    ID2D1DeviceContext2* GetD2DDeviceContext() const { return d2dDevContext; }
    ID2D1Bitmap1* GetD2DTargetBitmap() const { return d2dTargetBitmap; }

    IDXGIFactory4* GetDXGIFactory() const { return dxgiFactory; }
    IDXGIDevice3* GetDXGIDevice() const { return dxgiDev; }
    IDXGIAdapter3* GetDXGIDefaultAdapter() const { return dxgiDefaultAdapter; }
    IDXGISwapChain3* GetDXGISwapChain() const { return dxgiSwapChain; }

    IDWriteFactory* GetDWriteFactory() const { return dwriteFactory; }
    IDWriteTextFormat3* GetDWriteTextFormat() const { return dwriteTextFmt; }

    D3D_FEATURE_LEVEL GetD3DDeviceFeatureLevel() { return featureLevel; }
    DXGI_FORMAT GetDXGISwapChainFormat() { return dxgiSwapChainFmt; }
    DXGI_FORMAT GetDXGIDepthStencilFormat() { return dxgiDepthStencilFmt; }
    D3D11_VIEWPORT GetD3D11ViewPort() { return viewPort; }
private:
    ID3D11Device3* d3dDev;
    ID3D11DeviceContext3* d3dDevContext;
    ID3D11RenderTargetView1* d3dRTView;
    ID3D11DepthStencilView* d3dDSView;

    ID2D1Device2* d2dDev;
    ID2D1DeviceContext2* d2dDevContext;
    ID2D1Bitmap1* d2dTargetBitmap;

    IDXGIFactory4* dxgiFactory;
    IDXGIDevice3* dxgiDev;
    IDXGIAdapter3* dxgiDefaultAdapter;
    IDXGISwapChain3* dxgiSwapChain;

    IDWriteFactory* dwriteFactory;
    IDWriteTextFormat3* dwriteTextFmt;

    D3D_FEATURE_LEVEL featureLevel;
    DXGI_FORMAT dxgiSwapChainFmt;
    DXGI_FORMAT dxgiDepthStencilFmt;
    D3D11_VIEWPORT viewPort;
};


【问题讨论】:

    标签: c++ windows uwp windows-runtime directx


    【解决方案1】:

    参考document中的重要,请添加以下#include语句和using语句,然后尝试编译您的项目。

    #include <winrt/Windows.UI.Core.h>
    using namespace winrt::Windows::UI::Core;
    

    【讨论】:

    • 您的问题解决了吗?如果还没有解决,请随时联系我们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    相关资源
    最近更新 更多