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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

06.06.2007, 14:16

Wieso schließt du den Puffer ab nur um die Funktion GetNumVertices() aufzurufen?
@D13_Dreinig

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

12

06.06.2007, 14:24

Ich will die Koordinaten der Vertices noch rausholen.

Muss ich das über memcpy() machen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

06.06.2007, 14:56

Zitat von »"spacegaier"«

Muss ich das über memcpy() machen?


Nein, kannst jedwede Kopiervorrichtung von C++ verwenden. Hast du nen Pointer auf den Puffer und die Vertexdeklaration dürfest du ebenfalls kennen.

Waru man den Puffer abschließt ist mir klar, warum DU den Puffer im Beispiel oben abschließt nicht.
@D13_Dreinig

14

06.06.2007, 14:58

Erstmal muss du mit D3DXBaseMesh::GetNumBytesPerVertex herausfinden wie große ein Vertex ist. Dadurch kannst du den ganzen Block in die einzelnen Vrtieces aufteilen. Dann musst du mit ID3DXBaseMesh::GetFVF herausfinden welche Informationen darin enthalten sind. Die Reihenfolge ist dabei fest forgeschrieben.

So kannst du dann aus jedem kleinen Block die Infos ziehen die du suchst.

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

15

06.06.2007, 16:04

@Davib_pb: Ich schließ ab, weil chriss es gesagt hat :o

Zitat

Erst den Vertexbuffer laden und den Zeiger den du bekommst speichern.
Dann den VB Locken
Dann lesen
Dann VB entsperren (unlock)


Oder ist das hier nicht nötig. Aber David sschreibt in seinem Buch auf Seite 173 (Thema Vertex- und Index-Buffer) ja auch:

Zitat

...ist es unmöglich, die Daten so einfach und ohne Vorwarnung zu verändern oder zu lesen. Das Sperren der Ressource ist zuerst nötig.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

06.06.2007, 17:34

Wenn du den Vertexpuffer Mappen willst musst du ihn "locken" um dem Server mitzuteilen das Daten geändert werden und den Zugriff insgesamt zu verbieten. Aber die Methode GetNumVertices() hat nichts damit zu tun.
Willst du nun allerdings Daten aus dem VB lesen oder reinschreiben muss der Puffer abgeschlossen werden.

Übrigens macht es Sinn eine Art "Scoped-Lock" Wrapper zu verwenden. Also ein Objekt das den Puffer automatisch aufschließt wenn der Scope verlassen wird.
@D13_Dreinig

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

17

06.06.2007, 18:03

Ich habe jetzt mal das hier gemacht:

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
LPDIRECT3DVERTEXBUFFER9 pVB;                                        // Pointer auf einen Vertexbuffer

    ZeroMemory(&pVB, sizeof(pVB));                                      // NULLen


    D3DVERTEXBUFFER_DESC desc;                                          // Beschreibung des VBs


    CUSTOMVERTEX *v;
    VOID *pVertex;
       
    m_pMesh->GetVertexBuffer(&pVB);                                     // VB zum Mesh ermitteln         

    pVB->GetDesc(&desc);                                                // Eigenschaften ermitteln


    int iNumVertices = m_pMesh->GetNumVertices();                       // Anzahl der Vertices ermitteln

    int iNumBytesPerVertex = m_pMesh->GetNumBytesPerVertex();           // Größe der Vertexstruktur ermitteln


    v = new CUSTOMVERTEX[iNumVertices];                                 // Array für Vertices anlegen 


    for(int i=0; i<iNumVertices; i++)
    {
        pVB->Lock(i * iNumBytesPerVertex, iNumBytesPerVertex, (VOID**)&pVertex, D3DLOCK_READONLY);  
        memcpy(&v[i], pVertex, desc.Size);
        pVB->Unlock();
    }


Probleme:

1. v ist kein Array!?! Warum nicht? In v ist lediglich das erste Vertex gespeichert. Es müsste doch aber eingetlich ein Array für alle Vertices sein, oder?

2. Bei dem memcpy-Befehl musste ich dfas '&' hinzjfügen, damit es klappt. Weiß nicht warum (wenn ich den Index von v weglasse, geht es ohne '&' !).

3. Beim 52 Durchlauf (i=51) gibt es einen Zugriffsfehler bei memcpy.

4. iNumVertices ist immer größer als Milkshape3D ausgibt (mit dem Programm habe ich die Modelle erstellt).

5. Der Ansatz erscheint mir nicht optimal, da ich ja so für jedes Vertex des Buffer öffnen und schließen muss. Ich habe es aber nicht hinbekommen den Buffer erst einmal ganz zu kopieren und dann zu zerlegen.

Hoffe jemand kann mit sagen, wo die Probleme herrühren.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

06.06.2007, 18:45

1. v ist ein Zeiger auf einen Block Speicher und kein Array.
2. Weil v[ i ] keinen Zeiger zurückliefert sondern das Objekt.
3. Was für einen Wert hat iNumVertices?
4. Muss wohl trotzdem korrekt sein.
5. Einmal abschließen und einmal öffenen genügt.

Ungefär so (ungetestet)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
LPDIRECT3DVERTEXBUFFER9 pVBuffer;

if ( SUCCEEDED( m_pMesh->GetVertexBuffer( &pVBuffer ) ) )
{
  VERTEX* pVertex;

  if ( SUCCEEDED( pVBuffer->Lock( 0, 0, ( BYTE** )&pVert, D3DLOCK_DISCARD )
  {
    DWORD num = m_pMesh->GetNumVertices();

    for ( int i = 0; i < num; ++i, ++pVertex )
    {
       // Mach irgendwas mit pVertex

    }
 
    pVBuffer->Unlock();
  }

  pVertex->Release();
}


Übrigens bietet ID3DXPatchMesh die Methode LockVertexBuffer() an.
@D13_Dreinig

spacegaier

Alter Hase

  • »spacegaier« ist der Autor dieses Themas

Beiträge: 572

Beruf: Student

  • Private Nachricht senden

19

06.06.2007, 19:43

iNumVertices = 172 (laut Milkshape3D sind es 160).

Bist du dir bei deinem Lock-Befel-Parametern sicher? Du lockst doch da 0 Bytes, oder? Muss da nicht

C-/C++-Quelltext

1
sizeof(VERTEX)
oder

C-/C++-Quelltext

1
m_pMesh->GetNumBytesPerVertex()
hin?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

06.06.2007, 19:47

Nein, wenn die beiden ersten Parameter 0 sind wird der ganze Puffer gelockt. Steht in der Doku...
@D13_Dreinig

Werbeanzeige