Hallo, ich würde gerne Photos etwas Perspektive verleien. Macromedia hat da ein tolles Werkzeug, das mich inspiriert hat. Es arbeitet unglaublich simpel und erzeugt tolle Ergebnisse. Wenn man zum Beispiel eine Gasse als Vorlage hat, gibt man einfach kurz an, wie der 'Raum' dimensioniert ist (Boden, links eine Fassade, rechts eine Mauer, oben offen, in 150m Horizont) und kann sich dann in begrenztem Rahmen innerhalb des Raums bewegen. Dabei wird die Perspektive des Ausgangsphotos zurückgerechnet und eine neue draufgerechnet. Das erledigt die CPU.
Ich würde gerne die maximale Auflösung des Photos erhalten, indem ich es als eine große Textur lade. Nun stehe ich vor dem Problem, dass die Textur bereits Perspektive enthält. Alle Texturen die ich kenn sind aber zu recht 'platt'. OpenGL errechnet ja selbst anhand der Tiefe eines Punktes die perspektivische Verzerrung.
Deshalb meine Frage, wie das am Besten anfange. Bisherige Überlegungen:
1. Vielleicht kann man die Texturkoordinaten derart modifizieren, dass die persp. Verz. 'aufgehoben' wird.
2. Ein Shader könnte das Texellookup verändern, wenn 1. nicht möglich ist
3. Ich könnte versuchen, die Geometrie selbst zu berechnen, so dass das Ausgangsbild überall gleich weit vom Betrachter entfernt ist und sich die Tiefe erst bei Bewegung verändert.
Bin auf alles gefasst
Ich habe das Problem gelößt durch eine perpektivische Projektion, wie bei einem Diaprojektor. Ich wusste nur nicht, dass OpenGL das von Hause aus so gut unterstützt.
1. Modelview auf die Position der Kamera einstellen.
2. glTexGen verwenden mit GL_EYE_PLANE als 2. Parameter.
Für S, T und Q (1. Parameter) habe ich folgende Koeffizienten angegeben:
für S: ( 0.5, 0.0, 0.5, 0.0)
für T: ( 0.0, 0.5, 0.5, 0.0)
für Q: ( 0.0, 0.0, 1.0, 0.0)
3. Dann glEnable(GL_TEXTURE_GEN_S/T/Q) aufrufen.
Von nun an kann die Model View Matrix beliebig verändert werden, ohne dass die Projektion 'mitwandert'. Denn diese wird nur beim ersten Aktivieren über glEnable(...) eingelesen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Auch nett... Ich hätte jetzt einen Ansatz von wegen Texturkoordinaten auf -1.0..1.0 mappen (mit glTranslatef und glScalef in der Texturmatrix) und dann noch ne Perspektive in der Texturmatrix erzeugen. Danach hätte ich die Geometrie einfach mit "echten" koordinaten gezeichnet. Man müsste halt dann nur aufpassen, dass das fov mit dem der Aufnahme übereinstimmt sowie dass die Einheiten entsprechend passen.
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
Eine Texturmatrix gibt es also auch. Hat jemand positive oder nagative Erfahrungen mit glGenTex gemacht? Ich könnte mir ja vorstellen, dass manche Treiberhersteller diese Funktion als lästiges Beiwerk verstehen, in das gerade so viel Arbeit investiert wird, das es geht. Dagegen steht der Vorteil nur noch die Koordinaten der Punkte angeben zu müssen. Dadurch weniger Arbeitsaufwand und geringerer Speicherbedarf / weniger GL-Instruktionen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich weiss jetzt nicht, was mehr leistung zieht und mit glGenTex habe ich nun überhaupt keine Erfahrung gemacht. Aber zu der sache mit der Texturmatrix kann ich sagen, dass das eigentlich bis jetzt immer super läuft (siehe mein Tutorial_Wassereffekt). Der Vorteil ist eben, dass man die genaue Kontrolle hat und eventuell auch noch einzelne Kameraoptionen, die auf die Textur nicht angewandt werden dürfen, rausfiltern kann, was man afaik bei glGenTex nicht hat.
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
Naja, es läuft eh momentan mit 2000 FPS (Radeon X850 XT), also kann die Performance in Nachhinein betrachtet egal sein Was genau meinst du mit der dehnbahren Aussage "einzelne Kameraoptionen, die auf die Textur nicht angewandt werden dürfen, rausfiltern" ?
Mitlerweile verwende ich 4 OpenGL Matrizen um die Pixel zu färben. Unglaublich oder? Früher hat mal eine gereicht. Und wenn ich nun auch noch in die Szene klicken möchte - genauer auf ein Texel - müssen alle 4 invertiert und durchlaufen werden.
- Projektion für die Perspektive
- Model View für die Position und Blickrichtung
- Texturmatrix, um die Textur zu zentrieren (-0.5, -0.5), was die Berechnung der nächsten Matrix vereinfacht:
- Texturkoordinatenmatrix für glTexGen. Ermöglicht es den Diaprojektor beliebig um den Nullpunkt zu drehen.
Wenn ich das richtig sehe werden in der Renderpipeline ohnehin die ersten drei Matrizen durchlaufen. Also habe ich sie einfach mal genutzt. Dein Tutorial über Spezialeffekte mit Texturmatrizen gucke ich mir mal an, vielleicht erfahre ich dort, wie sie in Black&White das Wasser gerendert haben...
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Nun, es geht da weniger um Matrizen, aber es benutzt welche.
Dein Ansatz klingt interessant... Wie wärs mal mit ner Demo, ich würd das gern mal in aktion sehen.
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
Ja eine Demo kann ich dir die Tage mal schicken. Ich habe aber gerade ein irritierende Feststellung gemacht. Nachdem der Open-Source Treiber meiner betagten S3 Notebook Grafikkarte keine Projektion mit glTexGen hinbekam, versuchte ich es mit der Texturmatrix. Das sah genauso aus. Gut, vermutlich fehlt der Hardware einfach die Fähigkeit Texturen zu projezieren, dachte ich mir.
Nun habe ich auch auf der ATi mal mit der Texturmatrix experimentiert, weil ich das Photo verschieben wollte und das mit glTexGen nicht hinbekam. Also schrieb ich erst den glTexGen Code und lud danach eine Texturmatrix mit dem Effekt, dass die Transformationen die ich TexGen mitgab überschrieben wurden!
Es sieht ganz so aus, als ob dein Ansatz und mein Ansatz beide die Texturmatrix beschreiben, also äquivalent sind. Das würden auch die identischen Ergebnisse beim Test auf der S3 Karte bestätigen. Die Anzahl der zu durchlaufenden Matrizen schrumpft dann auch von 4 auf 3, was aus Performance-Sicht für OpenGL sinnvoll erscheint.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Wundert mich eigentlich überhaupt nicht, ich hatte bisher auch nicht von einer vierten OpenGL-Matrix gehört (klingt ja fast wie eine Urban Legend: "Die vierte OpenGL Matrix" ). Ich freu mich auf die Demo . Vielleicht kannste ja nen IOTW (Image of the Week) draus machen.
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
Mitglieder in diesem Forum: 0 Mitglieder und 2 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.