Frage bezüglich Vertexbuffer



  • Moin erstmal,

    also um es vorweg zu nehmen ich bin was Graphicprogrammierung mit DirectX9 angeht ein blutiger Anfänger.

    erstmal ein Codeausschnitt

    #define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)
    
    struct CUSTOMVERTEX
    {
        FLOAT x, y, z, rhw;    // from the D3DFVF_XYZRHW flag
        DWORD color;    // from the D3DFVF_DIFFUSE flag
    };
    
    LPDIRECT3DVERTEXBUFFER9 t_buffer =NULL;
    
    void init_graphics()
    {
        // create three vertices using the CUSTOMVERTEX struct built earlier
        CUSTOMVERTEX t_vert[] =
        {
            { 320.0f, 50.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 0, 255), },
            { 520.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(0, 255, 0), },
            { 120.0f, 400.0f, 0.5f, 1.0f, D3DCOLOR_XRGB(255, 0, 0), },
        };
    
        // create the vertex and store the pointer into t_buffer, which is created globally
        d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                                   0,
                                   CUSTOMFVF,
                                   D3DPOOL_MANAGED,
                                   &t_buffer,
                                   NULL);
        //--------------------------
        VOID* pVoid;    // die folgenden 2 Zeilen verstehe ich nicht richtig
    
        t_buffer->Lock(0, 0, (void**)&pVoid, 0);    // lock the vertex buffer
        memcpy(pVoid, t_vert, sizeof(t_vert));    // copy the vertices to the locked buffer
        t_buffer->Unlock();    // unlock the vertex buffer
    
        return;
    }
    

    Also dieser Code ist einem Tutorial entnommen.

    Ich verstehe allerdings diese Void-Pointer Sache nicht so richtig.

    VOID* pVoid;
    

    hier wird ein Void-Pointer deklariert, jedoch ohne Initialisierung

    Wie kann dann in folgender Zeile &pVoid stehen?

    t_buffer->Lock(0, 0, (void**)&pVoid, 0);
    

    Ich verstehe "(void**)&pVoid" nicht.

    Für ne kurze erklärung wäre ich sehr dankbar.

    Mit freundlichen Grüßen

    Don Quijote



  • Dieser Thread wurde von Moderator/in rapso aus dem Forum Spiele-/Grafikprogrammierung in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


  • Administrator

    Ein Zeiger ist nichts anderes als ein Speicherbereich, welcher die Adresse speichert. Auf einem 32-Bit System ist ein Zeiger daher 4 Bytes gross und auf einem 64-Bit System 8 Bytes. Somit kann man aber auch einen Zeiger auf den Speicherbereich eines Zeigers bekommen. Also einen Zeiger auf einen Zeiger:

    void* // ist ein Zeiger auf void (nichts, deshalb sollte man auch void-Zeiger meiden, eigentlich :) )
    void** // Ist ein Zeiger auf einen void-Zeiger
    

    Bei der DX-Funktion übergibt man also die Adresse zu einem Zeiger. In der Funktion wird dann dieser Zeiger auf einen Zeiger dereferenziert und einen Zeiger zugewiesen. Ist das verständlich? 🙂

    Am einfachsten geht es eigentlich, wenn man den Zeiger einfach auch als ein Objekt im Speicher sieht. Auf ein Objekt im Speicher kann man auch immer eine Adresse holen. Und Adressen speichert man in Zeigern, welche wiederum Objekte im Speicher sind 😉

    Grüssli


Anmelden zum Antworten