как устранить проблему с созданием цепочки подкачки

#graphics #3d #directx-11 #direct3d #direct3d11

#графика #3D #directx-11 #direct3d #direct3d11

Вопрос:

я изучаю directx, я работаю над инициализацией direct3d в своем приложении, и все мои результаты возвращают S_OK, который является кодом возврата успеха, кроме последнего, который включал создание цепочки подкачки. у меня включен уровень отладки, поэтому я получаю предупреждение об ошибке в журнале вывода, в котором говорится, что «OurDevice» может быть 0… (OurDevice — это имя указателя на мой ID3D11Device).. после многих часов сканирования документов Microsoft, проверки и перепроверки всего моего кода я, похоже, не могу найти проблему, у кого-нибудь есть ключ?

 #include "dx3dmanager.h"
#include "Core.h"
#include <Windows.h>
#include <d3d11.h>
#include <d3d11_1.h>
#include <d3d11_2.h>
#include <DirectXMath.h>
#include <dxgi.h>


dx3dmanager::dx3dmanager()
{
}


dx3dmanager::~dx3dmanager()
{
}

// this method intitializes the Direct3d version 11 API this 
initialization method is subject to change with new versions /*

void dx3dmanager::initialize3d(HWND MainWindow)

{
    // declarations for Direct3D feature levels ours will include 
versions 11-12 unless changed /*
    //declarations for our device(GPU) and device context /*
    UINT creationflags = D3D11_CREATE_DEVICE_DEBUG;

    ID3D11Device* OurDevice;

    ID3D11DeviceContext* IDeviceContext;

    D3D_FEATURE_LEVEL featurelevels[2] =
    {
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_11_1

    };

    HRESULT CreateDev;


    switch (CreateDev) {
    case S_OK: {

        MessageBeep(0xFFFFFFFF);

    }

    }


     // checks multisampling quality 

  HRESULT checkmxquality;

    UINT m4xMsaaQuality;
    DXGI_FORMAT dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;
    checkmxquality = OurDevice->CheckMultisampleQualityLevels(dxgi_format, 4, amp;m4xMsaaQuality);
    assert(m4xMsaaQuality > 0);

    switch (checkmxquality) {

    case S_OK: {

        MessageBeep(0xFFFFFFFF);

    }
                  break;
    }
    // descriptions for rendering structs IE:  sampling, format, and swap 
chain /*
    DXGI_SAMPLE_DESC sampdesc;
    sampdesc.Count = 1;
    sampdesc.Quality = 0;

    DXGI_MODE_DESC1 dxmode;
    dxmode.Width = 125;
    dxmode.Height = 125;
    dxmode.Format = dxgi_format;
    dxmode.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    dxmode.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    dxmode.RefreshRate.Numerator = 60;
    dxmode.RefreshRate.Denominator = 1;
    dxmode.Stereo = false;

    DXGI_SWAP_CHAIN_DESC1 chaindesc;
    chaindesc.Width = 0;
    chaindesc.Height = 0;
    chaindesc.Format = dxgi_format;
    chaindesc.Stereo = false;
    chaindesc.SampleDesc = sampdesc;
    chaindesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    chaindesc.BufferCount = 3;
    chaindesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
    chaindesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH| 
DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE| DXGI_SWAP_CHAIN_FLAG_DISPLAY_ONLY;
    chaindesc.AlphaMode = DXGI_ALPHA_MODE_UNSPECIFIED;
    chaindesc.Scaling = DXGI_SCALING_STRETCH;
    //------------------------------------------------------------------- 
  

——————————-/*

     // this is our DXGI interface (DXGI is not a part of direct3d it is a 
seperate API (COM) /* 
    IDXGIDevice* dxgiDevice = nullptr;
    CreateDev = OurDevice->QueryInterface(__uuidof(IDXGIDevice), 
(void**)amp; dxgiDevice);
    if (SUCCEEDED(CreateDev)) {

    MessageBeep(0xFFFFFFFF);
    }
    IDXGIAdapter* dxgiadapter = nullptr;
    CreateDev = dxgiDevice->GetParent(__uuidof(IDXGIAdapter), (void**)amp; 
dxgiadapter);
    if (SUCCEEDED(CreateDev)) {

        MessageBeep(0xFFFFFFFF);
    }
    IDXGIFactory2* factory;
    CreateDev = dxgiadapter->GetParent(__uuidof(IDXGIFactory), (void**)amp; 
factory);
    if (SUCCEEDED(CreateDev)) {

        MessageBeep(0xFFFFFFFF);
    }
    IDXGISwapChain1* mSwapChain;
    CreateDev = factory->CreateSwapChainForHwnd(OurDevice, MainWindow, 
amp;chaindesc, NULL, NULL, amp;mSwapChain);

    if (FAILED(CreateDev)) {

        MessageBeep(0xFFFFFFFF);
    }


    //------------------------------------------------------------------- 
    -------------------------------/*
  

Комментарии:

1. Гм, куда вы звоните D3D11CreateDevice ?

2. Вы должны взглянуть на этот пост , а также на шаблоны здесь . Вам также следует взглянуть на DirectX Tool Kit

Ответ №1:

Если вы включите отладку DXGI, а также using D3D11_CREATE_DEVICE_DEBUG , то в окне отладки вы получите выходные сообщения о проблемах, которые приводят к ошибочным кодам ошибок.

Даже при включенной отладке Direct3D 11 вы получаете:

 D3D11 ERROR: ID3D11Device::CreateTexture2D1: D3D11_RESOURCE_MISC_GDI_COMPATIBLE
requires a B8G8R8A8 format.
[ STATE_CREATION ERROR #103: CREATETEXTURE2D_INVALIDMISCFLAGS]
  

Итак, ваша проблема очень проста и легко решаема: измените dxgi_format на DXGI_FORMAT_B8G8R8A8_UNORM

Смотрите Анатомия Direct3D 11 Создание устройства а также Шаблоны Direct3D Game Visual Studio