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

11.12.2003, 21:28

Problem mit SetFVF

Während der Programmausführung kommt das Programm an eine Stelle wo das 3DDevice SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE). Immer wenn ich das Programm ausführe bewirkt das aber aus irgend einem Grund eine Access-Violation. Kann das irgendetwas mit falsch gesetzten Parametern der Schnittstelle zu tun haben oder weiss jemand woran das noch liegen könnte?

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
    D3DPRESENT_PARAMETERS params;
    p_D3D = Direct3DCreate9(D3D_SDK_VERSION);
    if(p_D3D == NULL)
    {
        MessageBox(NULL,"Fehler beim Erstellen des Direct3D-Objektes","Fehler",MB_OK|MB_ICONEXCLAMATION);
        return -1;
    }
    InitWindow(Caption,x,y, &hwnd);

    ZeroMemory(&params,sizeof(D3DPRESENT_PARAMETERS));
    params.BackBufferWidth = x;
    params.BackBufferHeight = y;
    params.BackBufferFormat = D3DFMT_X8R8G8B8;
    params.BackBufferCount = 1;
    params.MultiSampleType = D3DMULTISAMPLE_4_SAMPLES;
    params.MultiSampleQuality = (DWORD)1;
    params.SwapEffect = D3DSWAPEFFECT_DISCARD;
    params.hDeviceWindow = hwnd;
    params.Windowed = true;
    params.EnableAutoDepthStencil = true;
    params.AutoDepthStencilFormat = D3DFMT_D24S8;
    params.Flags = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    params.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
    params.PresentationInterval = D3DPRESENT_INTERVAL_DEFAULT;

    p_D3D->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,hwnd,D3DCREATE_HARDWARE_VERTEXPROCESSING,&params,&p_3DDevice);
    p_3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE);


Ich weiss nicht was ich da falsch gemacht habe. (Ist übrigens gut möglich dass sich dort noch andere Fehler verstecken. Ruhig sagen :) )

Order

2

11.12.2003, 21:35

naja ich denke mal CreateDevice schlägt fehl!.. wenn du dann natürlich SetFVF anwendest obwohl es ein Nullpointer ist , gibts nen Programm absturz.. solltest du genauso wie oben kontrollieren und wenn p_3DDevice == NULL ist Fehlermeldung ausgeben.. könnte natürlich daran liegen, dass deine Grafikkarte unter umständen einige Formate gar nicht unterstützt die du einfach so zuweißt in den PresentParameters... solltest du vorher checken ob die Graka die unterstützt.. aber ansonsten bin ich auch nur anfänger :wirbel:

3

12.12.2003, 15:00

:help: Das wars. Hatte Multi-Sampling an obwohl ich es im Fenstermodus laufen ließ, was zusammen nicht möglich war. Danke :huhu:

4

14.12.2003, 11:55

Mir ist bei dieser Sache mit der Zeit (ftime etc.) eine kleine frage gekommen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    {
        dwTime1 = timeGetTime();

        
        while(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }

        Move(fTime);
        Render(fTime);

        dwTime2 = timeGetTime();

        fTime = ((float)(dwTime2 - dwTime1) / 1000.0f);
        
    }

Nachdem die Sache einmal durchgelaufen ist habe ich im Debug-Modus überprüft welcher Wert in fTime steht. Zu meiner Verblüffung war das etwas in Richtung 3.123... . Sollte dort nicht etwa ein 0.0344 oder etwas in der Richtung drinstehen damit der Inhalt von Move und Render sich auch in der passenden Geschwindigkeit verändert? Bei Zahlen über 1 müssten die ja in jeden Frame sich viel schneller drehen als eigentlich gewünscht

Ist die einzige Erklärung, dass der Inhalt meiner Move und Render Funktionen ewig dauert (was er nicht tut) oder hab ich irgendwie die Rechung falsch aufgestellt?

Order

5

14.12.2003, 13:47

Also ich Debug-Modus brauchst du ja auch immer etwas Zeit um von Haltepunkt zu Haltepunkt zu kommen, da sind 3 seks durchaus normal. Ausserdem kann man den Wert einer Variable bei mir (VC++ .Net 7.0) immer erst in der nächsten Zeile auslesen, nachdem sie gesetzt wurde.

Aber ich hätte noch eine Frage an die Experten hier im Forum:

Zitat

Hatte Multi-Sampling an obwohl ich es im Fenstermodus laufen ließ, was zusammen nicht möglich war.

Schliessen sich Multi-Sampling und Windowed-Mode etwa gegenseitig aus? Bei mir scheint das Device damit keine Probleme zu haben, allerdings habe ich Tests gemacht, und konnte keinen Unterschied zwischen MultiSampling und nicht-MultiSampling erkennen, trotz Aktivierung des Renderstate D3DRS_MULTISAMPLEANTIALIAS in ersterm Fall. Könnte das am Fenster liegen?

Infos wären nett!
Euer Pirat!

6

15.12.2003, 00:19

Ob es einen Unterschied gibt, zwischen Multisampling und Nicht-Multisampling. Liegt wohl an der Einstellung selber. Aber Windowed Mode und Multisampling schliessen sich nicht gegenseitig aus. Es ist immer eine Frage ob die Grafigkarte das Unterstuetzt oder nicht.

Also immer erst alles abtesten was man brauch, damit solche Fehler nicht vorkommen. Am besten ist man schreibt sich eine kleine Klasse alles abtestet. Die kann man dann auch immer in jedem Projekt benutzen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

Werbeanzeige