Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

21.06.2014, 13:19

DirectX11 D3DCreateDeviceAndSwapChain() nicht ausführbar

Hey Leute,
wie der Titel schon sagt lässt sich bei mir die D3DCreateDeviceAndSwapChain() im Code nicht ausführen. Ich bekomme weder eine Compiler oder Linker Fehlermeldung das irgendwas nicht passt noch hab ich irgend einen Anhaltspunkt woran das liegen kann. In der Ausführung überspringt das Programm dann einfach die Zeile und wenn ich da einen Haltepunkt hinsetzt sagt er mir das dort kein ausführbarer Code ist. Und im Prinzip ist der Code auch nur aus einem Tutorial kopiert..
Im Internet hab ich leider auch nichts gefunden was mir irgendwie geholfen hat!

Könnt ihr mir da weiterhelfen? :)

(ps: (vlt hilft das ja weiter, manchmal liegt´s ja nicht nur am code ;) ) ich verwende Visual Studio 2013 C++ und Windows 8.1)

Hier der Codeausschnitt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//---------------------------------------
//header werden natürlich mit eingebunden
#include <windows.h>
#include <windowsx.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>

// include the Direct3D Library file
#pragma comment (lib, "D3D11.lib")
#pragma comment (lib, "D3Dx11.lib")
#pragma comment (lib, "D3Dx10.lib")
//--------------------------------------

//...
    DXGI_SWAP_CHAIN_DESC scd;

    // clear out the struct for use
    ZeroMemory(&scd, sizeof(DXGI_SWAP_CHAIN_DESC));

    // fill the swap chain description struct
    scd.BufferCount = 2;                                    // back buffer
    scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;     // use 32-bit color
    scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;      // how swap chain is to be used
    scd.OutputWindow = WindowHandler;                       // the window to be used
    scd.SampleDesc.Count = 1;                               // how many multisamples
    scd.Windowed = TRUE;                                    // windowed/full-screen mode

    

    if (FAILED(D3D11CreateDeviceAndSwapChain(NULL,
        D3D_DRIVER_TYPE_HARDWARE,
        NULL,
        NULL,
        NULL,
        NULL,
        D3D11_SDK_VERSION,
        &scd,
        &swapchain,
        &dev,
        NULL,
        &devcon)))
    {
        MessageBox(WindowHandler, L"Kann DirectX nicht initialisieren!", L"DirectX Error", MB_OK);
        initialized = false;
        Application::CallCloseRequest();
        return -1;
    }
    else
        initialized = true;

//...
if you never try, you never know

2

21.06.2014, 14:59

Wo genau setzt du den den Haltepunkt (Zeilennummer im Ausschnitt) ?
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

3

21.06.2014, 15:08

Setzen tu ich ihn in Zeile 31.
da steht dann in der Ausführung das hier kein Code ist der ausführbar sei und später wenn dann wieder alles gelöscht werden soll via (zB) swapchain->Release() gibts dann noch ne fehlermeldung das da alles Nullzeiger sind weil die noch nicht erstellt worden sind. Deswegen denke ich das, wie ich im Debug sehe, das die Funktion nicht aufgerufen wird, aber ich weis leider nicht warum. (folglich lässt sich auch sonst so kein DirectX benutzen)
if you never try, you never know

4

21.06.2014, 15:18

zu dem swapchain->Release():
Versuch statt dessen:

C-/C++-Quelltext

1
2
3
4
5
if(swapchain)
{
    swapchain->Release();
    swapchain = 0;
}

Dafür muss aber swapchain zu Beginn (vor der Initialisiserung) auf 0 gesetzt werden ;)

Zu dem nicht ausführbaren Code:
Lass dir den Rückgabewert von D3D11CreateDeviceAndSwapChain in einem HRESULT speichern und schau dir dann den Rückgabewert an

C-/C++-Quelltext

1
2
3
4
5
HRESULT result = D3D11CreateDeviceAndSwapChain(...);
if(FAILED(result))
{
    // Hier Fehlermeldung
}

Vor der if-Abfrage sezt du einen HAltepunkt und schaust was dort in HRESULT drin steht ;)
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

5

21.06.2014, 15:32

okey hab ich soweit mal eben gemacht!
result = 0x887a0001

so, "0x887a0001" steht für "DXGI_ERROR_INVALID_CALL"
ja was heist das jetzt? ich versteh noch nicht ganz so was jetzt genau falsch läuft :huh:
if you never try, you never know

6

21.06.2014, 15:42

Wie du aus dieser Liste entnehmen kannst steht DXGI_ERROR_INVALID_CALL für einen Fehler in den Parametern.
Versuch deine DXGI_SWAP_CHAIN_DESC weiter zu füllen (Auflösung, SampleRate, etc.), da diese mit nur 6 Werten so gut wie leer ist und somit der Funktion Daten fehlen ;)
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

7

21.06.2014, 16:25

hab jetzt der Swapchaindesc noch mehr an Infos geben, damit geht´s aber auch noch nicht.
jetzt ist mir eben auch noch aufgefallen das wenn ich den Treibertyp ändere zB. zu _SOFTWARE dann Fehler kommen (Invalid Arguments). Ich wüsste aber nicht was da Fehlt oder falsch ist

Gäbe es Notfalls noch andere Möglichkeiten gleiches mit anderen Funktionen zu erreichen?
if you never try, you never know

8

21.06.2014, 16:46

Der _SOFTWARE Treiber braucht halt auch einen Treiber ;)

Versuch doch mal diesen Aufruf, der sollte definitiv laufen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Swap-Chain-Eigenschaften
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc));
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60;
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.Windowed = true;
swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
swapChainDesc.Flags = 0;

// Feature-Level auf DirectX11 setzen
D3D_FEATURE_LEVEL featureLevel = D3D_FEATURE_LEVEL_11_0;
HRESULT result;
// Interfaces erstellen
result = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, 0,
                                &featureLevel, 1, D3D11_SDK_VERSION,
                                &swapChainDesc, &m_swapChain, &m_device, NULL,
                                            &m_context);


Wenn der funktioniert solltest du evtl. das Tutorial wechseln ;)

BTW: Deine Grafikkarte unterstützt aber schon D3D11 oder?
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

9

21.06.2014, 17:08

Auch das geht net ?(
wobei ich denke das es an sich egal sein sollte ob die swapchaindesc überhaupt werte hat, weil die Funktion ja doch zumindest überhaupt aufgerufen werden sollte. Würde zwar dann ja zu Fehlern führen, aber immerhin würde sie aufgerufen werden.. doch nichtmal das tuts ja, und das ist das was ich einfach nicht verstehe ;(

jup unterstützt die, ist ne GTX560, also noch halbwegs aktuell.. halbwegs ^^
if you never try, you never know

10

21.06.2014, 17:15

Okay, die GTX560 geht, hab ich auch :D

Die Funktion wird ja auch aufgerufen, wenn HRESULT hinterher einen Wert gespeichert hat.
"Wer Angst hat, dass ihm seine Ideen geklaut werden, der scheint nicht viele zu haben. "

Werbeanzeige