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

06.11.2013, 14:45

CreateDevice schlägt trotz korrekter Auffüllung der Präsentationsstruktur fehl

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
pd3d = Direct3DCreate9(D3D_SDK_VERSION);
        if(!pd3d)
        {
            MessageBox(hwnd, "Ein Fehler ist aufgetreten! Bitte installieren sie DirectX 9", "Fehler", MB_ICONEXCLAMATION);
        }
        //Videomodi
        int inm = pd3d->GetAdapterModeCount(0, D3DFMT_R5G6B5);
        pmodes = new D3DDISPLAYMODE[inm];
        if(inm > 0)
        {
            for(int iMode = 0; iMode<inm; iMode++)
            {
                pd3d->EnumAdapterModes(0, D3DFMT_R5G6B5, iMode, &pmodes[iMode]);
                
            }
            delete[] pmodes;
        }
                // BACKBUFFER

        D3DDISPLAYMODE* pVideoModes = NULL;

        D3DFORMAT d3dFormats[] = {D3DFMT_X8R8G8B8, D3DFMT_A8R8G8B8, 
                                  D3DFMT_R5G6B5, D3DFMT_A2R10G10B10,
                                  D3DFMT_A1R5G5B5, D3DFMT_X1R5G5B5};

        D3DFORMAT* pFormat = NULL;

        for(int iNumFormats = 0; iNumFormats < 6; iNumFormats++)
        {
            if(SUCCEEDED(pd3d->CheckDeviceFormat(0, D3DDEVTYPE_HAL, D3DFMT_R5G6B5,
                                                 D3DUSAGE_RENDERTARGET, D3DRTYPE_SURFACE, d3dFormats[iNumFormats])))
            {
                if(SUCCEEDED(pd3d->CheckDeviceType(D3DADAPTER_DEFAULT, 
                                        D3DDEVTYPE_HAL, D3DFMT_R5G6B5, d3dFormats[iNumFormats], bWindowed)))
                {
                    d3dpp.BackBufferFormat          =       d3dFormats[iNumFormats];
                }
            }
        }

        // Z-STENCIL-BUFFER
        
        D3DFORMAT d3dZStencilFormats[] = {D3DFMT_D16_LOCKABLE, D3DFMT_D32, 
                                          D3DFMT_D15S1, D3DFMT_D24S8,
                                          D3DFMT_D24X8, D3DFMT_D24X4S4, 
                                          D3DFMT_D32F_LOCKABLE, 
                                          D3DFMT_D24FS8, D3DFMT_D16};

        for(int iNumFormats = 0; iNumFormats < 9; iNumFormats++)
        {
            if(SUCCEEDED(pd3d->CheckDeviceFormat(0, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, D3DUSAGE_DEPTHSTENCIL,
                                                 D3DRTYPE_SURFACE, d3dZStencilFormats[iNumFormats])))
            {
                if(SUCCEEDED(pd3d->CheckDepthStencilMatch(0, D3DDEVTYPE_HAL, D3DFMT_R5G6B5, 
                                                    d3dpp.BackBufferFormat, d3dZStencilFormats[iNumFormats])))

                {
                    d3dpp.EnableAutoDepthStencil        =       TRUE;
                    d3dpp.AutoDepthStencilFormat        =       d3dZStencilFormats[iNumFormats];
                }
                else
                {
                    d3dpp.EnableAutoDepthStencil        =       FALSE;
                }
  
            }
            else
            {
                d3dpp.EnableAutoDepthStencil        =       FALSE;
            }
        }

        // Multisampling

        D3DMULTISAMPLE_TYPE d3dMultiSampleType[] = {D3DMULTISAMPLE_2_SAMPLES, D3DMULTISAMPLE_3_SAMPLES,
                                                    D3DMULTISAMPLE_4_SAMPLES, D3DMULTISAMPLE_5_SAMPLES,
                                                    D3DMULTISAMPLE_6_SAMPLES, D3DMULTISAMPLE_7_SAMPLES,
                                                    D3DMULTISAMPLE_8_SAMPLES, D3DMULTISAMPLE_8_SAMPLES,
                                                    D3DMULTISAMPLE_9_SAMPLES, D3DMULTISAMPLE_9_SAMPLES,
                                                    D3DMULTISAMPLE_10_SAMPLES, D3DMULTISAMPLE_11_SAMPLES,
                                                    D3DMULTISAMPLE_12_SAMPLES};
        DWORD dwpQualityLevels;

        for(int iNumSamples = 0; iNumSamples < 16; iNumSamples++)
        {
            if(SUCCEEDED(pd3d->CheckDeviceMultiSampleType(0,D3DDEVTYPE_HAL, d3dpp.BackBufferFormat, bWindowed, d3dMultiSampleType[iNumSamples], &dwpQualityLevels)))
            {
                if(dwpQualityLevels > 0)
                {
                    if(SUCCEEDED(pd3d->CheckDeviceMultiSampleType(0,D3DDEVTYPE_HAL, d3dpp.AutoDepthStencilFormat, bWindowed, d3dMultiSampleType[iNumSamples], &dwpQualityLevels)))
                    {
                        d3dpp.MultiSampleType               =           d3dMultiSampleType[iNumSamples];
                        d3dpp.MultiSampleQuality            =           dwpQualityLevels;
                    }
                    else
                    {
                        d3dpp.MultiSampleType               =           D3DMULTISAMPLE_NONE;
                    }
                }
                else
                {
                    d3dpp.MultiSampleType               =           D3DMULTISAMPLE_NONE;
                }

            }
            else
            {
                d3dpp.MultiSampleType               =           D3DMULTISAMPLE_NONE;
            }
        }
        
    
        
        ZeroMemory(&d3dpp, sizeof(d3dpp));
        d3dpp.BackBufferWidth               =           pmodes[inm-1].Width;
        d3dpp.BackBufferHeight              =           pmodes[inm-1].Height;
        d3dpp.BackBufferCount               =           1;
        d3dpp.SwapEffect                    =           D3DSWAPEFFECT_DISCARD;
        d3dpp.hDeviceWindow                 =           hwnd;
        d3dpp.Windowed                      =           bWindowed;
        d3dpp.Flags                         =           D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
        d3dpp.FullScreen_RefreshRateInHz    =           pmodes[inm-1].RefreshRate;
        d3dpp.PresentationInterval          =           D3DPRESENT_INTERVAL_DEFAULT;

        if(FAILED(pd3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, &pDevice)))
        {
            MessageBox(NULL,"Ein Fehler beim Erstellen des Device!","Fehler", MB_ICONEXCLAMATION);
        }

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

