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

21.11.2008, 22:46

Übungsaufgabe 2.7.6

Hallo alleman,

ich brauch mal wieder eure hilfe :roll:

Vor den Übungsaufgaben 2.7.6 wird ein Beispielprogramm erstellt was die Funktionsweise des Vertex und Indexbuffers erklärt (ist auch auf CD \Beispiele\Kapitel 02\05 - Vertex- und Index-Buffer).
In der Übung soll jetzt der Vertex- und Indexbuffer nicht komplett, wie im Beispiel, sondern nur für jeden Quader einzeln gesperrt werden. Dazu hab ich nur die entscheidene Funktion InitScene() geändert

Hier die ursprünglich wo alles auf einmal gesperrt wird

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
    // ------------------------------------------------------------------


    // Den Vertex-Buffer erstellen. Jeder Würfel benötigt 8 Vertizes.

    // Daher ist die Vertex-Buffer-Größe gleich Anzahl der Würfel mal 8 mal Vertexgröße.

    if(FAILED(hResult = g_pD3DDevice->CreateVertexBuffer(g_iNumCubes * 8 * sizeof(SVertex),
                                                         0,
                                                         SVertex::dwFVF,
                                                         D3DPOOL_MANAGED,
                                                         &g_pVertexBuffer,
                                                         NULL)))
    {
        // Fehler beim Erstellen des Vertex-Buffers!

        TB_ERROR_DIRECTX("g_pD3DDevice->CreateVertexBuffer", hResult, TB_ERROR);
    }

    // Nun generieren wir den Index-Buffer. Jeder Würfel braucht 36 Indizes.

    // Es wird ein 16-Bit-Index-Buffer verwendet.

    if(FAILED(hResult = g_pD3DDevice->CreateIndexBuffer(g_iNumCubes * 36 * 2,
                                                        0,
                                                        D3DFMT_INDEX16,
                                                        D3DPOOL_MANAGED,
                                                        &g_pIndexBuffer,
                                                        NULL)))
    {
        // Fehler beim Erstellen des Index-Buffers!

        TB_ERROR_DIRECTX("g_pD3DDevice->CreateIndexBuffer", hResult, TB_ERROR);
    }

    // Vertex- und Index-Buffer komplett sperren

    g_pVertexBuffer->Lock(0, 0, (void**)(&pVertices), D3DLOCK_NOSYSLOCK);
    g_pIndexBuffer->Lock(0, 0, (void**)(&pusIndices), D3DLOCK_NOSYSLOCK);

    // Nun gehen wir jeden einzelnen Würfel durch.

    for(int iCube = 0; iCube < g_iNumCubes; iCube++)
    {
        // Zufällige Position für diesen Würfel erzeugen

        vCubePosition = tbVector3Random() * tbFloatRandom(20.0f, 250.0f);

        // Startvertex und Startindex für diesen Würfel berechnen.

        // Diese Werte beschreiben, an welcher Stelle im Vertex- und Index-Buffer

        // die Daten des aktuellen Würfels beginnen.

        iStartVertex = iCube * 8;
        iStartIndex = iCube * 36;

        // Vertizes für diesen Würfel generieren. Erst die Positionsangaben.

        pVertices[iStartVertex + 0].vPosition = vCubePosition + tbVector3(-1.0f,  1.0f, -1.0f);
        pVertices[iStartVertex + 1].vPosition = vCubePosition + tbVector3(-1.0f,  1.0f,  1.0f);
        pVertices[iStartVertex + 2].vPosition = vCubePosition + tbVector3( 1.0f,  1.0f,  1.0f);
        pVertices[iStartVertex + 3].vPosition = vCubePosition + tbVector3( 1.0f,  1.0f, -1.0f);
        pVertices[iStartVertex + 4].vPosition = vCubePosition + tbVector3(-1.0f, -1.0f, -1.0f);
        pVertices[iStartVertex + 5].vPosition = vCubePosition + tbVector3(-1.0f, -1.0f,  1.0f);
        pVertices[iStartVertex + 6].vPosition = vCubePosition + tbVector3( 1.0f, -1.0f,  1.0f);
        pVertices[iStartVertex + 7].vPosition = vCubePosition + tbVector3( 1.0f, -1.0f, -1.0f);

        for(int iVertex = iStartVertex; iVertex < iStartVertex + 8; iVertex++)
        {
            // Zufallsfarbe erzeugen (Alpha = 1)

            pVertices[iVertex].dwColor = tbColorRandom(1.0f) * 2.0f;

            // Texturkoordinaten generieren

            pVertices[iVertex].vTexture = tbVector2Random();
        }

        // Nun die Indizes eintragen. Jeweils drei von ihnen ergeben ein Dreieck.

        int aiIndex[36] = {0, 3, 7,   0, 7, 4,  // Vorderseite

                           2, 1, 5,   2, 5, 6,  // Hinterseite

                           1, 0, 4,   1, 4, 5,  // Linke Seite

                           3, 2, 6,   3, 6, 7,  // Rechte Seite

                           0, 1, 2,   0, 2, 3,  // Oberseite

                           6, 5, 4,   6, 4, 7}; // Unterseite


        // Die 36 Indizes in den Index-Buffer übertragen.

        // Zu jedem Indexwert muss noch der Startvertexwert addiert werden.

        for(int iIndex = 0; iIndex < 36; iIndex++)
        {
            // Index eintragen

            pusIndices[iStartIndex + iIndex] = aiIndex[iIndex] + iStartVertex;
        }

    }
    // Vertex- und Index-Buffer wieder entsperren

    g_pVertexBuffer->Unlock();
    g_pIndexBuffer->Unlock();


    return TB_OK;
}



