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

Sheddex

unregistriert

1

19.05.2006, 23:00

Eine nicht funktionierende Direct3D Initialisierungsfunktion

Eine Woche versuche ich es nun, eine Woche scheitere ich :(
Es geht um eine simple Funktion, die Direct3D initialisieren soll, vorerst ohne Einstellungsmöglichkeiten... Das Lustige: Es ging mal... aber dann wollte ich es "verbessern", und von da an ging es nicht mehr ;)
Ich habe es oft mit meinem (funktionierenden" ersten Dreieck verglichen, aber meiner Meinung nach sieht alles fast gleich aus...
Hier der wichtigste Codeausschnitt:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
void DF_ConfigurationDialog (HINSTANCE Instance, HWND Window, IDirect3DDevice9 **ppDirect3DDevice)
{
     DF_Configuration Configuration;

     if (SUCCEEDED (Configuration.pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Window, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &Configuration.Direct3DParameters, ppDirect3DDevice)))
     {
        MessageBox (NULL, "Es funktioniert endlich!!!", "Erfolgreich!", MB_ICONEXCLAMATION);
     }
}


Die Einstellungen werden im Konstruktor der Konfigurations-Klasse automatisch auf "Standardwerte" gesetzt.

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
class DF_Configuration
{
    public:

        //Direct3D

        IDirect3D9            *pD3D;
        D3DPRESENT_PARAMETERS Direct3DParameters;
        D3DDISPLAYMODE        Direct3DDisplayMode;
        D3DCAPS9              Direct3DCaps;

        DF_Configuration ()
        {
            //Direct3D

            pD3D = NULL;
            pD3D = Direct3DCreate9 (D3D_SDK_VERSION);

            pD3D->GetAdapterDisplayMode (D3DADAPTER_DEFAULT, &Direct3DDisplayMode);
            pD3D->GetDeviceCaps (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &Direct3DCaps);
            
            Direct3DParameters.BackBufferWidth        = GetSystemMetrics (SM_CXSCREEN);
            Direct3DParameters.BackBufferHeight       = GetSystemMetrics (SM_CYSCREEN);
            Direct3DParameters.BackBufferFormat       = Direct3DDisplayMode.Format;
            Direct3DParameters.BackBufferCount        = 1;
            Direct3DParameters.MultiSampleType        = D3DMULTISAMPLE_2_SAMPLES;
            Direct3DParameters.MultiSampleQuality     = 1;
            Direct3DParameters.SwapEffect             = D3DSWAPEFFECT_DISCARD;
            Direct3DParameters.hDeviceWindow          = NULL;
            Direct3DParameters.Windowed               = FALSE;
            Direct3DParameters.EnableAutoDepthStencil = TRUE;
            Direct3DParameters.AutoDepthStencilFormat = D3DFMT_D16;
            Direct3DParameters.PresentationInterval   = D3DPRESENT_INTERVAL_IMMEDIATE;
        }

        ~DF_Configuration ()
        {
            pD3D->Release ();
        }
};


Ich hoffe das mir hier jemand helfen kann... es ist echt zum verzweifeln :(

Anonymous

unregistriert

2

20.05.2006, 09:31

DarkHunter
1. Niemals einen Pointer wie z. B. den des Direct3D Objektes über einen Konstruktor initialisieren! Du hast keinerlei Fehlerabfrage und Rückgabewerte. Kurz: Intern weißt Du nicht ob Du nun ein Objekt hast oder nicht und extern weißt Du nicht ob alles Okay ist :arrow: kann derbst knallen.

2. Du holst die Caps ohne Grund! Wird nirgendwo benutzt, dazu testest Du auch hier nicht, ob pD3D ein gültiger Pointer ist, wäre er NULL, ich sag nur aua. Dazu fragst Du nicht ab ob es mit den Caps geklappt hat.

3. Den AdapterDisplayMode kann man i.d.R. selten für Vollbildanwendungen nehmen, teste doch mal was der für ein Format Dir git, dass Du benutzt, ohne es zu Testen ;)