06.11.2013, 18:05

Ach nee, was es nicht alles gibt. Danke fuer deine Mitteilung!

CentuCore

Frischling

Beiträge: 43

Wohnort: Wien

  • Private Nachricht senden

3

06.11.2013, 18:43

Ein gängiger Fehler ist die Qualität des Multisampling falsch anzugeben.
Diese ist null-basiert, sprich wenn du als Anzahl zwei zurück gegeben bekommst, sind folgende Werte erlaubt: 0, 1.
Sprich 0 ist immer gültig (da min. eine vorhanden sein muss), genau so wie MaxQuality - 1.

Abgesehen davon solltest du lieber ein Makro à la "#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))" und keinen hardcodierten Wert für deine for-Schleifen verwenden, da dann Fehler wie beim Multisample-Test entstehen und du auf 16 Elemente zugreifst obwohl nur 13 vorhanden sind.

Desweitern musst du beim Setzen der Bildwiederholrate prüfen ob du ein Device für den Vollbild- oder Fenstermodus erstellst, da dann jeweils andere Werte verlangt werden. (http://msdn.microsoft.com/en-us/library/…8(v=vs.85).aspx)


Edit: Ich bin ebenfalls TGGCs Meinung, dass du zumindest eine Bitte/Frage hättest vormulieren können. (Zehn Sekunden sind nicht zuviel verlangt)

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »CentuCore« (06.11.2013, 19:12)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

06.11.2013, 18:49

Wieso hast du deinen anderen Thread als "gelöst" markiert, wenn du doch scheinbar immer noch das Problem hast?!

5

06.11.2013, 18:56

Ich werde meien Frage beim nächsten mal deutlicher stellen. Und was den Thread angeht so habe ich dies in einem Moment große Unachtsamkeit getan. sry

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »hoxplus« (06.11.2013, 19:02)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

06.11.2013, 19:03

Es gehört sich nicht, hier einfach einen Haufen Code reinzuposten ohne irgendeine Art von Beschreibung des Fehlers oder eine konkrete Frage.
Du hattest scheinbar noch nicht einmal Zeit für ein "Vielen Dank für eure Hilfe!" oder "Könnt ihr mir bitte helfen?".

7

06.11.2013, 19:13

#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0]))

Preprocessor ist so "Old-School"

C-/C++-Quelltext

1
2
3
4
5
template<typename T, size_t N>
constexpr size_t ARRAY_SIZE(const T(&) [N])
{
    return N;
}
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

wluc-16

Treue Seele

Beiträge: 212

Wohnort: in der Nähe von Bielefeld :D

Beruf: Schüler

  • Private Nachricht senden

8

06.11.2013, 19:25

Ich bekomme diesen Fehler auch entweder seitdem ich auf Visual Studio 2013 umgestiegen oder weil ich die Visual Studio-internen Headerdateien verwende, da bin ich mir nicht ganz sicher.
Vielleicht hilft das ja...

EDIT: Ne, daran liegt es wahrscheinlich doch nicht. :whistling: Ich habe nur versehentlich Windowed auf FALSE gesetzt ohne Angaben zum Vollbild, Backbuffer, etc. zu machen :dash:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wluc-16« (06.11.2013, 19:42)


9

06.11.2013, 21:04

Es gehört sich nicht, hier einfach einen Haufen Code reinzuposten ohne irgendeine Art von Beschreibung des Fehlers oder eine konkrete Frage.
Du hattest scheinbar noch nicht einmal Zeit für ein "Vielen Dank für eure Hilfe!" oder "Könnt ihr mir bitte helfen?".

Das ist mir klar! Ich hatte auch gar nicht geplant das in einen neuen Thread zu packen. Ich habe
nur leider keine Erfahrung mit Foren, da ich normalerweise keinen Gebrauch davon mache. Ich
bitte darum dies zu entschuldigen.

Werbeanzeige