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

30.03.2010, 20:40

Daten in Vertexbuffer kopieren

hallo, ich versuche gerade drei vertices in meinen Buffer zu kopieren, die Vertexbufferklasse sieht so aus(ich weiß, noch nicht wirklich viel :)):


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
#include "global.h"

CVertexBuffer::CVertexBuffer(LPDIRECT3DDEVICE9 pDevice, int pSize, DWORD pFVF, int pVertexSize)
{
    //VertexBuffer erzeugen
    pDevice->CreateVertexBuffer(    pSize,
                                    0,
                                    pFVF,
                                    D3DPOOL_MANAGED,
                                    &VertexBuffer,
                                    NULL);

    //Werte speichern
    VertexSize = pVertexSize;
    PrimitiveCount = pSize/VertexSize;
}

void CVertexBuffer::Lock(void* pLockedArea)
{
    VertexBuffer->Lock(0, 0, (void**)&pLockedArea, 0); 
}

void CVertexBuffer::Unlock()
{
    HRESULT test = VertexBuffer->Unlock();
}


Das Daten reinkopieren sieht jetzt so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SVertex Vertices[3];
    Vertices[0].vPosition = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
    Vertices[1].vPosition = D3DXVECTOR3(1.0f, -1.0f, 0.0f);
    Vertices[2].vPosition = D3DXVECTOR3(-1.0f, -1.0f, 0.0f);
    Vertices[0].color = D3DCOLOR_XRGB(255, 0, 0);
    Vertices[1].color = D3DCOLOR_XRGB(0, 255, 0);
    Vertices[2].color = D3DCOLOR_XRGB(0, 0, 255);


    void* LockedArea = 0;
    CVertexBuffer VertexBuffer(d3d.GetDevice(), sizeof(Vertices), D3DFVF_XYZ | D3DFVF_DIFFUSE, sizeof(SVertex));
    VertexBuffer.Lock(LockedArea);
    memcpy(LockedArea, Vertices, sizeof(Vertices));
    VertexBuffer.Unlock();


wenn ich das jetzt ausführe, bekomme ich eine Zugriffsverletzung bei memcpy, das heißt wohl ich habe einen ungültigen zeiger oder schreibe zu weit, sehe ich das falsch?
habt ihr ne idee woran das liegt?

2

30.03.2010, 21:11

memcpy(LockedArea, Vertices, sizeof(Vertices));


fehlt da nicht ein &

3

30.03.2010, 21:14

hab ich auch schon überlegt, aber dann übergebe ich ja einen doppelten zeiger auf void, den ich in der methode ja nochmal referenziere, dass kann irgendwie nicht sein oder?
wenn ich das mache bekomme ich einen lesezugriffsfehler bei SetTransform, was vorher gut funktioniert hat...

4

30.03.2010, 22:49

ich hab das problem jetzt behoben, lag wohl an irgendwelchen zeiger konvertierugen, weiß selber noch nicht so wirklich was ich falsch gemacht habe.

5

31.03.2010, 09:04

Das Problem ist, dass du bei der Funktion CVertexBuffer::Lock einen Zeiger übergibst. Beim Aufruf von Lock wird eine Kopie des Zeigers LockedArea erstellt und innerhalb von Lock auf den Speicherbereich des VertexBuffers gesetzt und die Kopie dann zerstört. Da du LockedArea mit 0 initialisiert hast, rufst du memcpy mit der Zieladresse 0 auf. Lock muss ein void** übergeben werden, also:
CVertexBuffer::Lock(void** ppLockedArea) und Verwendung VertexBuffer.Lock(&LockedArea);

Gruss
Gameco

Werbeanzeige