Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Hi @ll,
Klar, irgendwann musste ich hier ankommen: Partikel, und damit auch Billboards.
Ich versuche mich momentan an den Sphährischen dieser Art. Ich habe mir den Wiki-Artikel angeschaut und irgendwie komm ich nicht so recht weiter. Ich habe jetzt die 2. und 3. Methode versucht, immer hat irgendwas nicht geklappt.
Bei der zweiten (Softwarematrix) habe ich es nicht geschafft, meine Wasserspiegelung ordnungsgemäß zu berechnen, ich habs also nicht geschafft, die Partikel an der XZ-Ebene zu spiegeln.
Bei der dritten (Up-/Right-Vector) bekomme ich teilweise SIGPE-Fehler (was auch immer das heißen mag, ich vermute floating point operation) und sonst werden auch die Partikel nicht richtig gedreht...
Letzendlich ist es mir relativ egal, welche ich verwende, hauptsache es läuft, am besten wär aber natürlich die 3., weil mehr speed.
(Hinweis: Ich habe meine Kameraoperationen in der Projektionsmatrix, was das ganze wohl noch etwas komplexer macht, aber es geht bei mir leider nicht anders, weil ich die Nicht-Kamera-Matrix-Operation in Shadern separat verwenden muss)
Ich frage mich zudem, wie es zu einem Floating-Point fehler kommen kann, wo ich doch nirgendwo teile...
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Mai 04, 2002 19:48 Beiträge: 3830 Wohnort: Tespe (nahe Hamburg)
Für Partikel würde ich nicht mehr unbedingt Billboards einsetzen. Wesentlich weniger Geometry zur GPU solltest Du befördern, wenn Du Pointsprites einsetzt, was für Dich zudem den Vorteil hätte, dass Du nur mit einem Punkt für die Position eines Partikels arbeiten musst. In der DGLSDK ist ein Beispiel für "PointSprites".
_________________ "Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Habe ich gesehen, aber ich wollte mich erstmal um die Backward-Compatibility kümmern und "normale" Billboards einsetzen.
Natürlich würde später da ne Weiche reinkommen nach dem Motto if (GL_ARB_POINT_SPRITES) then mach das ganze mit PointSprites else tu es über den Billboard umweg.
Ich werd mal auf delphi3d.net schauen, wie verbreitet die PointSprite-Erweiterung ist. Wenn nur Grakas, die mit meiner Anwendung sowieso nicht klarkommen würden (ATI ) die nicht haben, kanns mir auch egal sein.
[edit]
Also, delphi3d.net sagt mir, ich kann ruhigen gewissens gl_arb_point_sprite verwenden, aktuelle wie auch nicht mehr ganz aktuelle Grakas können das, zusätzlich zu denen, die noch die gl_nv_point_sprite erweiterung haben dürften das genug sein.
Aber damit komme ich jetzt auch nicht klar: Meine Punkte sind genau 1px groß. Ich habe keine Ahnung, worans liegen kann, ich habe eigentlich fast copy&paste gemacht (im Beispiel ausm sdk gehts):
[edit²]
Ok, FParticleSize war 1.0, aber: Gibt es auch eine möglichkeit, die Größe in Weltkoordinaten und nicht in Pixeln anzugeben? Das ist vorallem nervig, weil die dinger auf Entfernung gleich groß bleiben und das kann ich überhaupt nicht gebrauchen.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Also ich hatte vor kurzem selber ein paar nette Gespräche mit Kyro, weil ich auch bei meinem Billboardsys Probleme hatte. Die billboards gingen zwar an sich, aber durch Rotate und Translate wollten die sich partout nicht beeinflussen lassen, die blieben also stur an ihrer stelle. Deshalb hab ich nen anderen Weg genommen, als die Matrix einfach zu plätten, wie ich es vorher gemacht hab:
Code:
type
TQuadVect =Array[0..3]of TGLVector3f;
function TSE_Effect.GetBillBoardedPosition: TQuadVect;
Hier kommt jetzt ein Array aus 4 Vektoren raus, die genau so stehen, dass ihr Normalenvektor dem Sichtvektor der Kamera entspricht, das heisst, man blickt im 90° Winkel auf das Quad.
Nun muss man das Quad nur noch Positionieren udn Rendern:
Code:
NewPos: TQuadVect;
NewPos := GetBillBoardedPosition;
glBegin(GL_QUADS);
glColor4f (Color[0],Color[1],Color[2], Alpha);
glTexCoord2f(1,0);
glVertex3f (Position[0]+ NewPos[0][0],
Position[1]+ NewPos[0][1],
Position[2]+ NewPos[0][2]);
glTexCoord2f(0,0);
glVertex3f (Position[0]+ NewPos[1][0],
Position[1]+ NewPos[1][1],
Position[2]+ NewPos[1][2]);
glTexCoord2f(0,1);
glVertex3f (Position[0]+ NewPos[2][0],
Position[1]+ NewPos[2][1],
Position[2]+ NewPos[2][2]);
glTexCoord2f(1,1);
glVertex3f (Position[0]+ NewPos[3][0],
Position[1]+ NewPos[3][1],
Position[2]+ NewPos[3][2]);
glEnd();
NewPos ist also nun das Quad, das genau zum Betrachter gedreht wurde. DIeses muss man nun nur noch an die richtige Stelle (also die Position des Partikels) verschieben. Die Variable ist dafuer offensichtlich Position^^
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ah ok danke.
Jetzt läufts. Zwar ist die Wasserreflektion immernoch nicht ganz korrekt, aber das bekomme ich entweder hin oder ich lasse es, bei bekannteren kommerziellen Titeln (Sims 2 z.B.) haben die Billboards in den Reflektionen auch ihre probleme
Im Artikel vom Wiki ist auch etwas leicht widersprüchliches:
Zitat:
r u v p r u v p r u v p 0 0 0 1
* r ... Right-(Rechts-)Vektor * u ... Up-(Nach oben-)Vektor * v ... View-(Blickrichtungs-)Vektor * p ... Position
Das steht im Widerspruch mit dem Code:
Code:
Right = Vektor( Matrix[0], Matrix[4], Matrix[8])
Up = Vektor( Matrix[1], Matrix[5], Matrix[9])
Vielleicht sollte das korrigiert werden, vielleicht habe ich hier auch aber einen Denkfehler drinne.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wenn ich mich recht erinnere, dann werden die Matrizen von OGL doch folgendermaßen gespeichert:
Code:
04812
15913
261014
371115
wobei 12, 13 und 14 die Position darstellt.
Zitat:
r u v p r u v p r u v p 0 0 0 1
* r ... Right-(Rechts-)Vektor * u ... Up-(Nach oben-)Vektor * v ... View-(Blickrichtungs-)Vektor * p ... Position
Aus der skizze von oben geht aber eigentlich hervor, dass (0, 1, 2) = r, (4, 5, 6) = u, (8, 9, 10) = v und (12, 13, 14) = p. letzteres stimmt ja, aber der rest nicht.
oder irre ich mich?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Dann kann also das, was in dem Sphärische-Billboards-Artikel steht so nicht stimmen, oder?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habs mal korrigiert.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Obwohl der Thread schon etwas älter ist, nochmal was zu Point Sprites:
Zweifellos können Point Sprites schnell sein, aber das ist auch schon das einzige. Das sind sie aber auch nicht mehr, wenn du
a) oft die Textur wechseln musst (einschränkbar)
b) die Größe außerhalb von glBegin/glEnd ändern musst, wenn die Hardware es innerhalb nicht unterstützt.
Dann kommen die ganzen anderen Beschränkungen:
1. Das von dir angesprochene - Größenübergabe in Pixel und keine standardmäßig berechnete Perspektive
2. Keine Transformationen (in Form von Rotation, Smear usw.) möglich
3. Keine spezifischen Normalen (vielleicht lässt sich hier was über nen Pixelshader regeln)
4. Hardwaremäßige Größenbegrenzung
5. Scheinbar eine hardwaremäßig begrenzte Anzahl an Punkten?? Bin darauf beim Experimentieren gestoßen.
Imho sind Point Sprites keine echte Alternative zu den guten alten GL_QUADS, außer vielleicht für einfache Zwecke im 2D-Bereich.
Gruß
_________________ I'm not the signature, I'm just cleaning the floor...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich bin ja jetz auch bei "normalen" Billbords mit GL_QUADS geblieben. PointSprites sind zwar wie du sagtest ne nette sache für kleinigkeiten im 2D bereich, aber da kann man auch gleich Quads nehmen.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Scheint wohl seinen Grund (s.o.) zu haben, dass es in neueren Spielen nur über Quads realisiert wird.
Bei ET:QW zum Beispiel sind es noch nicht einmal wirkliche Billboards. Sprich sie werden nicht zum Betrachter ausgerichtet. Für eine Rauchsäule werden dann einfach ein paar Quads mehr gezeichnet und schön geblendet. Die sehen echt Klasse aus. Ich gehe mal davon aus, dass es performanter ist einfach ein paar Quads mehr zu zeichnen, als sie "ordentlich" auszurichten.
gruß
damadmax
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Mitglieder in diesem Forum: 0 Mitglieder und 16 Gäste
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.