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

30.06.2009, 11:08

Problem mit Füllen von Vertexbuffer.

Bin fast am Verzweiffeln.
Programm friert vollkommen ein und ich muss den Computer reseten.
Vertexbuffer wird erstellt und das Sperren des Buffers funktioniert auch aber ab dann friert es den Computer vollkommen ein.


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
88
89
90
    float *Vertex;
    WORD *Index;
    _3DOT_Vector2 buffer;

    if(MainCl->pD3DDev->CreateVertexBuffer(128,0,D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1,D3DPOOL_MANAGED,&VertexBuffer,NULL)!=D3D_OK)
    {
        _3DOT_LogWr("Particle Vertexbuffer Fehler !",1);
        VertexBuffer=NULL;

    }
    if(MainCl->pD3DDev->CreateIndexBuffer(12,0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&IndexBuffer,NULL)!=D3D_OK)
    {
        _3DOT_LogWr("Particle Index Fehler !",1);
        IndexBuffer=NULL;

    }

    _3DOT_LogWr("Vertex u. Index-buffer erstellt !",1);

    if(ParticleSizeMax.entry1 || ParticleSizeMax.entry2)
    {
        buffer.entry1=(float)_3DOT_Random((int)(ParticleSizeMin.entry1*1000),(int)(ParticleSizeMax.entry1*1000))/1000;
        buffer.entry2=buffer.entry1;
    }
    else
    {
        buffer.entry1=ParticleSizeMin.entry1;
        buffer.entry2=buffer.entry1;
    }
    _3DOT_LogWr("Particlegrösse erstellt !",1);

    VertexBuffer->Lock(0,0,(void**)&Vertex,D3DLOCK_NOSYSLOCK);
    IndexBuffer->Lock(0,0,(void**)&Index,D3DLOCK_NOSYSLOCK);

    Vertex[0]=Pointer->Pos.x-buffer.entry1/2;   // Position

    Vertex[1]=Pointer->Pos.y+buffer.entry2/2;
    Vertex[2]=Pointer->Pos.z;
    Vertex[3]=0.0f; // Normale

    Vertex[4]=0.0f;
    Vertex[5]=1.0f;
    Vertex[6]=0.0f; // uv

    Vertex[7]=0.0f;

    _3DOT_LogWr("Erster Vertex gefüllt !",1);

    Vertex[8]=Pointer->Pos.x+buffer.entry1/2;
    Vertex[9]=Pointer->Pos.y+buffer.entry2/2;
    Vertex[10]=Pointer->Pos.z;
    Vertex[11]=0.0f;
    Vertex[12]=0.0f;
    Vertex[13]=1.0f;
    Vertex[14]=uvTexturRD.entry1;
    Vertex[15]=0.0f;

    _3DOT_LogWr("Zweiter Vertex gefüllt !",1);

    Vertex[16]=Pointer->Pos.x+buffer.entry1/2;
    Vertex[17]=Pointer->Pos.y-buffer.entry2/2;
    Vertex[18]=Pointer->Pos.z;
    Vertex[19]=0.0f;
    Vertex[20]=0.0f;
    Vertex[21]=1.0f;
    Vertex[22]=uvTexturRD.entry1;
    Vertex[23]=uvTexturRD.entry2;

    _3DOT_LogWr("...",1);

    Vertex[24]=Pointer->Pos.x-buffer.entry1/2;
    Vertex[25]=Pointer->Pos.y-buffer.entry2/2;
    Vertex[26]=Pointer->Pos.z;
    Vertex[27]=0.0f;
    Vertex[28]=0.0f;
    Vertex[29]=1.0f;
    Vertex[30]=0.0f;
    Vertex[31]=uvTexturRD.entry2;

    _3DOT_LogWr("Vertexbuffer gefullt !",1);

    Index[0]=1;
    Index[1]=2;
    Index[2]=3;
    Index[3]=3;
    Index[4]=4;
    Index[5]=1;

    _3DOT_LogWr("Indexbuffer gefüllt !",1);

    VertexBuffer->Unlock();
    IndexBuffer->Unlock();
    _3DOT_LogWr("Vertex u. Indexbuffer Initialisiert !",1);


Kann mir jemand sagen, was ich falsch mache ?
Pos enthällt auch nur float einträge.

Danke im voraus !

2

30.06.2009, 11:28

Schon mal den Debugger drüberrauschen lassen?

Und muss die Indizierung (nach Definition eines Vertexformats) nicht so aussehen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Vertex 1, index 0 

Vertex[0]=Pointer->Pos.x-buffer.entry1/2;    // Position

Vertex[0]=Pointer->Pos.y+buffer.entry2/2;
Vertex[0]=Pointer->Pos.z;
Vertex[0]=0.0f;    // Normale

