Ich lerne DX11 durch folgende this tutorial auf DirectXTutorials.com. Ich bin an dem Punkt, wo ich das Gerät und seinen Kontext erstellt habe und nun die Swap-Kette erstellen muss.
Wenn ich jedoch CreateSwapChainForCoreWindow(...)
aufrufen, verlässt es die Swap-Kette als nullptr und gibt 0x887a0001
zurück. DirectX Fehlersuche spuckt die folgenden für den Code aus:DXGI_ERROR_INVALID_CALL beim Erstellen von Swap-Kette für Core-Fenster
Name: DXGI_ERROR_INVALID_CALL
Description: The application has made an erroneous API call that it had enough information to avoid.
This error is intended to denote that the application should be altered to avoid the error.
Use of the debug version of the DXGI.DLL will provide run-time debug output with further information.
Severity code: Failed
Wie soll ich gehen über, um Code zu ändern, diesen Fehler zu vermeiden? Ich habe versucht, anderen Antworten zu folgen, indem ich das Format oder den Effekt für die Beschreibung der Tauschkette vergeblich änderte.
Hier ist der Code in Frage, es ist der letzte Aufruf, der fehlschlägt:
void Game::Initialize()
{
// Define temporary pointers to a device and a device context
ComPtr<ID3D11Device> dev11;
ComPtr<ID3D11DeviceContext> devcon11;
// Create the 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 version to the DirectX 11.1 versions
dev11.As(&mDevice);
devcon11.As(&mDeviceContext);
// Obtain the DXGI factory
// [1] Convert our ID3D11Device1 into an IDXGIDevice1
ComPtr<IDXGIDevice1> dxgiDevice;
mDevice.As(&dxgiDevice);
// [2] Use the IDXGDevice1 interface to get access to the adapter
ComPtr<IDXGIAdapter> dxgiAdapter;
dxgiDevice->GetAdapter(&dxgiAdapter);
// [3] Use the IDXGIAdapter interface to get access to the factory
ComPtr<IDXGIFactory2> dxgiFactory;
dxgiAdapter->GetParent(__uuidof(IDXGIFactory2), &dxgiFactory);
// 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 and back buffer
scd.Format = DXGI_FORMAT_R8G8B8A8_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
HRESULT result = dxgiFactory->CreateSwapChainForCoreWindow(
mDevice.Get(), // Address of the device
reinterpret_cast<IUnknown*>(CoreWindow::GetForCurrentThread()), // Address of the window
&scd, // Address of the swap chain description
nullptr, // Monitor selection stuff - leave null
&mSwapChain // Address of the new swap chain
);
}
mDevice
, mDeviceContext
und mSwapChain
sind alle Mitglieder Variablen der Klasse.
Ich bin direkt von SDL und SFML zu DirectX gekommen, also ist das so niedrig wie ich es gewesen bin. Wenn es genug Informationen gibt, um den problematischen Anruf zu vermeiden, was soll ich dann anrufen? Ich sehe einige Fragen, wo Leute anrufen CreateDeviceAndSwapChain
, ist dies die bevorzugte Methode?
EDIT: Um zu klären, der Projekttyp ist DirectX11 App (Universal Windows)
, wenn das einen Unterschied macht.
Sie können sich dies [DeviceResources] (https://github.com/walbourn/directx-vs-templates/blob/master/d3d11game_uwp_dr/DeviceResources.cpp) und die Verwendung von 'CreateDXGIFactory2 ansehen "". –
@ChuckWalbourn Danke, ich habe ein neues Projekt aus dieser Vorlage erstellt und es baut und funktioniert kein Problem; Also werde ich das mit meinem vergleichen. –