JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=8b732f00c45a28a53238e3078b6fec51Medaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fehler bei pointsprites
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL
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

BeitragVerfasst am: 26.04.2005, 11:23    Titel: Fehler bei pointsprites Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.04.2005, 11:37    Titel: Antworten mit Zitat

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 Wink
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:47    Titel: Antworten mit Zitat

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 Wink
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.04.2005, 11:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:51    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 11:57    Titel: Antworten mit Zitat

Hmn.... dann ka Smile Ich empfehle Billboards Rolling Eyes
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 12:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Fallen
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 26.04.2005, 12:04    Titel: Antworten mit Zitat

1000 Partikel sind ja auch wirklich ne extreme Anzahl, evtl sogar sehr übertrieben Wink
_________________
"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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 12:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Patrick
Dark JLI Master



Anmeldedatum: 25.10.2004
Beiträge: 1895
Wohnort: Düren
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 12:08    Titel: Antworten mit Zitat

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 Smile
_________________
'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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 12:55    Titel: Antworten mit Zitat

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 Laughing . 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Dr. Best
Senior JLI'ler


Alter: 34
Anmeldedatum: 17.06.2004
Beiträge: 269
Wohnort: Köln
Medaillen: Keine

BeitragVerfasst am: 26.04.2005, 13:25    Titel: Antworten mit Zitat

JOOOOO Very Happy Very Happy Very Happy .
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen AIM-Name MSN Messenger
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> DirectX, OpenGL Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum