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

flux

Treue Seele

  • »flux« ist der Autor dieses Themas
  • Private Nachricht senden

1

22.06.2006, 19:47

D3D Fehler

Hi.
Hab mal wieder ein Problem mit D3D.
Beim erstellen des Devices kommt immer ein InvalidCall Fehler.

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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
void direct3d::init(unsigned int width, unsigned int height, unsigned int bpp, bool windowed)
    {
        DEBUG;
        // Werte an Attribute zuweisen

        width_ = width;
        height_ = height_; 
        bpp_ = bpp; 
        windowed_ = windowed;
        
        shutdown();
        // DLL/Funktion laden

        dll_ = templates::loadDLL(L"d3d9.dll");
        if(dll_ == NULL)
        {
            EX(L"Can't load DLL 'd3d9.dll'");
        }
        Direct3DCreate9T Direct3DCreate9 = NULL;
        Direct3DCreate9 = templates::loadFunction<Direct3DCreate9T>(dll_, "Direct3DCreate9");
        if(Direct3DCreate9 == NULL)
        {
            EX(L"Can't load function 'Direct3DCreate9'");
        }
        // D3D object erstellen

        direct3d_ = Direct3DCreate9(D3D_SDK_VERSION);
        if(direct3d_ == NULL)
        {
            EX(L"Failed to create Direct3D- Object!");
        }
        
        _D3DCAPS9               caps;                   // Grafikkarten specs

        _D3DPRESENT_PARAMETERS_ present_parameters;     // Darstellung      

        _D3DDISPLAYMODE         display_mode;           // Farbtiefe des Desktops

        memset(&present_parameters, 0, sizeof(_D3DPRESENT_PARAMETERS_));
        memset(&caps, 0, sizeof(_D3DCAPS9));
        memset(&display_mode, 0, sizeof(_D3DDISPLAYMODE));

        if (direct3d_->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &display_mode) != D3D_OK)
        {
            EX(L"Failed to get display mode!");
        }

        // Grafikkarten specs holen

        if (direct3d_->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps) != D3D_OK)
        {
            EX(L"GetDeviceCaps() failed!");
        }

        // Darstellungsparameter

        present_parameters.EnableAutoDepthStencil   = true;                  // DepthStencil? Wir sagen ja!

        present_parameters.AutoDepthStencilFormat   = D3DFMT_D16;            // DepthStencil Format.

        present_parameters.hDeviceWindow            = window::getInstance().getHwnd();
        present_parameters.Windowed                 = windowed_;            // Fenstermodus

        present_parameters.SwapEffect               = D3DSWAPEFFECT_DISCARD;    // Swapeffect

        present_parameters.BackBufferCount          = 1;                        // Anzahl Backbuffer

        present_parameters.BackBufferWidth          = width_;                   // Auflösung: Breite

        present_parameters.BackBufferHeight         = height_;                  // Auflösung: Höhe

        present_parameters.PresentationInterval     = D3DPRESENT_INTERVAL_IMMEDIATE;    // Vsync (aus)

        present_parameters.BackBufferFormat         = display_mode.Format;   // Format des Desktops

        if(bpp_ == 16)
        {
            present_parameters.BackBufferFormat     = D3DFMT_R5G6B5;            // Farbtiefe

        }
        else
        {
            present_parameters.BackBufferFormat     = D3DFMT_X8R8G8B8;          // Farbtiefe

        }
        if(windowed_)
        {
            
        }
        
        // VertexProcessing

        unsigned long vp = D3DCREATE_HARDWARE_VERTEXPROCESSING;

        if(caps.VertexProcessingCaps == 0)
        {
            vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
        }

        // D3D Device erstellen

        HRESULT r = direct3d_->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, window::getInstance().getHwnd(), vp, &present_parameters, &device_);
        if(r != D3D_OK)
        {
            switch(r)
            {
                case D3DERR_DEVICELOST:
                        EX(L"1");
                    break;
                case D3DERR_INVALIDCALL: 
                        EX(L"2");
                    break;
                case D3DERR_NOTAVAILABLE:
                        EX(L"3");
                    break;
                case D3DERR_OUTOFVIDEOMEMORY:   
                        EX(L"4");
                    break;
            }
        }
    }
(Formatierung sieht hier blöd aus)
Hab schon mehrmals die present parameter umgestellt.
Im Fenstermodus gehts, aber im Vollbild nicht.

Als 2. hab ich noch ein Problem beim Beenden des Programms. (Hat nichts mit dem 1. zu tun, weils vorher schon da war)
Der wirft dann wohl immer ne Exception, aber die wird nicht ausgegeben(MsgBox). Nur in eine Datei geschrieben und im "Debug Output" steht:

Quellcode

1
First-chance exception at 0x7c81eb33 in Osera.exe: Microsoft C++ exception: debug::exception at memory location 0x0012f904.. 

Und die Exception, die in der Datei steht kommt hier her:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
void direct3d::endScene()
    {
        DEBUG;
        if(device_->EndScene() != D3D_OK)
        {
            EX(L"Failed to end render-scene!");
        }
        if(device_->Present(0,0,0,0) != D3D_OK)
        {
            EX(L"Failed to present scene!"); //DIESE HIER

        }
    }

Mit der Speicheradresse 0x7c81eb33 hab ich mal geguckt. Bin mir aber nicht sicher, ob ich das Richtig ääähh...wie auch immer. Die Adresse ist im Bereich der Kernel32.dll.

Weiter bin ich net gekommen. Deshalb frag ich hier mal nach Hilfe. ;)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

22.06.2006, 20:18

Funktioniert es, wenn du Direct3D auf die gewöhnliche Weise einbindest, also durch d3d9.lib (ohne die DLL per Hand zu laden)?

Anonymous

unregistriert

3

22.06.2006, 20:27

David Scherfgen
Müsste unwahrscheinlich sein, da sonst Casting- und Linkerfehler auftreten würden. Würde er durchkommen, käme er jedoch niemals auf ein gültiges D3D Objekt. Schnüffelt mir mehr nach fehlerhaften Presentparametern.

flux

Treue Seele

  • »flux« ist der Autor dieses Themas
  • Private Nachricht senden

4

22.06.2006, 21:21

Das Programm funktioniert im Fenstermodus, nur nicht im Vollbild. (jetzt beides^^)

Also die present_paramter sollten richtig sein. Ich hab nochmal bei deinen Tutorial geschaut. Nichts gefunden...nur das es funktionierte als ich das mal kopiert habe. Hab den Fehler jetzt gefunden.


C-/C++-Quelltext

1
2
3
4
5
6
7
void direct3d::init(unsigned int width, unsigned int height, unsigned int bpp, bool windowed)
    {
        DEBUG;
        // Werte an Attribute zuweisen

        width_ = width;
    >>  height_ = height_; // selbstzuweisung ?!?!?! 

//...


Aber der andere Fehler kommt immer noch, aber nru wenn man das PRogramm mit ALT + F4 beendet.

Werbeanzeige