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

23.10.2016, 19:49

Problem mit IDirect3D9::CreateDevice() (nullptr Rückgabe)

Hi,
ich hab ein Riesenproblem mit der in der Überschrift genannten Funktion. Ich bin echt mit meinem Latein am Ende und hab keine Idee mehr woran es letztendlich scheitert. :dash:
Erstmal, ja ich weiß, dass es Beiträge mit diesem Thema gibt allerdings habe ich mir diese Beiträge durchgelesen und bei mir ausprobiert ob das funktioniert.
Hat es aber nicht.
Also bitte, wenn jemand vielleicht weiß worans liegt, wäre ich sehr dankbar! :)
Hier ist 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
IDirect3DDevice9 * pd3ddevice = NULL;
bool Init(HWND hWnd)
        {
            IDirect3D9 * pd3d = Direct3DCreate9(D3D_SDK_VERSION);

            pd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &pMode);

            Parameters.hDeviceWindow = hWnd;
            Parameters.Windowed = true;
            Parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
            Parameters.BackBufferCount = 2;
            Parameters.BackBufferFormat = pMode.Format;
            Parameters.BackBufferHeight = pMode.Height;
            Parameters.BackBufferWidth = pMode.Width;
            Parameters.EnableAutoDepthStencil = TRUE;
            Parameters.AutoDepthStencilFormat = D3DFMT_D16;
            Parameters.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
            Parameters.MultiSampleType = D3DMULTISAMPLE_NONE;

            HRESULT hr = pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Parameters, &pd3ddevice);
            if (hr != D3D_OK)
            {
                MessageBox(hWnd, "DirectX konnte nicht erfolgreich initialisiert werden!\nErstellung der Geräteschnittstelle ist fehlgeschlagen: CreateDevice()!", "Fehler!", MB_ICONERROR | MB_OK);
                SAFE_RELEASE(pd3d);
                return false;
            }

            

            return true;
        }

Wie gesagt das Problem liegt bei der CreateDevice-Funktion, die ja eigentlich das Device erstellen soll, es bei mir allerdings nicht macht.
Auch nach Funktionsaufruf bleibt pd3ddevice 0!

Freu mich über jede Antwort.

LG FMRS

2

23.10.2016, 20:54

Welchen Wert hat hr? Und was steht bei Microsoft zu diesem Wert?

Und warum verwendest du noch Direct3D 9 statt 10 oder 11?
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

3

24.10.2016, 16:12

Hi,
also ich hab leider keine MSDN-Seite zu dem Errorcode gefunden, aber das hier ist er: 0x8876086c
Vielleicht weißt du was er bedeutet bzw. wie man ihn lösen kann.

Zu der Frage warum ich noch DX 9 benutze: Ich bin noch Anfänger was DX angeht und habe gehört, dass DX 9 die Version ist, die am leichtesten zu verstehen ist.
Aber wenn das nicht so ist kann ich natürlich genauso gut umsteigen.

LG FMRS

4

24.10.2016, 17:18

Der Fehlercode bedeutet D3DERR_INVALIDCALL.
Unterstützt deine Hardware D3DCREATE_HARDWARE_VERTEXPROCESSING? (Vielleicht einfach mal D3DCREATE_SOFTWARE_VERTEXPROCESSING testen)
Wie initalisierst du Parameters? Nicht alle Attribute werden in dem Beispiel auf einen Gültigen wert gesetzt.
D3DPRESENT_PARAMETERS Parameters = {0}; könnte eventuell helfen.
Mehr fällt mir im Moment dazu nicht ein.

5

24.10.2016, 18:18

So also ich hab jetzt das Beispiel folgendermaßen abgeändert:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool Init(HWND hWnd)
        {
            IDirect3D9 * pd3d = Direct3DCreate9(D3D_SDK_VERSION);

            Parameters = { 0 };

            HRESULT hr = pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Parameters, &pd3ddevice);
            if (hr != D3D_OK)
            {
                MessageBox(hWnd, "DirectX konnte nicht erfolgreich initialisiert werden!\nErstellung der Geräteschnittstelle ist fehlgeschlagen: CreateDevice()!", "Fehler!", MB_ICONERROR | MB_OK);
                SAFE_RELEASE(pd3d);
                return false;
            }
            return true;
        }

Funktionieren tut es allerdings immer noch nicht. :hmm:

Danke auf jeden Fall für die Antwort ^^

Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

6

24.10.2016, 19:29

Zitat

pPresentationParameters [in, out]
Type: D3DPRESENT_PARAMETERS*

Pointer to a D3DPRESENT_PARAMETERS structure, describing the presentation parameters for the device to be created. If BehaviorFlags specifies D3DCREATE_ADAPTERGROUP_DEVICE, pPresentationParameters is an array. Regardless of the number of heads that exist, only one depth/stencil surface is automatically created.

https://msdn.microsoft.com/de-de/bb174313(v=vs.85)
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

7

24.10.2016, 20:00

Ich meinte es eigentlich so:

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
IDirect3DDevice9* pd3ddevice = NULL;
bool Init(HWND hWnd)
{
    IDirect3D9* pd3d = Direct3DCreate9(D3D_SDK_VERSION);

    pd3d->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &pMode);

    Parameters = { 0 };
    Parameters.hDeviceWindow = hWnd;
    Parameters.Windowed = true;
    Parameters.SwapEffect = D3DSWAPEFFECT_DISCARD;
    Parameters.BackBufferCount = 2;
    Parameters.BackBufferFormat = pMode.Format;
    Parameters.BackBufferHeight = pMode.Height;
    Parameters.BackBufferWidth = pMode.Width;
    Parameters.EnableAutoDepthStencil = TRUE;
    Parameters.AutoDepthStencilFormat = D3DFMT_D16;
    Parameters.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    Parameters.MultiSampleType = D3DMULTISAMPLE_NONE;

    HRESULT hr = pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, NULL, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Parameters, &pd3ddevice);
    if (hr != D3D_OK)
    {
        MessageBox(hWnd, "DirectX konnte nicht erfolgreich initialisiert werden!\nErstellung der Geräteschnittstelle ist fehlgeschlagen: CreateDevice()!", "Fehler!", MB_ICONERROR | MB_OK);
        SAFE_RELEASE(pd3d);
        return false;
    }
    return true;
}

8

24.10.2016, 22:10

Also es würde mich schon stark wundern, wenn die Grafikkarte keine Vertizes unterstützen würde... Das wäre in etwa so sinnvoll wie ein Auto ohne Räder. D3DCREATE_HARDWARE_VERTEXPROCESSING ist schon korrekt.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

9

24.10.2016, 23:28

Du kannst ja mal im dxcpl die D3D9 Version auf Debug stellen + Dbg Output Level erhöhen.
Damit hab ich noch jeden Fehler gefunden egal wie wenig Wald ich vor lauter Bäumen gesehen hab.
Falls du dxcpl nicht findest: DxSDK\Utilities\bin\x86|x64

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

25.10.2016, 00:06

Also es würde mich schon stark wundern, wenn die Grafikkarte keine Vertizes unterstützen würde... Das wäre in etwa so sinnvoll wie ein Auto ohne Räder. D3DCREATE_HARDWARE_VERTEXPROCESSING ist schon korrekt.

Schonmal was von Intel GPU gehört... ;)

Werbeanzeige