4. GetSystemMetrics - Guter Ansatz, aber nur für Fensteranwendungen. Deine GraKa kann viele Modis z. B. nicht die Windows kann. Die GraKa kann nur eine Breite von fest definierten Dimensionen in BreiteXHöheXAuflösung darstellen. Hat Dein Desktop die Auflösung 1152x964 könnte Direct3D dies z. B. nicht darstellen im Fenstermodus.

Auch hier fehlen wieder Tests!

5. Warst Du nicht der jenige den ich angemotzt habe mit Direct3DParameters.MultiSampleType ? Wenn nein: WEG DAMIT! Das hat in den Anfangsstadien noch nichts zu suchen! Dazu testest absolut nirgendwo ob Deine GraKa das überhaupt kann. Kann sie es nicht, schlägt CreateDevice fehl und der User sitzt blöd doof rum, da der Coder einfach auf Tests gepfiffen hat! :arrow: Minderwertige Programme.

6. Direct3DParameters.hDeviceWindow << Auf welches Fenster soll Dein Programm rendern?

7. Der Destructor? Was ist wen pD3D NULL ist, da es fehl geschlagen ist? Das knallt Dir in den Händen weg!

8. D3DDEVTYPE_HAL, auch ganz schön, aber auch hier: WO sind die Tests ob Deine GraKa das überhaupt unterstützt? Nirgendwo! :arrow: Kann knallen.

9- http://germangamedev.de/index.php?site=article&id=4 << Einfache Abfragen erleichtern DIR das leben.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

20.05.2006, 10:01

Direct3DParameters.hDeviceWindow muss garnicht gesetzt sein ;) aber sonst stimme ich nix da zu. Außer bei GetSystemMetrics. Damit hatte ich noch nie Probleme, wobei ich ehrlich sagen muss, dass ich meine Systeme nur mit Standardauflösungen wie 800x600, 1024x768 oder 1400x1050 betreibe.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

4

20.05.2006, 10:09

Nox
hDeviceWindow
If full-screen, this is the cover window. If windowed, this will be the default target window for IDirect3DDevice9::Present. If this value is NULL, the focus window will be taken.

Mag sein, aber man sollte nicht mit dem Feuer spielen ;)

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

5

20.05.2006, 11:51

Wenn man Exceptions benutzt kann man das Device ohne Probleme im Konstruktor erstellen und muss im Dtor noch nicht mal prüfen, dass das Device da ist.

Ciao

Anonymous

unregistriert

6

20.05.2006, 11:53

Helmut
Steht gerade nicht zur Debatte. Ich denke weniger, das ein Anfänger der gerade beim initialisieren ist, weiß was Exceptions sind. Außerdem haben Exceptions nicht immer Vorteile.

Sheddex

unregistriert

7

21.05.2006, 12:06

Erstmal danke für die Antworten... ich werde jetzt zuerst mal die Standard-Initialisierung aus dem Konstruktor holen, und in eine Methode packen.

@nix da: Ja, ich teste hier wirklich kaum, aber das mag daran liegen dass es erstmal funktionieren soll... das meine 7800GTX das alle unterstützt weiß ich. Das soll ja später ein Konfigurationsdialog werden, also muss ich ja dann abfragen...

Anonymous

unregistriert

8

21.05.2006, 12:56

DarkHunter
Teste! Dann hast Du diese Probleme nicht! Und ob Deine GraKa XYZ Unterstützt oder nicht, das weißt Du nicht. Was auf der Verpackung steht und was Direct3D Dir sagen sind 2 Welten.

Das ist wie bei AMD: Da steht was schönes drauf, unter der Haube ist aber was komplett anderes. Wissen bedeutet nicht Wissen.

9

21.05.2006, 15:18

Frage am Rande: Was hast du gegen AMD? Ich bin mit meinem Prozessor zufrieden. Egal. Jedem das seine.


Zum Thema: Wenn er doch nur 2faches Antialiasing setzt, was seine GraKa zu 100% vollständig untersützt, muss er das nicht testn, oder?

Anonymous

unregistriert

10

21.05.2006, 16:13

FOGX
Wen interessiert ob die GraKa das unterstützt? Direct3D muss damit klar kommen, die GraKa, der Treiber usw. das sind Faktoren die muss man einfach testen!

Und gegen AMD habe ich nichts, nur es ist nicht das drin was auf der Verpackung steht.

Werbeanzeige