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

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

1

29.11.2009, 19:14

VertexBuffer erstellen scheitert

Hallo!
Ich hab mir gerade das Tutorial der MSDN für DirectX bzw. Direct3D durchgelesen, wollte es ausprobieren, kam auch bis zum Erstellen von Direct3D und einem VertexBuffer, jedoch bricht das Programm beim Starten ab (Vista Meldung: Programm funktioniert nicht mehr).
Hier mal der Code:

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
// Initialize the triangle

HRESULT InitializeTriangle()
{
    // Set vertice 1

    cvTriangle[0].x = 150.0f;
    cvTriangle[0].y =  50.0f;
    cvTriangle[0].z =   0.5f;
    cvTriangle[0].rhw = 1.0f;
    cvTriangle[0].color = 0xff000000;

    // Set vertice 2

    cvTriangle[1].x = 250.0f;
    cvTriangle[1].y = 250.0f;
    cvTriangle[1].z =   0.5f;
    cvTriangle[1].rhw = 1.0f;
    cvTriangle[1].color = 0x00ff0000;

    // Set vertice 3

    cvTriangle[2].x =  50.0f;
    cvTriangle[2].y = 250.0f;
    cvTriangle[2].z =   0.5f;
    cvTriangle[2].rhw = 1.0f;
    cvTriangle[2].color = 0x0000ff00;

    // Fill the VertexBuffer

    if((p_D3DDevice->CreateVertexBuffer(sizeof(cvTriangle),
              0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &p_VB, NULL))!=D3D_OK)
        return E_FAIL;

    VOID* p_Vertices;

    // Lock

    if(FAILED(p_VB->Lock(0, sizeof(cvTriangle), (void**)&p_Vertices, 0)))
        return E_FAIL;

    memcpy(p_Vertices, cvTriangle, sizeof(cvTriangle));

    // Unlock

    p_VB->Unlock();


    return S_OK;
}

Die Funktion wird in WM_CREATE aufgerufen.
Hat vielleicht jemand eine Idee, warum das Programm abbricht?
Benutze Code::Blocks mit Visual C++ 2008 Compiler.
Schonmal Danke im Voraus.

MfG Phil239

EDIT: Hier das ganze Projekt: Klick
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

2

29.11.2009, 20:29

C-/C++-Quelltext

1
CreateVertexBuffer(sizeof(cvTriangle) * 3


und mein locken auch mal 3, denn du hast ja schließlich 3 vertices und nicht eins.

3

29.11.2009, 20:31

Zitat

(Vista Meldung: Programm funktioniert nicht mehr).

Ja, Vista immer mit seinen unglaublich Hilfreichen Meldungen. ;)
Ist das denn bei Win7 auch so ?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

29.11.2009, 23:07

Zitat von »"Deppomat"«

C-/C++-Quelltext

