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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

41

05.02.2011, 16:38

Ja genau so ist es. Die Vertexdaten sind im Zeiger Vertices gespeichert, m_ModelData.Vertices. Den Vector verwende ich für die verschiedenen Meshes. Mit i wähle ich das aktuelle Mesh aus und Vertices gibt mir dieentsprechenden Vertexdaten.

So sieht der Initialisierungscode aus:

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
for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        m_NumVertices = 0;
        m_File.read(reinterpret_cast<char*>(&m_NumVertices), sizeof(unsigned int));
        TempModel.Vertices = new veModelVertex[m_NumVertices];
        m_Model.NumVertices.push_back(m_NumVertices);

        for(unsigned int v = 0; v < m_NumVertices; ++v)
        {
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posx), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posy), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posz), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normalx), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normaly), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].normalz), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].tu), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].tv), sizeof(float));
        }

        m_ModelData.push_back(TempModel);
    }

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        m_NumAllVertices += m_Model.NumVertices[i];
    }

    if(FAILED(hResult = d3ddev->CreateVertexBuffer(m_NumAllVertices * sizeof(veModelVertex),
                                                   D3DUSAGE_WRITEONLY,
                                                   ModelVertexFVF,
                                                   D3DPOOL_MANAGED,
                                                   &m_pVertexBuffer,
                                                   NULL)))
    {
        MessageBox(NULL, "Fehler beim Erzeugen des VertexBuffers", "Fehler aufgetreten",
                    MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        void * pData;
        m_pVertexBuffer->Lock(0, 0, (VOID**)&pData, 0);
        memcpy(pData, m_ModelData[i].Vertices, sizeof(veModelVertex) * m_Model.NumVertices[i]);
        m_pVertexBuffer->Unlock();
    }


Warum werden nicht alle Meshes gerendert?

Wie kann ich den die Vertexdaten übernehmen, ohne dass ich mehrere Arrays verwende?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

42

05.02.2011, 16:45

Ganz einfach, weil du nicht alle Daten in deinen VertexBuffer kopiert hast. Überleg mal was genau du da machst:

C-/C++-Quelltext

1
2
3
4
5
6
7
for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        void * pData;
        m_pVertexBuffer->Lock(0, 0, (VOID**)&pData, 0);
        memcpy(pData, m_ModelData[i].Vertices, sizeof(veModelVertex) * m_Model.NumVertices[i]);
        m_pVertexBuffer->Unlock();
    }

Für jedes Mesh lockst du den VertexBuffer von Neuem, kopierst dann die Vertexdaten des jeweiligen Mesh an den Anfang des Buffers, und überschreibst damit die Daten des vorigen Mesh...

Abgesehen davon finde ich es wie gesagt immer noch komisch dass du für jedes Mesh unabhängige Vertexdaten hast. Der Vorteil von Indices ist eben gerade dass alle Meshes sich dieselben Vertexdaten teilen können und eben genau kein Vertex unnötig dupliziert werden muss. Eine solche Vorgehensweise wie die da oben macht nur dann Sinn wenn du keine Indices verwenden willst was ich aber wie gesagt sehr empfehlen würde. Zumindest wenn du damit herkömmliche zusammenhängende 3D Modelle rendern willst und nicht irgendwelche ganz speziellen Effekte.

Es kann natürlich auch sein dass ich falsch verstanden habe was genau du unter einem Mesh verstehst...

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

43

05.02.2011, 16:58

Ok dann wäre es besser, wenn ich einen Zeiger erzeuge, der auf die Vertexstruktur zeigt. Dieser Zeiger bekommt dann alle Vertexdaten.

Muss man eigentlich den Operator [] benutzen, wenn man die Vertexdaten übergibt? Also so:

C-/C++-Quelltext

1
m_File.read(reinterpret_cast<char*>(&TempModel.Vertices[v].posx), sizeof(float));


Wenn nicht, dann wäre das einiges besser.

Danach funktioniert es auch besser mit der memcpy Funktion.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

44

05.02.2011, 17:05

TempModel.Vertices reicht. Wie genau liegen deine Daten denn vor, es geht natürlich nicht einfach nur darum die gleichen Daten wie ohne Indices nur in den selben Speicherbereich zu quetschen. Ich schlage vor dass du dir mal anschaust was genau Indices sind und wie und warum man sie verwendet. Dann dürfte denk ich klar sein was genau du machen musst...

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

45

05.02.2011, 17:28

Ich habe nun einen Zeiger auf die Vertexstruktur erzeugt. Die Vertexdaten liegen so vor:

C-/C++-Quelltext

1
2
3
4
5
6
struct veModelVertex
{
    float posx, posy, posz;
    float normalx, normaly, normalz;
    float tu, tv;
};


Doch nun gibt es einen Laufzeitfehler, da die Vertices nicht richtig zugeordnet werden können, warum?

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
m_pVertices = new veSModel[m_NumMeshes * m_NumAllVertices];

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        for(unsigned int v = 0; v < m_NumVertices; ++v)
        {
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
        }
    }

    if(FAILED(hResult = d3ddev->CreateVertexBuffer(m_NumAllVertices * sizeof(veModelVertex),
                                                   D3DUSAGE_WRITEONLY,
                                                   ModelVertexFVF,
                                                   D3DPOOL_MANAGED,
                                                   &m_pVertexBuffer,
                                                   NULL)))
    {
        MessageBox(NULL, "Fehler beim Erzeugen des VertexBuffers", "Fehler aufgetreten",
                    MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    void * pData;
    m_pVertexBuffer->Lock(0, 0, (VOID**)&pData, 0);
    memcpy(pData, m_pVertices->Vertices, sizeof(veModelVertex) * m_NumAllVertices);
    m_pVertexBuffer->Unlock();


Ich habe in einem Buch nachgeschaut wegen den Indices. Es ist so, wenn man einen IndexBuffer verwendet, dann braucht man für zwei Dreiecke nur 4 Vertices anstatt 6, da die zwei Vertices die zweimal entstehen nur einmal verwendet werden. Das macht der IndexBuffer aber bestimmt selber, oder? Wenn ja, dann kann ich ja die Vertexdaten so erzeugen wie bisher.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

46

05.02.2011, 18:10


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
m_pVertices = new veSModel[m_NumMeshes * m_NumAllVertices];

    for(unsigned int i = 0; i < m_NumMeshes; ++i)
    {
        for(unsigned int v = 0; v < m_NumVertices; ++v)
        {
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
            m_File.read(reinterpret_cast<char*>(&m_pVertices->Vertices), sizeof(float));
        }
    }


Überleg bitte mal was der Code da genau macht. Speziell was m_pVertices und folgedessen m_pVertices->Vertices ist.
Ich würde dir wirklich empfehlen nochmal genau nachzulesen was Pointer und Arrays sind und wie sie zusammenhängen, deinem Code nach zu urteilen gibts da bei dir noch grundlegende Missverständnisse.

Ich habe in einem Buch nachgeschaut wegen den Indices. Es ist so, wenn man einen IndexBuffer verwendet, dann braucht man für zwei Dreiecke nur 4 Vertices anstatt 6, da die zwei Vertices die zweimal entstehen nur einmal verwendet werden. Das macht der IndexBuffer aber bestimmt selber, oder? Wenn ja, dann kann ich ja die Vertexdaten so erzeugen wie bisher.

Wie soll der IndexBuffer das "selber" machen. VertexBuffer und IndexBuffer sind einfach nur Arrays die du mit Daten befüllst. Das ist alles, die tun gar nix "von selber", die wissen nichtmal was ein Dreieck überhaupt ist ;)

Werbeanzeige