Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Hi.
Wenn ich z.B. FramebufferObjects fürs Offscreen Rendering nutze, steht die Textur die ich bekomme ja auf dem Kopf. Als ob man sie in der horizontalen gespiegelt hätte, im Vergleich zu dem was man gerendert hat (zumindest wars bei mir bisher immer so ^^).
Das hat mich bisher auch nicht sonderlich gestört, weil mans ja durch die Texturkoordinaten ausgleichen kann.
Jetzt wird das ganze aber zum Problem, da ich nicht weiß wie viele Offscreen Renderings hintereinander kommen bzw. die Anzahl variablen ist. Deswegen weiß ich auch nicht wie rum meine Textur gedreht ist.
Gibts da ne elegante Methode zu um auf dem Kopf stellen zu verhindern, oder ist die einzige Möglichkeit rausfinden wie viele Vorgänge hintereinander kommen und dann die Texturkoordinaten anzupassen?
Komisch.. ich habe dieses Problem nicht. Wenn ich meine Szene in die Textur rendere ist alles wie es sein soll. Vielleicht machst du was bei der FBO-Erstellung "falsch"?! Zeig doch mal den Code dazu bitte.
Edit: Stimmt garnicht Ich hab nochmal nachgeschaut, bei mir es es genauso, habe das nur gleich mit den Texturkoordinaten angepasst.. wusste ich nicht mehr.
Jetzt wird das ganze aber zum Problem, da ich nicht weiß wie viele Offscreen Renderings hintereinander kommen bzw. die Anzahl variablen ist. Deswegen weiß ich auch nicht wie rum meine Textur gedreht ist.
Warum wird das zum Problem? Wenn du deine Texcoords anpasst kannst du das doch auch dann machen wenn du dein FBO verwendest um den nächsten FBO zu rendern. Übrigens kannst du alternativ auch einfach die entsprechende Achse in deiner Modelview-Matrix ändern, so wird das ganze gleich richtig in den FBO gerendert.
P.S. Ich glaube nicht das ein FBO falsch rum gerendert wird, sondern eher das bei dir irgendwo Texcoords oder ne Matrix verkehrt sind.
Ich hab nochmal ganz genau nachgeschaut. Das was ich in mein FBO zeichne ist wenn ich "normale" Texturkoordianten benutze tatsächlich falschrum, deswegen habe ich nicht weiter nachgeschaut, weil es bei Deathball auch so zu sein scheint. Aber ich habe beim Einstellen der Matrix die beiden Werte bottom und top vertauscht. Es ist also doch richtig rum und du hast wahrscheinlich genau da auch den Fehler.
Registriert: Do Aug 25, 2005 16:00 Beiträge: 189
Programmiersprache: Java, C#
Coolcat hat geschrieben:
Warum wird das zum Problem? Wenn du deine Texcoords anpasst kannst du das doch auch dann machen wenn du dein FBO verwendest um den nächsten FBO zu rendern.
... hm... ... ich hasse dich (Shit, ich hab ernsthaft übersehen das, wenn ich die Textur in jedem Rendervorgang richtig rum drehe und nicht einfach so wie sie kommt drauf pappe, ich weiß wie sie am Ende ankommt...) Aber danke erstma!
Naja, damit der Thread nochn Sinn bekommt:
Zitat:
Aber ich habe beim Einstellen der Matrix die beiden Werte bottom und top vertauscht. Es ist also doch richtig rum und du hast wahrscheinlich genau da auch den Fehler.
Bei welchem Einstellen von was für einer Matrix? Denn normalerweise stelle ich vorm rendern in das FBO nur den Viewport neu ein.
In nem Spezialfall wechsel ich vorher noch in den orthogonalen Modus, aber da sind alle Parameter da wo sie hingehören...
Registriert: Di Okt 03, 2006 14:07 Beiträge: 1277 Wohnort: Wien
Ich mach das bei meiner GUI, z.B. wenn ich "On Paint" zeichne, denn da passiert das Zeichnen mitten zwischen dem Zeichnen der GUI-Elemente, also so:
Das Fenster fängt an mit dem Zeichnen an und versetzt Opengl in den Orthomodus mit dem Koordinatenursprung links OBEN. Dann werden die GUI-Elemente baum-mäßig gezeichnet, bis man zu einem Element kommt, wo ein 3D-Renderer in das Event "OnPaint" eigehängt ist. Der wechselt in den perspektivischen Modus mit dem Koordinatenursprung links UNTEN und macht ein PushMatrix, erledigt seine Zeichnerei und gibt mit PopMatrix wieder an die GUI zurück.
Wo sich der Koordinatenursprung befindet ist eine simple Einstellung, nämlich die Reihenfolge des dritten und vierten Parameters des glOrtho-Befehls, schaut genau hin:
Code:
Procedure gsOrthoModeON;
Var
Viewport:Array[0..3]Of TInt32;
Begin
glMatrixMode(GL_PROJECTION);
glPushMatrix;
glLoadIdentity;
glGetIntegerv(GL_VIEWPORT,@Viewport);
// Origin = lower left of the Viewport (= DEFAULT)
//glOrtho(0,ViewPort[2],0,ViewPort[3],+1,-1);
// Origin = upper left of the Viewport (= UPSIDE DOWN)
glOrtho(0,ViewPort[2],ViewPort[3],0,+1,-1);
glMatrixMode(GL_MODELVIEW);
glPushMatrix;
glLoadIdentity;
End;
EDIT: Den Koordinatenursprung links oben zu definieren bringt was, denn die Mauskoordinaten, die das Betriebssystem liefert, haben auch den Ursprung links oben. Mittlerweise ziehe ich aber ernsthaft in Erwägung, wieder die OpenGL-Default-Einstellung (Ursprung=links UNTEN) einzuführen, denn ich muss meine 2D-Shapes alle im Uhrzeigersinn definieren, sonst sind sie wieder verkehrt. Irgendwie geht mir das gegen den Strich, weil ich es gewöhnt bin, dass alle Primitiven gegen den Uhrzeigersinn definiert werden müssen.
Mit den Mauskoordinaten das is doch egal. Einfach die Transformationsmatrix anpassen und gut. Also ich arbeite immer mit urpsrung unten links, wenn ich OGL benutze.
Sicher das du da nicht spiegelst mit deinem Ortho? Müsst ich mir mal die Trafo anschauen. Mach ich später^^
MfG Pellaeon
_________________ __________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup
Hmmm.... Das man dann die Vertexes in Umgekehrter Reihenfolge übergeben soll, ist mir ernsthaft noch gar nicht aufgefallen.
Wird daran liegen das es völlig egal ist
Du musst OpenGL nur sagen ob die Vertices im Uhrzeigersinn angeordnet sind oder eben gegen den Uhrzeigersinn. Wobei glFrontFace(GL_CCW) allerdings die Default-Einstellung ist. Übrigens sollte man bei einer GUI das Backface-Culling abschalten, zumindest wenn sowieso alle Faces sichtbar sind.
P.S. Wenn man irgendwas spiegelt, spiegelt man ggf. auch die Reihenfolge der Vertices.
Mitglieder in diesem Forum: Google [Bot] und 6 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.