Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:23 Titel: Fehler bei pointsprites |
|
|
Tach,
ich habe schon vor einiger Zeit für meine 3D-Engine (www.Ultimate3D.de.tf) partikelsysteme mit pointsprites programmiert.
Als ich sie gemacht habe haben sie wunderbar funktioniert. Doch jetzt habe ich Windows neu installiert und bemerke (wahrscheinlich auf Grund des anderen Grafikkartentreibers) einen äußerst merkwürdigen Anzeigefehler.
Wenn man halbwegs weit entfernt ist funktioniert alles wunderbar.
Doch wenn man sich in das Partikelgetümmel reinbegibt sind da auf einmal äußerst merkwürdige Anzeigefehler.
Hier zwei Bilder, einmal mit und einmal ohne Textur.
Offensichtlich geht etwas bei der Berechnung der Quads schief (siehe hier unter point rendering).
Ich verwende Direct3D 8.1 und das sind meine Pointsprite-Renderstates:
Code: | lpD3DDevice->SetRenderState( D3DRS_POINTSPRITEENABLE,true);
lpD3DDevice->SetRenderState( D3DRS_POINTSCALEENABLE,true);
lpD3DDevice->SetRenderState( D3DRS_POINTSIZE_MIN, FToDW(0.0f));
lpD3DDevice->SetRenderState( D3DRS_POINTSIZE_MAX, FToDW(caps.MaxPointSize));
lpD3DDevice->SetRenderState( D3DRS_POINTSCALE_A, FToDW(0.00f));
lpD3DDevice->SetRenderState( D3DRS_POINTSCALE_B, FToDW(0.00f));
lpD3DDevice->SetRenderState( D3DRS_POINTSCALE_C, FToDW(1.00f));
lpD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE, false); |
Ich habe allerdings auch schon viele andere Renderstates ohne Erfolg ausprobiert (z.B. D3DRS_POINTSCALEENABLE->false).
Des weiteren verwende ich Softwarevertexprocessing da die pointsprites mit meiner hardware überhaupt nicht laufen (Geforce 2 MX 400).
Rendern tue ich so:
Code: | if(ppartikel->number>0){
lpD3DDevice->SetStreamSource(0,ppartikel->points,sizeof(SPoint));
lpD3DDevice->DrawPrimitive(D3DPT_POINTLIST,0,ppartikel->number);} |
Hat irgendjemand schonmal ein ähnliches problem gehabt oder weiß weshalb es auftritt oder was man dagegen tuen kann?
Ich bin für jede Antwort dankbar
mit freundlichen Grüßen
Christoph Peters _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:35 Titel: |
|
|
Für mich sieht das aus wie falsch gesetzte Texturkoordinaten, bzw. jede Ecke hat die Texturkoordinate: 0,0.
Kann am Treiber liegen, evtl. weil er Buggy oder zu alt ist. Könnte aber auch ein Programmierfehler sein. _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.04.2005, 11:37 Titel: |
|
|
Falsch gesetzte Texturkoordinaten? Das sieht eher aus wie falsche Vertexkoordinaten bei den Quads, kA wie das DX intern berechnet, aber die Texturkoordinaten bemängelt er doch gar nicht _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:44 Titel: |
|
|
Ja also wie gesagt, es kann wohl sein dass das an meinem Grafikkartentreiber liegt da es vor der Windows neuinstallation geklappt hat. Aber dummerweise bin ich nicht der einzige der dieses Problem hat und daher wäre es mir lieber das irgendwie im code zu beheben.
Übrigens (hab ich oben vergessen) mein FVF sieht so aus.
Code: | #define D3D_PARTICLE (D3DFVF_XYZ| D3DFVF_PSIZE| D3DFVF_DIFFUSE)
struct SPoint{
D3DXVECTOR3 pos; //Die Position des Partikels
float size; //Die Größe des Partikels
DWORD color; //Die Farbe des Partikels
}; |
_________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:47 Titel: |
|
|
Ich kenne mich mit Pointsprites nicht aus, da bin ich ehrlich. Ich bevorzuge lieber Billboards, da man bei denen ein paar Features mehr hat und sie überall laufen. Aber muss dort keine Texturkoordiante hin? Also ich als Grafikkarte würde mich etwas "verarscht" fühlen, wenn ich Position, Textur und Farbe bekomme, aber keine Koordianten wie die Textur gesetzt werden soll _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.04.2005, 11:48 Titel: |
|
|
Was mir da noch einfällt, muss man das FVF nicht erst noch mit SetFVF setzen? _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:50 Titel: |
|
|
FallenAngel84 hat Folgendes geschrieben: | Was mir da noch einfällt, muss man das FVF nicht erst noch mit SetFVF setzen? | Eigentlich schon _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 11:51 Titel: |
|
|
Ne, bei pointsprites braucht man keine Texturkoordinaten.
Die werden automatisch gesetzt (wird hier sehr schön beschrieben)
Außerdem funktioniert es ja einwandfrei wenn man ein bisschen von dem Partikelsystem entfernt ist. Erst wenn man den Partikeln sehr nahe kommt treten diese Fehler auf.
EDIT FVF is gesetzt. War bloß ein paar Zeilen weiter oben und weil ich meine renderschleife nich mitposten wollte hab ich das vergessen.
lpD3DDevice->SetVertexShader(D3D_PARTICLE); _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 12:02 Titel: |
|
|
Billboards sind aber im vergleich zu pointsprites so furchtbar umständlich und wahrscheinlich auch ineffizienter. Da müsste ich ja jeden frame für jeden partikel ein entsprechendes Quad zurechttransformieren.
Ich glaube bei 1000 Partikeln macht das dann schon eine beträchtliche Performanceeinbuße. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Fallen JLI MVP
Alter: 40 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 26.04.2005, 12:04 Titel: |
|
|
1000 Partikel sind ja auch wirklich ne extreme Anzahl, evtl sogar sehr übertrieben _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 12:06 Titel: |
|
|
Na gut, aber 300 werden schon oft verwendet.
Außerdem ist meine 3D-Engine ja für Anfänger gedacht und die vergessen oft schonmal auf die Performance zu achten.
Da werden dann weil's so schön aussieht einfach mal gerade 10000 Partikel verwendet. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Patrick Dark JLI Master
Anmeldedatum: 25.10.2004 Beiträge: 1895 Wohnort: Düren Medaillen: Keine
|
Verfasst am: 26.04.2005, 12:08 Titel: |
|
|
Dr. Best hat Folgendes geschrieben: | Billboards sind aber im vergleich zu pointsprites so furchtbar umständlich und wahrscheinlich auch ineffizienter. Da müsste ich ja jeden frame für jeden partikel ein entsprechendes Quad zurechttransformieren.
Ich glaube bei 1000 Partikeln macht das dann schon eine beträchtliche Performanceeinbuße. |
Och sag das nicht, mit Billboards kann man schon paar feine Sachen machen! Mehr als mit Pointsprites. Und wer ordentlich und schön effizient gecodet hat merkt keinen Performanceunterschied _________________ 'Wer der Beste sein will muss nach Perfektion streben und jede Gelegenheit nutzen sich zu verbessern.' - KIA
[ German Game Dev | Boardsuche hilft sehr oft | Google rockt | Wie man Fragen richtig stellt | ICQ#: 143040199 ] |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 12:55 Titel: |
|
|
Korrigier mich wenn ich mich irre aber so wie ich das sehe wäre dann der effizienteste Weg der folgende:
Immer wenn das Partikelsystem verändert wird (was meistens jeden Frame der fall ist) müsste ich dann eine Transformationsmatrix für jeden Partikel erstellen und diese mit der Kamerarotationsmatrix multiplizieren. Und dann müsste ich in einer Schleife immer das gleiche Quad mit anderem material und anderer Transformationsmatrix rendern.
Oder ich verwende viermal so viele Vertices um gleich ein Quad pro Partikel zu haben und transformiere sie vor dem Rendern entsprechend.
Beides ist bestimmt ineffizienter als Pointsprites auch wenn Billboards vielleicht noch ein paar zusätzliche Möglichkeiten bieten.
Ich bin halt ein Pointspritefan . Deswegen werde ich glaube ich auch erstmal noch ein bisschen weiter nach einer anderen Lösung suchen.
Wenn irgendwer anders auch schon dieses Problem hatte und vielleicht sogar weiß was man dagegen tuen kann wäre ich für einen Post auf jeden Fall nach wie vor dankbar. _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
Dr. Best Senior JLI'ler
Alter: 34 Anmeldedatum: 17.06.2004 Beiträge: 269 Wohnort: Köln Medaillen: Keine
|
Verfasst am: 26.04.2005, 13:25 Titel: |
|
|
JOOOOO .
Ich hab die Lösung gefunden!
Es war wohl tatsächlich ein Fehler im Grafikkartentreiber aber ich habe einen Weg gefunden ihn zu beheben.
Ich habe mal ganz systematisch drüber nachgedacht: Dieser Fehler tritt immer ganz plötzlich auf wenn man sich in das Partikelsystem begibt. Also stellt sich die Frage was ändert sich wenn man sich in das Partikelsystem reinbewegt.
Und da kam mir der Moment der Erleuchtung wie es ihn bei solchen Fehlern die scheinbar absolut sinnlos auftreten so oft gibt: Partikel werden geclippt. Und dann greift der fehlerhafte Grafikkartentreiber wahrscheinlich auf falsche Datenbereiche zu.
Also hab ich clipping über den Renderstate D3DRS_CLIPPING deaktiviert und es hat tatsächlich funktioniert. Ich verwende sowieso frustum culling.
Wieder eine Problemlösung mehr in der wachsenden Wissensmenge dieses Forums =). _________________
Ich bin da, wer noch? |
|
Nach oben |
|
|
|