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

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

1

12.08.2005, 23:58

D3DPT_TRIANGLESTRIP

Hallo!

Ich hab leider wieder einen Fehler, den ich einfach nicht finde..ich hab einen Vertex und einen Index Buffer, ich möchte als Test 2 Dreicke mit D3DPT_TRIANGLESTRIP rendern, die aber unterbrochen sind! Im Buch steht, wenn ich im Index Buffer den Vertex 2 mal angebe, macht er eine unterbrechung, nur leider eben wieder nicht bei mir! Das geht ja, sonst würde es ja auch nicht viel sinn machen, oder?

Naja, hier auch noch mein Code, vielleicht seht ihr ja meinen Fehler..

Initialisierung:

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
CUSTOMVERTEX Vertices2[] =
    {
        { -1.0f,  -1.0f, 1.0f,  0xffff0000, }, // x, y, z, rhw, color

        {  1.0f,  -1.0f, 1.0f,  0xff00ff00, },
        { -1.0f,  1.0f, 1.0f,  0xff00ffff, },
        {  1.0f, -1.0f, 1.0f, 0xff00ffff,},
        {  2.0f, -1.0f, 1.0f, 0xff00ff00,},
        {  2.0f, 1.0f, 1.0f, 0xff00ffff,},
    };

    // Create the vertex buffer. Here we are allocating enough memory

    // (from the default pool) to hold all our 3 custom Vertices2. We also

    // specify the FVF, so the vertex buffer knows what data it contains.

    if( FAILED( Focus->g_pd3dDevice->CreateVertexBuffer( 6*sizeof(CUSTOMVERTEX),
        0, D3DFVF_CUSTOMVERTEX3D,
        D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
    {
        return E_FAIL;
    }

    // Now we fill the vertex buffer. To do this, we need to Lock() the VB to

    // gain access to the Vertices2. This mechanism is required becuase vertex

    // buffers may be in device memory.

    VOID* pVertices2;
    if( FAILED( g_pVB->Lock( 0, sizeof(Vertices2), (void**)&pVertices2, 0 ) ) )
        return E_FAIL;
    memcpy( pVertices2, Vertices2, sizeof(Vertices2) );
    g_pVB->Unlock();

    Focus->g_pd3dDevice->CreateIndexBuffer(7 * 2,0,D3DFMT_INDEX16,D3DPOOL_DEFAULT,&g_pIB,NULL);
    
    unsigned short* pusIndices;
    g_pIB->Lock(0,0,(void**)(&pusIndices),D3DLOCK_NOSYSLOCK);

    int aIndex[7] = {0,1,2,2,3,4,5};

    for(int iIndex = 0; iIndex < 7; iIndex++)
        pusIndices[iIndex] = aIndex[iIndex];
    g_pIB->Unlock();


Das Rendern:

C-/C++-Quelltext

1
2
3
4
Focus->g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
        Focus->g_pd3dDevice->SetIndices(g_pIB);
        Focus->g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX3D );
        Focus->g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLESTRIP, 0, 6,0,2 );



Danke für eure Hilfe!

Ach ja, es wird immer nur das erste Dreieck gerendert..nach 2,2 im Index Buffer macht er nix mehr..



cya,
Stefan

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

13.08.2005, 00:34

for(int iIndex = 0; iIndex < 7; iIndex++)
pusIndices[iIndex] = aIndex[iIndex];

dafür nimmst erstmal nen memcpy.

"HRESULT DrawIndexedPrimitive( D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);"

also ich sehe bei deiner Renderfunktion ne 4 aber ich zähle 6 Vertices...
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

3

13.08.2005, 00:38

Zitat

or(int iIndex = 0; iIndex < 7; iIndex++)
pusIndices[iIndex] = aIndex[iIndex];

dafür nimmst erstmal nen memcpy.


hm, naja hätt ich aus Davids Buch, dass dürfte eigentlich keinen Fehler erzeugen..

Ja - habs eh schon geändert und eine 6 darausgemacht, war nur ein kopier fehler..

aber danke schon mal..

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

4

13.08.2005, 01:12

SO hab jetzt alles durchgestet und bin mir zu 99% sicher, das man Dreieicke nicht unterbrechen kann, wenn man den Vertex 2 mal angibt! David hat das zwar im Buch stehen, aber das geht wohl nicht mehr..
Aber was bringt einem dann D3DPT_TRIANGLESTRIP?
Mit D3DPT_TRIANGLELIST funktioniert es, also ist sonst vom Code her alles richtig, nur diese Zeile ist das Problem:

C-/C++-Quelltext

1
 int aIndex[7] = {0,1,2,2,3,4,5}; 


Gibts da sonst gar keine Möglichkeit, verwenden die Profis z.B. für ein Terrain D3DPT_TRIANGLELIST?


cya,
Stefan

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

13.08.2005, 09:43

memcpy ist schneller.
Es kann auch sein das der Vertex im Buffer 2mal auftauchen muss. Die doku gibt dazu leider nicht viel her.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

6

13.08.2005, 11:39

Zitat von »"Nox"«

memcpy ist schneller.
Es kann auch sein das der Vertex im Buffer 2mal auftauchen muss. Die doku gibt dazu leider nicht viel her.


ok, danke..Das ist ein guter Grund memcpy zuverwenden..leider aber immer noch das selbe Problem, den Vertex kann man leider nicht 2 mal im VertexBuffer angeben, würde auch nicht so viel bringen, weil dann der Speicherverbrauch glaube ich noch größer wäre..
Ja, schade das die sdk nicht viel hergibt..

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

7

13.08.2005, 11:40

ah, sorry..war nicht eingelogt..

Osram

Alter Hase

Beiträge: 889

Wohnort: Weissenthurm

Beruf: SW Entwickler

  • Private Nachricht senden

8

13.08.2005, 19:46

Ein Stichwort für Google ist "stitch" (vernähen). Die Suche nach
D3DPT_TRIANGLESTRIP stitch
findet u.a.:
http://www.gamedev.net/community/forums/topic.asp?topic_id=216417
http://www.visualbasicforum.com/t110775.html
http://www.drunkenhyena.com/cgi-bin/view_cpp_article.pl?chapter=2;article=22

Kann es sein, dass bei Dir die Umlaufrichtung schief geht und Du daher die zusätzlichen Dreiecke von hinten siehst?
"Games are algorithmic entertainment."

Anonymous

unregistriert

9

15.08.2005, 13:59

danke für die Hilfe!
Als ich in deinen Links gelesen habe, dass D3DPT_TRIANGLESTRIP gar nicht so ideal ist, habe ich alles auf D3DPT_TRIANGLELIST geändert, benötigt zwar etwas mehr an Speicher, aber das mir jetzt Wert.

Ich hätte noch 2-3 ganz andere Fragen zu meinem CodeStil, da ich mir nicht sicher bin, ob das perfomance technisch gut ist und auch dem Standard entspricht.

1. continue;

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
for(DWORD dwButton = 0; dwButton < m_dwNumButtons; dwButton++)
    {
        if( pfOut[dwButton] >= 0.2f)
        {
            if(dwButton == TB_KEY_LSHIFT)
                continue;
            return dwButton;
        }

    }


2.initialisierung von Veriablen
Viele deaklarieren alle benötigten Veriablen am Block beginn, ich immer erst wenn ich sie benötige, z.B for(int i = 0; i<... Welcher Stil ist hier schöner bzw. besser?

3.
Ich benützte in meinem Code nur Klassen, in der main.cpp ist die Hauptklasse CFocus, die enthält unter public alle wichtigen anderen Klassen, wie CInput* Input; CMenu *Menu, CTerrain * Terrain;
Dabei befindet sich eine GlobaleVeriable CFocus *Focus = NULL; im Code.
die ich auch mittels extern in allen anderen Cpps zu verfügung stelle..und immer wenn ich dann zum Beispiel eine Abfrage einer Maustaste oder so benötige, muss ich so drauf zu greifen: Focus->Input->GetInput()..
Das ist glaube ich nicht gerade optimal, oder?


Ich hoffe ihr könnt mir hier ein paar gute Tipps geben, danke!


cya,
Stefan

Stefan

Alter Hase

  • »Stefan« ist der Autor dieses Themas

Beiträge: 668

Wohnort: Innsbruck

  • Private Nachricht senden

10

15.08.2005, 14:01

4.
hm, ich war leider schon wieder nicht eingeloggt, ich verstehe nicht wieso es mich immer auslogt..

Werbeanzeige