Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Hallo Welt,
ich habe mich nach langer Zeit mal dazu durchgerungen eine Partikelengine (wenn man es als engine bezeichnen kann ) zu schreiben. Die Partikel bzw das Partikelsystem wird wie folgt gespeichert:
Direction:Array[0..1]ofSingle;// Richtung bzw Geschwindigkeit
Livetime:Integer;// Anzahl Renderdurchgänge bis zur Löschung
Color:Array[0..3]ofSingle;// Farbe im RGBA Format
Fading:Single;
Size:Single;
Precached:record
Alpha, b, a, l:Single;
Size, Start:Single;
Color:Array[0..3]ofSingle;
End;
End;
Particlesystem =record
// ParticleImage: String;
Texture:Cardinal;
NumOfParticles:Integer;
Speed:Array[0..1]ofSingle;
Start:Single;
Size:Array[0..1]ofSingle;
Color:Array[0..3,0..1]ofSingle;
Livetime:Array[0..1]ofInteger;
Angle:Integer;
Particles:Arrayof Particle;
End;
Nachdem die Partikeldaten mit entsprechenden Funktionen oder direkt an ein Particlesystem übergeben wurden, berechnet eine Routine die Daten für jedes einzelne Partikel:
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Erstmal respekt sieht gut aus und zweitens hätt ich noch ne idee zur verbesserung der perf.
Mach doch noch eine funktion rein die vor der renderschleife die position der Partikel in eine liste speichert und wenn ein schalter an ist nimmt er die liste anstatt jedesmal die pos neu zu berechnen. Ist zwar speicheraufwendiger aber wenn man die gleichen settings mehrmals hat in falle von Fakeln oder ähnliches braucht man diese nur einmal. Dies macht die FPS ein bischen besser, da ein paar rechenoperationen wegfallen.
MfG TAK2k4
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Danke für das Kompliment. Hätte nicht gedacht, dass jeman, der mehr Ahnung hat als ich mich mal loben könnte. Das baut dann direkt mal wieder auf.
Ich hatte ja schon extra die Steigung und die Farben etc. gespeichert, damit ich das nicht neu berechnen muss. Meinst du echt, dass würde nochmal boost geben? Aber mit dem Schalter könnte ich ja immerhin auswählen, ob ich den RAM oder die CPU vollknalle.
Ich werde es mal probieren.
_________________ Rock is a message.
Hear the message an you will rock!
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
So, hab jetzt so gemacht, dass das Partikelsystem beim Aufruf der Vorberechnung (giPrepareParticleSystem) das Ganze erstmal in eine Art Liste "rendert".
Diese Liste speichert die Informationen X, Y und das Fading vom Alpha. Für die Indizierung des Arrays der Liste hab ich das alles einfach an die LiveTime gekoppelt. Mit nem Schalter UseMem kann man das einstellen. Nur während der Laufzeit geht das noch nicht.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Hi,
besser ist relativ und was jetzt fehlt ist eine FPS anzeige sowie eine möglichkeit den schalter zur laufzeit mal umzulegen.
Achso in demo 2 ist flamme 1 = flamme 3, in demo 1 aber sind alle unterschiedlich weis nicht ob das gewollt war.
Wenn noch ein visuellen FPS counter willst, sag bescheid. Ich kann dir ein geben.
Denn Problem ist wie soll man sehen obs schneller ist wenn keine fps da ist ^^
MfG TAK2k4
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Ja, ein visueller wäre ganz gut. Hab nur einen für in den Fenstertitel. Aber den sieht man nur im fenstermodus. und selbiger funzt bei der compilierten version irgendwie nich.
EDIT:
Meintest du bei den Flammen das Aussehen? Ja, da hatte ich gestern an den Parametern rumgedreht, weil ich einem Freund das mal zeigen wollte.
_________________ Rock is a message.
Hear the message an you will rock!
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Na dann, hier hast mal ein kleines Perfmontool Marke eigenbau ^^
Ich bin noch an basteln und wenn du vieleicht schon mal in meine letzte demo geguckt hast kannst du in der readme lesen das noch doku und ein paar Indikatoren fehlen. Deswegen hab ich dir einfach mal ne komplette demo gepackt.
http://e-e.neroneus.de/GLPerfmon.rar
MfG TAK2k4
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Ich muss ehrlich gesagt gestehen, dass ich noch keine Demo von dir gesehen hab. Ich hab versucht über den Link unter deinen Antworten auf deine HP zu kommen, aber das geht nie.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
^^ das ist die adresse wo ich files ablege das ist ein 100MBit Server den ich mit ein paar kumpels zusammen mieten.
Die Demo findest du wenn du mal in OpenGL Thread ziemlich weit oben suchst, ist erst gestern online gegangen ^^.
MfG TAK2k4
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Ich hab versucht mir die Demo anzugucken. Aber die geht genau wie das Beispielprog zu Perfmon nicht. Da kommt immer kurz ein schwarzer Monitor und dann kommt Windows wieder.
Momentan habe ich aber auch viel zu tun. Ich werde mal bei GElegenheit anhand deines Perfmon Progs kucken wodran es bei mir liegt.
_________________ Rock is a message.
Hear the message an you will rock!
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Das Problem liegt irgendwo bei ChangeDisplaySettings mach einfach mal selber compilieren und setzt davei einfach mal auf nicht vollbild.
Zumindestens hat es so einer dann starten können aber ist trotzdem komisch wieso das bei 2 nicht ging und beim rest schon ?:/
am perfmon interresieren dich ledeglich der uses, with GLPerfmon do,startortho bis endortho und der GLPerfmon.stop teil im quelltext.
MfG TAK2k4
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Habe mir die Demo noch nicht angeschaut sondern nur erst einmal den Code überflogen. Evtl solltest du noch deine OpenGL Ausgabe optimieren. Und zwar meine ich dort im Speziellen giBegin(gi_Quads); und giEnd. Wieso heißt das eigentlich gi? Denke aber mal, dass das direkt OpenGL ist.
Und zwar empfielt es sich, dass du glBegin und glEnd nicht "unnötig" aufrufst. Wenn du also 2000 Flächen zeichnen musst die alle vom selben Typen sind würde ich es so machen. Das ließe sich auch recht einfach einbauen.
Code:
glBegin(GL_Quads);
for Idx := 0 to 2000 do begin
glColor(...);
glVertex(...);
// etc.
end;
glEnd;
Einen größeren Geschwindigkeitsvorteil dürfest du haben, wenn du alternativ zu GL_QUADS auch einen Renderpfad mit GL_POINT einbaust. Diesen kannst du aber auch nur dann benutzen, wenn folgende Extensions unterstützt werden.
GL_ARB_point_parameters GL_ARB_point_sprite Durch die letzte Extension brauchst du dich nicht mehr um Texturen zu kümmern. Die werden dann immer komplett auf dem Punkt dargestellt. Bei Punkten hast du nur noch einen Vertex und die zeigen eh immer in Richtung der Kamera. Du bräuchtest dich dann nur noch um die Farbe, Position und die Größe kümmern.
Wenn du das sinnvoll optimiert und nach der Größe sortierst könntest du deine Punkte auch in einem Vertext Buffer Object schreiben und könntest dann das Zeichnen noch einmal recht stark vereinfachen und womöglich auch noch mal Beschleunigen.
Die Partikel kann man auch in einem Vertex Program animieren. Bei NVidia gibt's Demos dazu. Ob das immer praktisch ist, hängt von der Situation ab.
Außerdem sieht es auch noch gut aus, wenn man die Partikel dreht.
Registriert: Do Dez 30, 2004 14:49 Beiträge: 71 Wohnort: STADT Kirchen
Wenn ich ehrlich sein soll, hab ich keinen Plan, wovon ihr redet Ich bin N00b und weiß ehrlich gesagt nix mit Renderpfad, Extensions oder Vertexprogrammen anzufangen. Ich bin erst noch dabei, einer von den guten Codern zu werden
_________________ Rock is a message.
Hear the message an you will rock!
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Okay. Wenn das so ist dann vergiss am Besten das was ich über VBO's (Vertex Buffer Objects) gesagt habe. Das ist die Möglichkeit Grafikkartenspeicher zu alloziieren um dort Vertex, Farb und Texturkoordinaten abzulegen. Das kannst du aber momentan erst einmal außer acht lassen. Solltest du dich aber später mal mit beschäftigen.
Das mit den glBegin und glEnd brauche ich jetzt aber nicht noch einmal erklären, oder?
GL_POINTS gehört zu den Grundprimitiven von OpenGL. Neben GL_QUADS, GL_TRIANGLES, etc. Ein Punkt zeichnet sich dadurch aus, dass er nur eine Vertexkoordinate besitzt. Wärend du bei einem Dreieck oder Viereck jeweils 3 oder 4 Koordinaten angeben musst genügt dort einer. Aus diesem Grund musst du bei einem Punkt noch eine Größe angeben. Das machst du mit glPointSize. Diese Angaben sind in Pixel und können von Grafikkarte zu Grafikkarte unterschiedlich ausfallen. Die Punkte werden immer gleich groß dargestellt egal wo sie sich befinden. Und sie besitzen nur eine Farbe. In diesem Zustand sind die Punkte natürlich überhaupt nicht für ein Partikelsystem einsetzbar.
Aus diesem Grund wurden die beiden Extension zur OpenGL implementation hinzugefügt. Wenn der Grafikkartentreiber eine Extension unterstützt wird der Extensionname zu einem abrufbarem Text hinzugefügt. Unser OpenGL Header liest diesen ein und versucht die Funktionspointer der Extensions zu laden. Um abzufragen ob eine Extension unterstützt wird brauchst du nur if GL_ARB_point_parameters then ... machen.
GL_ARB_point_parameters bietet Möglichkeiten die Punktgröße von OpenGL automatisch, je nach Entfernung des Punktes, anpassen zu lassen. Der selbe Effekt wie bei normalen Flächen. Umso weiter sie weg sind umso kleiner werden sie.
GL_ARB_point_sprite bietet die Möglichkeit Texturen auf Punkte anwenden zu lassen. Somit hättest du dann eine Textur als Punkt. Nichts anderes wird ja in einem Partikelsystem gemacht.
Renderpfad. Die sinnvollste und beste Möglichkeit wäre wohl, wenn du dir eine abstrakte Basisklasse anlegst. Diese definiert nur die Methoden und die Verwaltung der Partikel mit Lebenszeit, etc. Das Zeichnen hingegen wird in einer Ableitung dieser Klasse erledigt. Somit weiß das eigentliche Partikelsystem nicht als was die Partikel dargestellt werden. Die könnten dann rein theoretisch auch als kleine fliegende Schweine dargestellt werden. Wenn du dann dein Partikelsystem erzeugst erstellst du eine Instanze von den Ableitungen. Du musst natürlich überprüfen was alles unterstützt wird. Werden beide Extension (von oben) unterstützt kannst du ein Punktpartikelsystem erstellen. Sollte das nicht der Fall sein so müsstest du dann ein Herkömmliches auf Flächen basiertes System erstellen.
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.