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

01.08.2012, 12:29

DirectX CreateVertexBuffer() Fehler

Hallo liebe Community,

ich habe mich ein wenig mit der DirectX Programmierung beschäftigt (C++), aber bei meinem Code, wo ich ein Dreieck erzeugen will, geht das irgentwie nicht.
Bei CreateVertexBuffer haut das mein Programm voll raus, und ich habe keine Ahnung wieso.

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
HRESULT D3DGraphic::InitD3D(HWND hWnd)
{
    this->d3d=Direct3DCreate9(D3D_SDK_VERSION);

    ZeroMemory(&this->d3dpp, sizeof(this->d3dpp));

    this->d3dpp.Windowed = true;
    this->d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    this->d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    //this->d3dpp.MultiSampleType = D3DMULTISAMPLE_16_SAMPLES;
    //this->d3dpp.hDeviceWindow = hWnd;

    CUSTOMVERTEX vertices[] = 
    {
        { 150, 50,  0.5, 1, 0xffff0000, },
        { 250, 250, 0.5, 1, 0xff00ff00, },
        { 50,  250, 0.5, 1, 0xff00ffff, },
    };
    
    if(!this->d3ddevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &this->d3dvb, NULL))
        return E_FAIL;
    
    void* pVertices;

    if(!this->d3dvb->Lock(0, sizeof(vertices), (void**)&pVertices, 0))
        return E_FAIL;

    memcpy(pVertices, vertices, sizeof(vertices));

    this->d3dvb->Unlock();


    this->d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &this->d3dpp, &this->d3ddevice);
    return S_OK;
}


Kann mir jemand helfen? Ich habe das gesamte Projekt mal hochgeladen.

https://www.dropbox.com/s/q9y85tkxya07bq6/Game04.zip

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

2

01.08.2012, 12:54

Ich glaube niemand wird sich die Mühe machen dein Projekt runterzuladen.

Eine Meldung des Compilers wäre viel hilfreicher. :D

Sticht mir gerade so ins Auge.

C-/C++-Quelltext

1
2
3
...
this->d3dvb->Lock(0, 0, (void**)&pVertices, 0);
...


Noch was ...

C-/C++-Quelltext

1
 this->d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &this->d3dpp, &this->d3ddevice);


Wie soll dein Programm den Vertex Buffer erzeugen, wenn du den Device Context erst im letzten Schritt erzeugst?

C-/C++-Quelltext

1
this->d3ddevice->CreateVertexBuffer(...);


Schau dir am noch einmal ganz genau an, wie man DirectX initialisiert.

Gruß

fb

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Fireball« (01.08.2012, 13:18)


3

01.08.2012, 13:17

CreateVertexBuffer Fehler

Das Programm wurde erfolgreich erstellt, nur ich bekomme den vielsagenden Error:

"Unbehandelte Ausnahme bei 0x770515de in Game04.exe: 0xC0000005: Zugriffsverletzung beim Lesen an Position 0x00000000."
Ich habe das Programm mit Einzelschritten durchforstet und habe gemerkt, dass der Error kurz nach

C-/C++-Quelltext

1
2
if(!this->d3ddevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &this->d3dvb, NULL))
        return E_FAIL;

kommt. :dash:

Edit: Ahh ja DANKE es funktioniert jetzt! Ich habe die CreateDevice Funktion vor die CreateVertexBuffer Funktion getan und jetzt funktioniert es!!! DANKE :D

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kaeru« (01.08.2012, 13:27)


Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

4

01.08.2012, 13:21

Um den d3ddevice nutzen zu können musst du ihn auch erstmal mit d3d->CreateDevice(...) initialisieren. Klar, dass dir nen null ptr um die Ohren fliegt.

C-/C++-Quelltext

1
2
3
4
...
this->d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &this->d3dpp, &this->d3ddevice);

this->d3ddevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &this->d3dvb, NULL);

5

01.08.2012, 13:38

DANKE!!! Es funktioniert aber jetzt habe ich das Problem dass er das Dreieck irgentwie nicht rendert :pinch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
HRESULT D3DGraphic::Render()
{
    this->d3ddevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(128, 0, 0), 1.0f, 0);
    this->d3ddevice->BeginScene();
    // Render code anfang

    // Vertices
    this->d3ddevice->SetStreamSource(0, this->d3dvb, 0, sizeof(CUSTOMVERTEX));
    this->d3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    this->d3ddevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);



    // Render code ende
    this->d3ddevice->EndScene();
    this->d3ddevice->Present(NULL, NULL, NULL, NULL);
    return S_OK;
}


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
D3DGraphic CD3D;

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR cmdLine,int nCmdShow )
{
    // Register the window class
    WNDCLASSEX wc =
    {
        sizeof( WNDCLASSEX ), CS_CLASSDC, MsgProc, 0L, 0L,
        GetModuleHandle( NULL ), NULL, NULL, NULL, NULL,
        "Direct3D", NULL
    };
    RegisterClassEx( &wc );



    // Create the application's window
    HWND hWnd = CreateWindow( "Direct3D", "Engine",
                            WS_OVERLAPPEDWINDOW, 100, 100, 800, 600,
                            NULL, NULL, wc.hInstance, NULL );

    CD3D.InitD3D(hWnd);

    // Show the window
    ShowWindow( hWnd, SW_SHOWDEFAULT );
    UpdateWindow( hWnd );

    // Enter the message loop
    MSG msg;
    ZeroMemory(&msg, sizeof(msg));

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

    CD3D.Clean();

    UnregisterClass( "Direct3D", wc.hInstance );
    return 0;
}


Haben sie noch eine Idee? :rolleyes:

Fireball

Alter Hase

Beiträge: 415

Wohnort: Werne

Beruf: Dipl. Inf.

  • Private Nachricht senden

6

01.08.2012, 15:50

Ich denke es liegt daran. Bevor du etwas rendern kannst musst du erstmal dem Device mitteilen, was da für ein Vertex Format kommt.

C-/C++-Quelltext

1
2
this->d3ddevice->SetFVF(D3DFVF_CUSTOMVERTEX);
this->d3ddevice->SetStreamSource(0, this->d3dvb, 0, sizeof(CUSTOMVERTEX));

:search:

Ach ja nochwas beim Sie bekomme ich immer Pickel ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Fireball« (01.08.2012, 15:56)


Werbeanzeige