Vertex[0]=0.0f;
Vertex[0]=1.0f;
Vertex[0]=0.0f;    // uv

Vertex[0]=0.0f; 

// Vertex 2, index 1

Vertex[1]=Pointer->Pos.x-buffer.entry1/2;    // Position

Vertex[1]=Pointer->Pos.y+buffer.entry2/2;
Vertex[1]=Pointer->Pos.z;
Vertex[1]=0.0f;    // Normale

Vertex[1]=0.0f;
Vertex[1]=1.0f;
Vertex[1]=0.0f;    // uv

Vertex[1]=0.0f; 

// usw.
fka tm

3

30.06.2009, 11:45

Erstmal wie soll ich den Debugger drüberrauschen lassen ?
Ich bin im Vollbildmodus und das system bleibt an der entsprechenden Stelle komplett stehen. Dadurch kann ich den Debuger überhaupt nicht einsehen.

Zu der Indizierung.
Ich habe zwar an dieser Stelle ein float-Array angelegt, weill die Inhalte des Vertexbuffers (Koordinaten,Normals u. UV-Koords) eigentlich ja auch nur float Werte sind.
Bei meinen anderen Objecten(die Modelle) des Spiels wird der komplette Block an floatwerten aus der Datei direkt in den Vertexbuffer gelessen und dort habe ich Beispielsweisse nur einen void zeiger an Lock übergeben.

Theoretisch müsste das eigenlich so funktionieren.
Sorry !

4

30.06.2009, 11:58

Dann erstell doch eine Windowed-App!?
Dann mit'm Debugger schrittweise durch.
(Haltepunkt vor dem Füllen des VB)

Oder verwende PIX zur Analyse.
(DirectX SDK - Utilities)
fka tm

5

30.06.2009, 12:17

:) Ok ich werde das mal mach und danke dir.

drz

Frischling

  • Private Nachricht senden

6

30.06.2009, 12:17

@ TrikkieMikkie, ich glaub bei deiner Füll-Variante würdest du immer wieder des erste Element der Vertexstruktur im VB überschreiben.

@ Andi0310

Du hast doch dein log-file. Mach doch mal ne Ausgabe, ob der Vertexbuffer so erflgreich lock't werden konnte, bevor du ihn mit den Daten befüllst.

PS: Sollten deine Index-Daten nicht bei 0 starten?

Index[0]=0;
Index[1]=1;
Index[2]=2;
Index[3]=2;
Index[4]=3;
Index[5]=0;

Was aber dein problem im Moment nicht sein sollte...

7

30.06.2009, 12:34

Zitat von »"drz"«

@ TrikkieMikkie, ich glaub bei deiner Füll-Variante würdest du immer wieder des erste Element der Vertexstruktur im VB überschreiben.


Das stimmt wohl. ;)
Zumindest bei diesem "Vertexformat".
Hab ja auch oben geschrieben: ... nach Definition eines Vertexformats...
fka tm

drz

Frischling

  • Private Nachricht senden

8

30.06.2009, 12:40

Wäre ich Bart Simpson, müsste ich jetzt wohl 100x "Ich muss die Beiträge richtig lesen." an die Tafel schreiben. <:

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

9

30.06.2009, 12:51

die indizierung ist schon richtig, auch wenn man das am besten zu einer
struktur zusammenfasst. falsch ist es aber nicht

128 bytes -> 32 floats
12 bytes -> 6 words

das sieht auch gut aus. wie groß ist den WORD und FLOAT auf deinem system.
natürlich wären an dieser stelle auch die ausgaben im log angebracht.
möglicherweise schmiert er beim unlock ab, wenn man zu weit geschrieben
hat (hatte ich mal).

wenn er den vertex/indexbuffer nicht erstellen kann arbeitet er mit einem
nullzeiger weiter. das kann die anwendung auch crashen.

tipp: in einer vollbild anwendung taskmanager aufrufen (man sieht ihn nicht),
dann [entf] drücken und mit [enter] bestätigen. klappt manchmal ohne
neustarten zu müssen. auch ein wiederholtes alt-tabben mit dem
taskmanager kann helfen
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

10

30.06.2009, 12:51

Zitat von »"drz"«

Wäre ich Bart Simpson, müsste ich jetzt wohl 100x "Ich muss die Beiträge richtig lesen." an die Tafel schreiben. <:

Don't worry! ;)

Aktuell haben wir 2684 registrierte Mitglieder.
Darunter sind etliche Garnicht-Leser,
Text-Überflieger, die den Sinn des Threads/Posts verstehen - oder eben nicht,
Genauhingucker aber Nullchecker,
Nur-Threadtitel-Leser und Oberdurchblicker/Blindposter

usw. usf. :)
fka tm

Werbeanzeige