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

19.07.2006, 21:10

Nur bestimmten Teil vom Vertex-Buffer zeichnen

Hi!

Und zwar stehe ich vor folgendem Problem:
Ich probiere gerade ein bisschen mit dem beispiel vom Vertex/Index Buffer rum, und bin vor ein Problem gestosen.
Und zwar wollt ich fragen, wie es möglich ist nur einen bestimmten Teil aus dem Vertex Buffer zu zeichnen (zb. nur 10tes Quadrat)
Habe bereits selbst ein bisschne rumprobiert aber was dabei rausgekommen ist... ;)
Im moment siehts so aus:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i=0; i<g_iNumCubes; i++){
        g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(SVertex)*i, sizeof(SVertex));

        hResult = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,    // Dreiecksliste

                                                     0,                     // Basisvertexindex

                                                     0,                     // Der kleinste Index

                                                     8,                     // Diff. zw. größtem u. kleinstem Index

                                                     0,                     // Von Anfang an zeichnen

                                                     12);                   // 12 Dreiecke pro Würfel

        if(FAILED(hResult))
        {
            // Fehler beim Zeichnen!

            TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP);
        }
    }


Also für was ich es eigendlich brauche: Will jedem Würfel anderes Material geben, und wenn ich alle auf einmal zeichne kann ich ja nur eines Setzen. Vlt. gibt es noch eine andere Lösung.

Schonmal danke im vorraus :)

mfg

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

2

20.07.2006, 09:11

Im Vertex/Indexbuffer hast du ja jeweils nur einen Würfel gespeichert... und bevor du ihn zeichnest setzt du einfach ein beliebiges material... oder hab ich da was falsch verstanden?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
for(int i=0; i<g_iNumCubes; i++){ 
        g_pD3DDevice->SetStreamSource(0, g_pVertexBuffer, sizeof(SVertex)*i, sizeof(SVertex)); 

   //HIER das Material setzten, und danach Würfel zeichnen

   //Du könntest das material auch mittels eines Effekts setzen... ist einfacher,

    //dann ist i auch gleichzeitig deine MaterialPasszählvariable!

        hResult = g_pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,    // Dreiecksliste 

                                                     0,                        // Basisvertexindex 

                                                     0,                        // Der kleinste Index 

                                                     8,                        // Diff. zw. größtem u. kleinstem Index 

                                                     0,                        // Von Anfang an zeichnen 

                                                     12);                    // 12 Dreiecke pro Würfel 

        if(FAILED(hResult)) 
        { 
            // Fehler beim Zeichnen! 

            TB_ERROR_DIRECTX("g_pD3DDevice->DrawIndexedPrimitive", hResult, TB_STOP); 
        } 
    }
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

3

20.07.2006, 13:50

Ja, hab auch gedacht dass es so funktioniert (im vertex buffer befinden sich ja eigendlich 1024 würfel, nur versuch im jeden einzeln zu zeichnen (deshalb die for schleife)).
Doch wenn mans so macht, dann zeichnet der ganz was komisches hin (also keine würfel ;))

mfg

Phili

unregistriert

4

20.07.2006, 13:55

@kain0015
Du hast nicht ernsthaft 1024 gleiche Würfel gespeichert, oder? :shock:

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

20.07.2006, 14:57

Hoff ich auch nicht... Befürcht ich aber!
Hast du die etwa von hand eingetippt???
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Phili

unregistriert

6

20.07.2006, 17:37

C-/C++-Quelltext

1
//12 Dreiecke pro Würfel

Räusper...

7

20.07.2006, 18:49

*hust*
Kenn keiner das beispiel aus dem buch? :P
Hier ist mal der code vom ereugen der 1024 würfel

Quellcode

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
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++)
        {
            // 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();


Und der zum zeichnen steht eh weiter oben.

mfg

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

8

21.07.2006, 00:56

C-/C++-Quelltext

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

Du hast doch selbst geschrieben dass ein Wuerfel 12 Dreiecke hat, warum also sizeof(SVertex)*i beim Offset ? Muesste es nicht

C-/C++-Quelltext

1
SetStreamSource(0, g_pVertexBuffer, sizeof(SVertex)*12*3*i, sizeof(SVertex));
heissen? Jeder wuerfel hat 36 Vertizes.

Allerdings: Das Beispiel aus dem Buch verwendet indizierte Vertizes, weshalb das so nicht funktionieren wird (ausserdem wird ein Offset bei der Streamsource wohl nicht immer unterstuetzt)
Setzt mal an der Methode DrawIndexedPrimitive an! Die erwartet Parameter wie "StartIndex" und "NumVertices" -> siehe MSDN Damit sollte es gehen
"Have you tried turning it off and on again?"

Werbeanzeige