das ist mein erstes post hier und ich muss sofort zugeben, dass ich eigentlich gar nicht in delphi programmiere, sondern in cpp mit opengl libs unter linux. aber das tut nichts zur sache, die libs sind ja dieselben. bevor ich jetzt meine frage formuliere: ich habe seit ein paar tagen nicht richtig geschlafen, sondern haenge nur vor meinem rechner, weil die engine, die ich baue, fertig werden muss...
ich bin dabei, eine recht komplexe engine zu bauen und habe ihr dank des wirklich brillianten tutorials von "son of satan" fast einen spiegel hizugefuegt. der stencilbuffer tut schon, was er soll, aber es ist relaitv schwer, den spiegel in die szene einzufuegen. meine engine verfuegt ueber einen szenegraphen, der alle objekte, translationen, rotationen usw. beinhaltet, die benoetigt werden. den spiegel realisiere ich nun dadurch, dass ich diesen graphen in der display funktion zweimal durchlaufen lasse. einmal nach dem ausfuehren von glScalef(,,). vor diesem scaling aktiviere ich den stencil buffer und zeichne eine zu testende ebene, in die hineingerendert werden soll. nun das problem: diese ebene hat bezueglich der camera immer die gleichen koordinaten, ist also staendig vor mir. ich sollte vielleicht sagen, dass die camera ebenfalls durch einen knoten repraesentiert wird, der immer der rootkonten des szenegraphen ist, und somit zweimal durchlaufen wird (in ihm wird z.b. das lookat ausgefuehrt). das wollte ich spaeter noch aendern, aber es kann doch nicht grund fuer den fehler sein, oder?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Tut mir leid, aber irgendwie fehlt in deiner recht ausführlichen Beschreibung ne genaue Fehlerbeschreibung. Was funktioniert denn nicht, und wie sieht der Fehler denn aus?
Für komplexere Szenen würde ich übrigens keine Stencil-Spiegel verwenden, sondern eher Render-To-Texture (über PBuffer). Das hat nämlich den Vorteil das du da z.B. je nach Rechnerperformance die Größe der Spiegeltextur variieren kannst (kleinere Textur = bessere Performance bei geringerer Qualität). Ausserdem musst du das was "hinter" dem Spiegel liegt bei dieser Methode nicht in jedem Frame neuzeichnen, was auch wieder Performance bringt. Ganz nebenbei kannst du dann auf diese Spiegeltextur auch noch Shader anwenden um einige interessante Effekte auf der Spiegelfläche darzustellen; das geht mit einem Stencilspiegel natürlich nicht.
Hmm, bevor ich jetzt klaeglich versuche, den Fehler zu beschreiben: Gibt es ein gutes Tutorial, das mit erklaert, wie ich den Spiegel auf eine Textur rendere?
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
@rswm :
Les doch mal bitte seine Problembeschreibung genau durch. Da sagt er doch dass seine Spiegel auf meinem Tutorial hier basieren.
@saber :
Das geht eigentlich genauso wie bei den Stencilschatten. Allerdings brauchst du keinen Stencilpuffer und eigentlich auch keine Clippingplanes.
Du renderst die Szene vom Blickpunkt des Spiegels aus in den Backpuffer (bei einfachem RendertoTexture) oder in den PBuffer (zwar auch in den Backpuffer, aber mit dem RC des PBuffers) und kopierst diesen dann in die Textur. Danach musst du diese Textur nur noch auf der Spiegelfläche darstellen. Im Endeffekt ist diese Methode einfacher als die Stencilsache und lässt auch einige schöne Effekte zu die sonst nicht möglich wären. Nachteile hat sie natürlich auch, so muss deine Spiegeltextur 2^n*2^n groß sein und je nach Auflösung sieht der Spiegel dann grobkörnig aus. Aber ich würde für ne komplexe Engine die RenderToTexture-Methode nehmen.
ok, ich moechte das ganze doch gerne mit dem stencil buffer machen (die szene ist nicht mehr so komplex). also ich moechte nochmal versuchen, mein problem etwas genauer zu beschreiben:
es geht nicht wirklich um den spiegel. der funktioniert dank dir, SoS . das problem ist, dass ich den spiegel an eine bestimmte stelle in meiner szene stellen will und dafuer die koordinaten richtig ausrechnen muss, was mir einfach nicht gelingt! diese gestenclilte ebene ist immer realtiv zur camera an derselben position. ich habe jetzt also quasi so nen rueckspiegel immer vor mir. der muss aber an einer position im raum liegen und bleiben. um dies zu tun, habe ich den translationvektor aus der modelviewmatrix genommen und ihn immer auf jeden punkt des spiegels (der stencilebene) addiert. die modelviewmatrix ist in einem 16fachen floatarray und der transvek sind dann die stellen 12,13,14. leider klappt es aber nicht. der spiegel ist jetzt nur relativ von der camera an der gleichen position nur leicht verschoben.
kann mir einer einen tipp geben, wie ich das hinkriege? ich verzweifle hier gerade...
Registriert: Di Jul 01, 2003 18:59 Beiträge: 887 Wohnort: (The Netherlands)
Programmiersprache: fpc/delphi/java/c#
also du mochtest deiner spiegel irgendwo anders als 0,0,0 setzen. Zum beispiel mochters du die spiegel auf 0,0,5 setzen.
Fur das rendern der spiegels (mirror) soltest du den volgenden regeln setzen:
gltranslatef(mirrorpos.x,mirrorpos.y,mirrorpos.z);
glrotatef(mirrorrot.x,1,0,0);
glrotatef(mirrorrot.y,0,1,0);
glrotatef(mirrorrot.z,0,0,1);
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Steht doch im Tutorial recht ausführlich drin. Mit der Clippingplane verhinderst du, das Geometrie die "aus" dem Spiegel hinaus in die "echte" Szene ragen würde gerendert wird. Für nen korrekten Spiegel musst du deshalb auch eine Clippingplane nutzen, die entpsrechend der Spiegelposition ausgerichtet werden muss.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Da hab ich nix weiter gemacht als ein 4-Werte-Floatarray mit den Konstanten vorzubelegen, die die Clippingplane beschreiben.
Müsste in C dann wohl so aussehen :
Code:
float clipplane[4] = {0.0, 0.0, 0.0, -1.0, 0};
Das beschreibt allerdings nur die Ausrichtung der Clippingplane (diese "steht" auf der Y-Achse), und du musst die Clippingplane entsprechend deiner Spiegelposition verschieben bzw. rotieren, so wie es Noeska beschrieben hat.
Mitglieder in diesem Forum: 0 Mitglieder und 23 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.