1
CreateVertexBuffer(sizeof(cvTriangle) * 3


und mein locken auch mal 3, denn du hast ja schließlich 3 vertices und nicht eins.

Schon OK, wenn cvTriangle ein Array ist. Dann ist sizeof(cvTriangle) die Größe des Arrays.

5

30.11.2009, 01:29

stimmt! Ich nimm immer die größe der Klasse/Struktur mal die Anzahl der Elemente, ganz übersehen das er die größe des Arrays nimmt.

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

6

30.11.2009, 17:45

Jetzt hab ich SCHONWIEDER meinen Fehler selber gefunden:
Erst hatte ich InitializeTriangle() in WM_CREATE aufgerufen.
Es muss aber in der WinMain aufgerufen werden:

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
//--------------------------------------------------------------------------------------

// WinMain

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
{
    // Register the Window class

    WNDCLASSEX wc = {sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
                     GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
                     "Direct3D Tutorial", NULL};

    RegisterClassEx(&wc);

    // Create the window

    HWND hwnd = CreateWindow("Direct3D Tutorial", "Direct3D Tutorial 02: Rendering Vertices",
                             WS_OVERLAPPEDWINDOW, 0, 0, 400, 400,
                             GetDesktopWindow(), NULL, hInst, NULL);

    // Show the window

    ShowWindow(hwnd, SW_SHOW);

    // Get DX version

    if(NULL == (p_D3D = Direct3DCreate9(D3D_SDK_VERSION)))
        return E_FAIL;

    // Fill the presenting parameters

    D3DPRESENT_PARAMETERS d3dpp;
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = true;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

    // Create the Device

    if(FAILED(p_D3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,
                                  D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                  &d3dpp, &p_D3DDevice)))
        return E_FAIL;

    MSG msg;

    // HIER: ////////////////////////////////////////////////////////////////////////

    InitializeTriangle();
    //////////////////////////////////////////////////////////////////////////////////


    ZeroMemory(&msg, sizeof(msg));

    // Handle the messages

    while(msg.message != WM_QUIT)
    {
        if(PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else Render();
    }

    return msg.wParam;
}


Aber warum kann es nicht auch in WM_CREATE aufgerufen werden?
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

7

30.11.2009, 17:48

Wie wärs mit GetMessage ?

Peek macht ja was anderes, oder ?? Kann auch sein, dass ich mich irre.


Ansonsten mal Code von MsgProc her. ;)

GR-PA

Treue Seele

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

8

30.11.2009, 19:52

Der Unterschied zw. GetMessage und PeekMessage ist, dass GetMessage so lange wartet, bis es eine Nachricht erhält, und PeekMessage nicht, weshalb man bei Spielen immer PeekMessage verwenden sollte.
Ob er jetzt PeekMessage oder GetMessage verwendet ist in dem Fall egal, da CreateWindow die Nachrichtenfunktion des Fensters beim Senden von WM_CREATE direkt aufruft. (Weshalb der Code auch nicht funktioniert, da das Device beim behandeln von WM_CREATE noch nicht erstellt wurde)
Signaturen werden überbewertet

9

30.11.2009, 20:47

Oh, mist. Das erklärt einiges an Problemen die ich mit meinen Programmen hatte, solange ich nichts gemacht habe. :oops:

Phil239

Frischling

  • »Phil239« ist der Autor dieses Themas

Beiträge: 79

Beruf: Student

  • Private Nachricht senden

10

01.12.2009, 17:12

@E122:
PeekMessage wird im Petzold so hier beschrieben:

Zitat

Solange Sie nicht gerade vor immer wieder zitierten ausrangierten 386er-Laptop sitzen, auf dem sich ein Dutzend Hintergrundprogramme um nicht vorhandene Rechenzeit schlägt, befindet sich allerdings auch Windows den meisten Teil der Zeit im Leerlauf - tut also nichts weiter, als auf Tastatur- oder Mausereignisse zu warten. Ob es eine Möglichkeit gibt, sich von diesem Kuchen ein möglichst dickes Stück abzuschneiden und die Kontrolle nur dann zurückzugeben wenn tatsächlich irgendeine Nachricht zur Bearbeitung ansteht?

Genau darin liegt einer der Zwecke von PeekMessage - einer Funktion, die sich beispielsweise so aufrufen lässt:

PeekMessage (&msg, NULL, 0, 0, PM_REMOVE) ;


GetMessage so hier:

Zitat

Ein Aufruf von GetMessage in der Form

GetMessage (&msg, NULL, 0, 0) ;

liest die jeweils nächste Nachricht aus der Warteschlange und übergibt GetMessage einen Zeiger auf die (programmeigene) Variable msg.


@GR-PA:

Zitat

(Weshalb der Code auch nicht funktioniert, da das Device beim behandeln von WM_CREATE noch nicht erstellt wurde)


Warum bin ich da nicht drauf gekommen?? :lol:
Der Computer ist die logische Weiterentwicklung des Menschen: Intelligenz ohne Moral.

Werbeanzeige