#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