Und jetzt meine Veränderung -> einzelnes Sperren und entsperren


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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    // ------------------------------------------------------------------


    // Den Vertex-Buffer erstellen. Jeder Würfel benötigt 8 Vertizes.

    // Daher ist die Vertex-Buffer-Größe gleich Anzahl der Würfel mal 8 mal Vertexgröße.

    if(FAILED(hResult = g_pD3DDevice->CreateVertexBuffer(g_iNumCubes * 8 * sizeof(SVertex),
                                                         0,
                                                         SVertex::dwFVF,
                                                         D3DPOOL_MANAGED,
                                                         &g_pVertexBuffer,
                                                         NULL)))
    {
        // Fehler beim Erstellen des Vertex-Buffers!

        TB_ERROR_DIRECTX("g_pD3DDevice->CreateVertexBuffer", hResult, TB_ERROR);
    }

    // Nun generieren wir den Index-Buffer. Jeder Würfel braucht 36 Indizes.

    // Es wird ein 16-Bit-Index-Buffer verwendet.

    if(FAILED(hResult = g_pD3DDevice->CreateIndexBuffer(g_iNumCubes * 36 * sizeof(int),
                                                        0,
                                                        D3DFMT_INDEX16,
                                                        D3DPOOL_MANAGED,
                                                        &g_pIndexBuffer,
                                                        NULL)))
    {
        // Fehler beim Erstellen des Index-Buffers!

        TB_ERROR_DIRECTX("g_pD3DDevice->CreateIndexBuffer", hResult, TB_ERROR);
    }


    // Nun gehen wir jeden einzelnen Würfel durch.

    for(int iCube = 0; iCube < g_iNumCubes; iCube++)
    {
        // Vertex- und Index-Buffer sperren

        g_pVertexBuffer->Lock(iCube *8 * sizeof(SVertex), 8 * sizeof(SVertex), (void**)(&pVertices), D3DLOCK_NOSYSLOCK);
        g_pIndexBuffer->Lock(iCube * 36 * sizeof(int), 36 * sizeof(int), (void**)(&pusIndices), D3DLOCK_NOSYSLOCK);

        // Zufällige Position für diesen Würfel erzeugen

        vCubePosition = tbVector3Random() * tbFloatRandom(20.0f, 250.0f);

        // Vertizes für diesen Würfel generieren. Erst die Positionsangaben.

        pVertices[0].vPosition = vCubePosition + tbVector3(-1.0f,  1.0f, -1.0f);
        pVertices[1].vPosition = vCubePosition + tbVector3(-1.0f,  1.0f,  1.0f);
        pVertices[2].vPosition = vCubePosition + tbVector3( 1.0f,  1.0f,  1.0f);
        pVertices[3].vPosition = vCubePosition + tbVector3( 1.0f,  1.0f, -1.0f);
        pVertices[4].vPosition = vCubePosition + tbVector3(-1.0f, -1.0f, -1.0f);
        pVertices[5].vPosition = vCubePosition + tbVector3(-1.0f, -1.0f,  1.0f);
        pVertices[6].vPosition = vCubePosition + tbVector3( 1.0f, -1.0f,  1.0f);
        pVertices[7].vPosition = vCubePosition + tbVector3( 1.0f, -1.0f, -1.0f);

        for(int iVertex = 0; iVertex < 8; iVertex++)
        {
            // Zufallsfarbe erzeugen (Alpha = 1)

            pVertices[iVertex].dwColor = tbColorRandom(1.0f) * 2.0f;

            // Texturkoordinaten generieren

            pVertices[iVertex].vTexture = tbVector2Random();
        }

        // Nun die Indizes eintragen. Jeweils drei von ihnen ergeben ein Dreieck.

        int aiIndex[36] = {0, 3, 7,   0, 7, 4,  // Vorderseite

                           2, 1, 5,   2, 5, 6,  // Hinterseite

                           1, 0, 4,   1, 4, 5,  // Linke Seite

                           3, 2, 6,   3, 6, 7,  // Rechte Seite

                           0, 1, 2,   0, 2, 3,  // Oberseite

                           6, 5, 4,   6, 4, 7}; // Unterseite


        // Die 36 Indizes in den Index-Buffer übertragen.

        // Zu jedem Indexwert muss noch der Startvertexwert addiert werden.

        for(int iIndex = 0; iIndex < 36; iIndex++)
        {
            // Index eintragen

            pusIndices[iIndex] = aiIndex[iIndex];
        }

        // Vertex- und Index-Buffer wieder entsperren

        g_pVertexBuffer->Unlock();
        g_pIndexBuffer->Unlock();
    }



    return TB_OK;
}


