如何修复交换链创建的问题

问题描述 投票:0回答:1

我正在学习directx我在我的应用程序中初始化direct3d并且我的所有HRESULTS都返回S_OK,这是一个成功的返回代码,除了涉及交换链创建的最后一个我启用了调试层,所以我在输出日志中收到警告错误说'OurDevice'可能是0 ...(OurDevice是我的ID3D11Device的指针名称)..经过几个小时的扫描Microsoft Docs并检查并重新检查我的所有代码后我似乎无法找出问题是否有人有线索?

#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, &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**)& dxgiDevice);
    if (SUCCEEDED(CreateDev)) {

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

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

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

    if (FAILED(CreateDev)) {

        MessageBeep(0xFFFFFFFF);
    }


    //------------------------------------------------------------------- 
    -------------------------------/*
graphics 3d directx-11 direct3d direct3d11
1个回答
0
投票

如果你启用DXGI debugging以及使用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

请参阅Anatomy of Direct3D 11 Create Device以及Direct3D Game Visual Studio templates

© www.soinside.com 2019 - 2024. All rights reserved.