totaler absturz beim aufruf von DrawIndexedPrimitive(...)
-
Andrey schrieb:
Hat jemand von euch vielleicht eine idee, was dazu führen kann, dass beim aufruf der pIDirect3DDevice9->DrawIndexedPrimitive(...) methode das programm komplett abstürzt
Falsche Daten. f'`8k
Gruß, TGGC (\-/ has leading)
-
@progchild: schon mal dazu eine antwort...
nein, alles ist 100% richtig initialisiert, alle pointer sind in ordnung, alle arrays richtig ausgefüllt (hab mir die komplett in die logfile ausgeben lassen, sah alles wunderbar aus) , alle streams korrekt auf die entsprechenden buffer umgeleitet. (da bin ich mir schon ziemlich sicher, denn: komischerweise klappt es wunderbar in 10% der fälle. Da wird so ein komischer polygonklumpen erstellt und korrekt gerendert. Aber kaum verändere ich ein kleines bisschen die form des klumpens, so stürzt alles meistens ab. Es funktioniert schon, nur ebn in seltenen ausnahmefällen... und das finde ich merkwürdig Bei sechs hundert dreicken klappt es, bei 597 dann aus irgendeinem grund wieder nicht, halt so ab und zu...)
-
Kann es sein, dass deine Indices auf Teile außerhalb deines Vertex Buffers zeigen? Oder dass der Vertex Buffer nicht genug Speicher reserviert hat?
-
nnee... wie gesagt: habe den ganzen index buffer ins logfile schreiben lassen, irgendein zu großer index wurde da sofort auffallen. Mit der speicherplatz reservierung muss eigentlich auch alles in ordnung sein (also, ich übergebe da schon die richtigen zahlen, was der DX damit macht weis nur DX selbst...) Anzahl der zu zeichnenden dreiecke überschreitet nicht die möglichkeiten meiner grafikkarte (laut D3DCAPS zumindest...) , habe ich überprüft...
weis nicht, was _kann_ denn da überhaupt schieflaufen. nur rein theoretisch: was wäre sonst noch denkbar? (kaputte grafikkarte= kommt "leider" auch nicht in frage, alle spiele laufen)
-
was _kann_ denn da überhaupt schieflaufen?
kaputte grafikkarte kommt "leider" auch nicht in fragene, ne, das ist schon dein fehler
zeig doch mal bitte den code der vertex- & indexbuffer anlegt, fuellt und rendert.
wie sieht das vertexformat aus und geht das durch 'nen shader?
-
@hellihjb:
vertexformat: D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE
shader: keinezeig doch mal bitte den code der vertex- & indexbuffer anlegt, fuellt und rendert.
ne, lieber nicht, das ist nähmlich ein ziemlich großer brocken (allein das füllen und anlegen=so um die 700 zeilen^^), glaube kaum, dass jemand fürn einfaches "dankschön" so viel zeit opfern wird, sich den code durchzulesen, sogar ich selbst fange langsam an zu vergessen, was da alles drinsteht (nicht besonders elegant, aber kein spaghetticode: hat schon alles nen sinn
)
Mal n kleiner themawechsel. "nene, ist schon mein fehler..." okay. Aber dann kann mir doch bestimmt jemand mal erklären warum folgende zwei konstruktionen zu unterschiedlichen ergebnissen führen (alle buffer bleiben dabei unverändert):
//100 dreiecke aus trianglelist _einzeln_ rendern for(int index=0; index<300; index+=3){ pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, index,3, index,1); } //nicht dasselbe wie 100 dreiecke aus ner trianglelist rendern???? pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0,300, 0,100);
Also, ich kann da keinen riesigen unterschied erkennen. Allerdings fügt DX anscheinend völlig selbständig irgendwelche dreiecke hinzu, die gar nicht existieren können (und im indexBuffer wirklich nicht existieren, in dem fall, dass ich die dreiecke einzeln zeichne. Wenn sie alle gleichzeitig gezeichnet werden, scheint alles in ordnung zu sein... Ist das auch mein fehler? falls ja: wo
thx @ all schonma...
-
Was spuckt den der Debugger aus?
Normalerweise kann man da ja alles LIVE mitverfolgen, und DX schreibt schon sehr zuverlässige Nachichten, ob etwas klappt oder nicht. ( Aber erst DX in den Debug-Modus , und Warnstufe auf voll ).Falls du keinen Fehler in der Debug-Ausgabe findet, einfach mal komplett posten.
Mfg Reinhold Fischer
P.S.: Weiß nicht genau ob das bei dem aktuellen DX noch so geht, bei 8.1 gings zumindest so, konnte man die Fehler immer gut lokalisieren.
-
Das was der DX im debugmodus da von sich gibt ist für mich überhaupt nicht nachvollziehbar. Es heisst:
Direct3D9: (ERROR) :Stream 0 does not have required number of vertices Direct3D9: (ERROR) :DrawIndexedPrimitive failed.
tolle suppe. dabei habe ich grad in der logfile alle 6936 indices für die 2312 dreiecke, an denen DX grad gescheitert ist, stehen. Da sinn die. Schwarz auf weiß, html formatiert und mit nem rahmen hervorgehoben. Die zahl der vertices wird praktisch der DrawIndexedPrimitive übergeben. Steht auch in der logfile, nochmal zur kontrolle. Genau die selbe zahl, kein index zu viel oder zu wenig.
Klappt nicht.
Die 6936 indices reichen nicht, um 2312 dreiecke zu zeichnen.Warum auch immer. Irgendwelche vorschläge?
-
Bei DrawIndexedPrimitive gibt es ja die Parameter MinIndex, NumVertices und StartIndex.
Was gibst du da an? Wahrscheinlich liegt der Fehler dort.
-
oh fuck!
vertices??? hä, was geht denn jetzt ab... sry, moment mal, muss nochmal nachschauen... völliger blödsinn, was zum henker soll denn hier schiefgehen???
in den index array werden doch ausschlieslich die short-werte von den entsprechenden vertices reingeschrieben, die fallen in meinem programm ja auch nicht vom himmel...
und dass sich ein "i++" zähler verzählt hat, hab ich auch noch nie miterlebt... mmoment mal... o mein gott... was ist denn jetzt los... ich brauch erstma n joint^^@all: okay, danke schon mal allen. Ab und zu richtig durchzulesen, was der debugger da meckert bringts voll
tut mir leid stehe momentan n bissl unter schock. ohjo, wenn ich jetzt feststelle, dass ich zuerst den zähler erhöhe, und dann den short dem vertex zuweise...
-
...nein, hier ist zum glück alles ok, so blöd bin ich dann auch wieder nicht. Mit dem VertexBuffer scheint alles wunderbar zu stimmen, in die logfile werden alle vertices von 0 bis 133 reingeschrieben, insgesamt 134 stück, genausoviele, wie bei der erzeugung des vertexBuffers verwendet werden. Somit ist für mich dieser fehler:
Direct3D9: (ERROR) :Stream 0 does not have required number of vertices
absolut sinnlos.
ich hab da einen vertexbuffer mit 134 vertices: von 0 bis 133.
ich hab da ein indexbuffer, in dem die größte zahl 133 ist.
was will man mehr? nun ja, eigentlich nur dass es funktioniert...@TomasRiker:
Was soll ich da falsches eingegeben haben, überall wo s ging hab ich 0 einegegben, ansonsten die anzahl der indices, dann die anzahl der primitiven, etwa so:pD3DDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,NumIndices,0,NumPrimitives);
ich sehe da eigentlich keinen platz für fehler
aber DX schafft's, hier irgendwelche fehler zu finden. nur wo?
-
fullstop. sekunde mal. NumWas?
-
ich zitiere hier mal ausnahmsweise drei zeilen ausm buch von David Scherfgen, ich hoffe mal, dass er mich deswegen nicht verklagen wird, hier hat wahrscheinlich sowieso mind. jeder zweiter das buch durchgelesen...
NumVertices: Die Differenz plus eins zwischen dem größten und dem kleinsten Index, der während des zeichenvorgangs verwendet wird. Der Name ist ein wenig unglücklich gewählt... [...]
nicht unbedingt die direkte übersetzung für das, was in der dokumentation steht:
NumVertices
[in] Number of vertices used during this call. The first vertex is located at index: BaseVertexIndex + MinIndex.ähm? muss man da also doch die Vertex-Nummer=Indices anstatt der länge der Indices-Folge angeben oder wie??? Warum hat das blöde ding das ganze dann schon mind. 100 verspeißt, ohne zu meckern? und 100000 mal mit meckern???
-
@TomasRiker: Danke! Danke danke danke danke!!!! Lag tatsächlich daran, dass ich die beschreibung des NumVertices parameters völlig falsch verstanden habe
@all: leute, ich kann euch grad gar nich genug danken, ohne euch hätte ich den blöden anfängerfehler wohl nie gefunden. danke für alle tipps!
mfg. andrey
-
Andrey schrieb:
ich zitiere hier mal ausnahmsweise drei zeilen ausm buch von David Scherfgen, ich hoffe mal, dass er mich deswegen nicht verklagen wird
Für dich mach ich mal eine Ausnahme
-
Nja, wenn man sich den satz etwas genauer durchliest, kann man alles gleich wunderbar verstehen, nur wenn man s dann doch irgendwie falsch versteht, jedoch aber alles verstanden zu haben glaubt, und der DX dann noch gemeinerweise nicht gleich abstürzt, sondern in manchen fällen einwandfrei funktioniert
, obwohl ein fehler vorhanden ist, dann ist man doch etwas verwirrt, und fängt an, das programm komplett anderswo auseinanderzunehmen, obwohl es nicht nötig ist...
Für dich mach ich mal eine Ausnahme
juhu! dann habe ich doch noch mal glück gehabt
nochmal vielen dank!
-
Na, hab ich's nicht gesagt: falsche Daten. f'`8k
Gruß, TGGC (\-/ has leading)
-
Jaja, TGGC hat wie immer recht gehabt...