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

26.05.2016, 09:22

GetAdapterModeCount() liefert immer den Wert 0 zurück!

Hallo,
ich habe ein Problem bezüglich des Listings 2.52 aus dem Buch 3D-Spieleprogrammierung mit DirectX9 und C++ von David Scherfgen.
GetAdapterModeCount liefert mir immer 0 zurück; bzw. die Variable iNumModes ist bei mir immer 0.
Ich weiß wirklich nicht was ich falsch gemacht haben soll, und ich habe auch schon alle Pixelformate ausprobiert.
Es funktioniert mit keinem einzigen. :dash:
Hier der Code:

Quellcode

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
#include<TriBase.h>
#include<stdio.h>
#include<d3d9.h>
#include<dxerr9.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, char* pcCmdLine, int iShowCmd)
{
    PDIRECT3D9 pD3D = Direct3DCreate9(D3D_SDK_VERSION);
    if (!pD3D)
    {
        MessageBox(NULL, (LPCWSTR)L"Fehler beim Erzeugen der Direct3D Schnittstelle", (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);
        return 1;
    }

    int iNumAdapters = pD3D->GetAdapterCount();

    D3DADAPTER_IDENTIFIER9* pAdapter = new D3DADAPTER_IDENTIFIER9[iNumAdapters];

    for (int i = 0; i < iNumAdapters - 1; i++)
    {
        if (FAILED(pD3D->GetAdapterIdentifier(i, 0, &pAdapter[i])))
        {
            MessageBox(NULL, (LPCWSTR)L"Fehler beim Abrufen der Adapter-Infos", (LPCWSTR)L"Fehler", MB_OK | MB_ICONEXCLAMATION);

            pD3D->Release();
            delete[] pAdapter;
            return 1;
        }

        char acAdapterInfo[1024];
        sprintf(acAdapterInfo, "Adapter-ID: %d\n""Name: %s\n""Treiber: %s\n""Treiberversion: %d", i, pAdapter[i].Description, pAdapter[i].Driver, pAdapter[i].DriverVersion);
        MessageBoxA(NULL, acAdapterInfo, "Adapter gefunden", MB_OK | MB_ICONINFORMATION);

        int iNumMode = pD3D->GetAdapterModeCount(i, D3DFMT_X8B8G8R8);
        if (iNumMode > 0)
        {
            D3DDISPLAYMODE* pModes = new D3DDISPLAYMODE[i];
            char acModes[16384] = "";

            for (int j = 0; j < iNumMode; j++)
            {
                pD3D->EnumAdapterModes(i, D3DFMT_X8B8G8R8, j, &pModes[j]);

                sprintf(acModes, "%s\nModus %d: %dx%d bei %d Hz (0:Standard)", acModes, j, pModes[j].Width, pModes[j].Height, pModes[j].RefreshRate);
            }

            MessageBoxA(NULL, acModes, "Verfügbare 32-Bit-Videomodi", MB_OK | MB_ICONINFORMATION);

            delete[] pModes;
        }
    }

    pD3D->Release();
    delete[] pAdapter;
    return 0;
}

Ich würde mich über Hilfe freuen, da ich weiß, dass diese Frage schon oft aufgetaucht ist, aber leider habe ich die dort
vorgeschlagenen Lösungsansätze erfolglos anzuwenden versucht. ?(
MfG
FMRS

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

26.05.2016, 10:22

Ich habe bei mir schnell nachgeschaut. Ich benutze immer D3DADAPTER_DEFAULT und klapper die Adapter nur dann ab, wenn ich das NVidiaPerfHUD-Device finden will. Was mit der Erfindung von NSight wahrscheinlich inzwischen obsolet ist.

Probier mal das Enumerieren der Auflösungen mit ADAPTER_DEFAULT und guck, was Du kriegst.

Randnotiz: gewöhne Dir mal modernes C++ an. new [] ist nicht nur gefährlich, sondern außerdem viel zu mühsam, wenn Du das gleiche auch mit std::vector<Typ> kriegen kannst. Der Vector hat genau für solche Zwecke auch ein data() und einen Konstruktor, der eine initiale Anzahl Elemente mit Vorgabewert erstellt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

3

26.05.2016, 12:39

Vielen herzlichen Dank! ;)

Hi,
ja mit D3DADAPTER_DEFAULT funktioniert es endlich! DANKE!! :) :D
Du weißt ja gar nicht wie lange ich schon nach ner Lösung gesucht hatte.

MfG
FMRS

PS.: Danke für den Tipp mit dem moderneren C++:) werds mir merken;) :thumbsup:

Werbeanzeige