我正在学习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);
}
//-------------------------------------------------------------------
-------------------------------/*
答案 0 :(得分: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