Das Programm bringt zwar keinen Fehler, allerdings bleibt der Bildschirm schwarz. Ich hab schon paar Stunden versucht, das selber zu lösen, allerdings sehe ich den Fehler nicht. :(

Wenn noch Angaben fehlen, einfach melden.

Danke schonmal für eure Zeit

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

21.11.2008, 23:04

Sicher?

C-/C++-Quelltext

1
36 * sizeof(int)
@D13_Dreinig

3

21.11.2008, 23:19

@David_pb Danke für deine Antwort

im Beispiel steht "36 * 2",
aber "sizeof(int) = 2"
Für die Indizes wird doch ein Feld von 36 Indizes benötigt die vom Typ int sind
"int aiIndex[36]", es muss doch auch der Bereich der Sperrung so groß sein.

also auch wenn ich das wieder in 36*2 ändere, tritt der gleich effekt auf,
also dort seh ich keinen Fehler, hätte eher gedacht das es mit falschen Indizes zusammenhängt (also beim Eintragen)
meinstest du das?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

21.11.2008, 23:24

Zitat von »"butane"«


aber "sizeof(int) = 2"


Das stimmt aber nicht zwangsläufig. Häufig ist sizeof(int) sogar 4.
@D13_Dreinig

5

21.11.2008, 23:40

Danke stimmt du hast recht,

Warum ist in dem Beispiel beim Sperren 36 * 2 und unten ein Integerfeld[36] -> passt doch irgendwie nicht oder?

ich hab jetzt aus int aiIndex[36]
WORD aiIndex[36] gemacht
Jetzt seh ich am unteren Rand den Teil eines Quaders

6

21.11.2008, 23:47

hab glaub ich den Fehler gefunden

C-/C++-Quelltext

1
    g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, 0, sizeof(SVertex));


Das setzen mit "0" ist hier meiner Meinung nach falsch, da muss ich auch jeden Quader durchgehen

versuch ich morgen und meld mich falls es geklappt hat oder wenn nicht

nacht

ne das ist doch nicht gibt ja nur den Datenstrom an und nicht die Position im Vertexbuffer

hab das Problem jetzt so weit eingegrenzt das er jeweils nur ein Quader malt -> mhhh also weitersuchen

Werbeanzeige