Необработанное исключение DirectX11.1 рендеринг 2D графики

StackOverflow https://stackoverflow.com//questions/20014045

Вопрос

Я использую DirectX11.1 в Visual Studio 2013, разработка приложения для хранения Windows 8.

Я пытался на пару дней, чтобы принять голову вокруг создания 2D-пользовательского интерфейса, используя DirectX, и так же, как я думал, я мог бы получить это, я иду на необработанное исключение, которое я не могу дрожать.

"Необработанное исключение на 0x002e2901 в First.exe: 0xC0000005: Доступ к нарушению чтения для чтения 0x00000000."

Обновление: кажется, что после 'd2dfactory-> createvice (dxgidevice.get (), & dev2d); dev2d выходит как null.

Обновление: Использование HResult Способ создания устройства дает ошибку «E_INVALIDARG».

(я следую за http:// msdn. Microsoft.com/en-us/library/windows/apps/hh780340.aspx )

Ниже приведен мой код из файла заголовка и .cpp. Я не включил ничего прошедшего создания ID2D1DEVICECONTEX, так как это происходит там, где возникает ошибка (только тогда, когда я включаю в себя, что исключение происходит.

.h

#pragma once

#include <d2d1.h>
#include <d2d1_1.h>
#include "DeviceResources.h"
#include "DirectXHelper.h"

using namespace Microsoft::WRL;
using namespace Windows::UI::Core;
using namespace Platform;
using namespace DirectX;

class CGame
{public:
ComPtr<ID3D11Device1> dev;                      // the device interface
ComPtr<ID3D11DeviceContext1> devcon;            // the device context interface
ComPtr<IDXGISwapChain1> swapchain;              // the swap chain interface
ComPtr<ID3D11RenderTargetView> rendertarget;    // the render target interface
ComPtr<ID3D11Buffer> vertexbuffer;              // the vertex buffer interface
ComPtr<ID3D11Buffer> vertexbuffer2;   //For triangle
ComPtr<ID3D11Buffer> vertexbuffer3;   //For laser
ComPtr<ID3D11Buffer> vertexbuffer4;   //ship 2

ComPtr<ID3D11VertexShader> vertexshader;        // the vertex shader interface
ComPtr<ID3D11PixelShader> pixelshader;          // the pixel shader interface
ComPtr<ID3D11InputLayout> inputlayout;          // the input layout interface


//2D Stuff
ComPtr<IDXGISurface> dxgiBackBuffer;
ComPtr<ID2D1Factory1> d2dFactory;
ComPtr<ID2D1Device> dev2d;
ComPtr<ID2D1DeviceContext> devcon2d;

ComPtr<ID2D1Bitmap1> targetBitmap;
ComPtr<ID2D1SolidColorBrush> pBlackBrush;
.

.cpp-файл

    #include "pch.h"
#include "Game.h"
#include <fstream>
#include <process.h>



// Use some common namespaces to simplify the code
using namespace Windows::ApplicationModel;
using namespace Windows::ApplicationModel::Core;
using namespace Windows::ApplicationModel::Activation;
using namespace Windows::UI::Core;
using namespace Windows::UI::Popups;
using namespace Windows::System;
using namespace Windows::Foundation;
using namespace Windows::Graphics::Display;
using namespace Platform;
using namespace std;


    // this function initializes and prepares Direct3D for use
void CGame::Initialize()
{
    // Define temporary pointers to a device and a device context
    ComPtr<ID3D11Device> dev11;
    ComPtr<ID3D11DeviceContext> devcon11;

    //Create Factory ID2D1Factory1
    D2D1CreateFactory(
        D2D1_FACTORY_TYPE_SINGLE_THREADED,
        __uuidof(ID2D1Factory1),
        0,
        &d2dFactory
        );

    // Create 3D device and device context objects
    D3D11CreateDevice(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        0,
        nullptr,
        0,
        D3D11_SDK_VERSION,
        &dev11,
        nullptr,
        &devcon11);

    // Convert the pointers from the DirectX 11 versions to the DirectX 11.1 versions
    dev11.As(&dev);
    devcon11.As(&devcon);


    // obtain the DXGI factory
    ComPtr<IDXGIDevice1> dxgiDevice;
    dev.As(&dxgiDevice);
    ComPtr<IDXGIAdapter> dxgiAdapter;
    dxgiDevice->GetAdapter(&dxgiAdapter);
    ComPtr<IDXGIFactory2> dxgiFactory;
    dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), &dxgiFactory);

    //Create an ID2D1Device and an ID2D1DeviceContex
    d2dFactory->CreateDevice(dxgiDevice.Get(), &dev2d);

    DX::ThrowIfFailed(
        dev2d->CreateDeviceContext(
        D2D1_DEVICE_CONTEXT_OPTIONS_NONE,
        &devcon2d
        )
        ); 
.

Любая помощь была бы очень ценится, и на всякий случай, если есть причина для просмотра кода, который следует следующим образом:

// set up the swap chain description
    DXGI_SWAP_CHAIN_DESC1 scd = { 0 };
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;    // how the swap chain should be used
    scd.BufferCount = 2;                                  // a front buffer and a back buffer
    scd.Format = DXGI_FORMAT_B8G8R8A8_UNORM;              // the most common swap chain format
    scd.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;    // the recommended flip mode
    scd.SampleDesc.Count = 1;                             // disable anti-aliasing

    CoreWindow^ Window = CoreWindow::GetForCurrentThread();    // get the window pointer

    // create the swap chain
    dxgiFactory->CreateSwapChainForCoreWindow(
        dev.Get(),                                  // address of the device
        reinterpret_cast<IUnknown*>(Window),        // address of the window
        &scd,                                       // address of the swap chain description
        nullptr,                                    // advanced
        &swapchain);                                // address of the new swap chain pointer

    // get a pointer directly to the back buffer
    ComPtr<ID3D11Texture2D> backbuffer;
    swapchain->GetBuffer(0, __uuidof(ID3D11Texture2D), &backbuffer);

    // create a render target pointing to the back buffer
    dev->CreateRenderTargetView(backbuffer.Get(), nullptr, &rendertarget);

    //Set up Direct2D render target bitmap, linking it to the swapchain
    D2D1_PIXEL_FORMAT pixelFormat = { DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED };

    D2D1_BITMAP_PROPERTIES1 bitmapProperties =
    {   pixelFormat,
        0,
        0,
        D2D1_BITMAP_OPTIONS_TARGET | D2D1_BITMAP_OPTIONS_CANNOT_DRAW,
        0,
    };

    //Direct2D needs the dxgi version of the backbuffer surface pointer
    swapchain->GetBuffer(0, IID_PPV_ARGS(&dxgiBackBuffer));

    //Get a D2D surface from the DXGI back buffer to use as the D2D render target.
    devcon2d->CreateBitmapFromDxgiSurface(
        dxgiBackBuffer.Get(),
        &bitmapProperties,
        &targetBitmap
        );

    //Now we can set the Direct2D render target
    devcon2d->SetTarget(targetBitmap.Get());



    //Create a brush for 2D
    devcon2d->CreateSolidColorBrush(
        D2D1::ColorF(D2D1::ColorF::Black),
        &pBlackBrush);

    // set the viewport
    D3D11_VIEWPORT viewport = { 0 };

    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;
    viewport.Width = Window->Bounds.Width;
    viewport.Height = Window->Bounds.Height;

    devcon->RSSetViewports(1, &viewport);
.

Обновление:

Выходная ошибка: (существует аналогичная ошибка, выводимая к этому скрывающуюся на стойке, хотя это кажется очень нерешенным.

'First.exe' (Win32): Loaded 'C:\Users\Alec\Documents\Visual Studio 2013\Projects\First\Debug\First\AppX\First.exe'. Symbols loaded.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ntdll.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\KernelBase.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\d2d1.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\d3d11.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dxgi.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ole32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\DWrite.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Program Files\WindowsApps\Microsoft.VCLibs.120.00.Debug_12.0.21005.1_x86__8wekyb3d8bbwe\vccorlib120d_app.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Program Files\WindowsApps\Microsoft.VCLibs.120.00.Debug_12.0.21005.1_x86__8wekyb3d8bbwe\msvcp120d_app.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Program Files\WindowsApps\Microsoft.VCLibs.120.00.Debug_12.0.21005.1_x86__8wekyb3d8bbwe\msvcr120d_app.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\combase.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msvcrt.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\gdi32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\user32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rpcrt4.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sechost.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\oleaut32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\sspicli.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptbase.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcryptprimitives.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\imm32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\msctf.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\kernel.appcore.dll'. Cannot find or open the PDB file.
The thread 0x22c0 has exited with code 0 (0x0).
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\twinapi.appcore.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\WinTypes.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\SHCore.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\cryptsp.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\rsaenh.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\bcrypt.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\uxtheme.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\actxprxy.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\MrmCoreR.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\BCP47Langs.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\Windows.UI.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\ninput.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\dwmapi.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\igd10umd32.dll'. Cannot find or open the PDB file.
'First.exe' (Win32): Loaded 'C:\Windows\SysWOW64\advapi32.dll'. Cannot find or open the PDB file.
.

Это было полезно?

Решение

Оказывается, я не создал мое устройство D3D11, чтобы быть совместимым с Direct2D.Код ниже исправил его.Благодаря Trillian за помощь отладочной помощи была невероятно полезной.

// This flag adds support for surfaces with a different color channel ordering than the API default.
    // You need it for compatibility with Direct2D.
    UINT creationFlags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;

    // This array defines the set of DirectX hardware feature levels this app  supports.
    // The ordering is important and you should  preserve it.
    // Don't forget to declare your app's minimum required feature level in its
    // description.  All apps are assumed to support 9.1 unless otherwise stated.
    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
    };

    D3D_FEATURE_LEVEL m_featureLevel;

    // Create 3D device and device context objects
    D3D11CreateDevice(
        nullptr,
        D3D_DRIVER_TYPE_HARDWARE,
        nullptr,
        creationFlags,
        featureLevels,
        ARRAYSIZE(featureLevels),
        D3D11_SDK_VERSION,
        &dev11,
        &m_featureLevel,
        &devcon11);
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top