arbeite mich grad durch die superbible 4th edition durch und habe einige verständnisfragen zum thema clipping, viewport und der window client area.
clippingarea:
------------------------------
soweit ich verstanden habe, ist das der logische ausschnitt im kartesischen koordinaten system, z.b. (640,480). hier "beginnt" die fläche im ursprung (0,0). dieser bereich kann natürlich auch beliebig verschoben werden. z.b. zentriert, indem man nach (-320,-240) verschiebt, usw.
viewport:
------------------------------
das ist der sichtbereich, auf den im fenster (vom logischen ausschnitt, (640,480)) skaliert wird. bei einem fenster von 800x600 und einem viewport von 640x480 wären demnach oben und rechts ränder zu sehen, da der viewport kleiner ist, als die dimension des fensters. bei einem viewport von 1600x1200 würde man nur den III. quadranten der fläche zu sehen bekommen.
habe ich noch was übersehen? über weitere erklärungen wäre ich dankbar.
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
Beim Viewport sollten unten und rechts die Ränder zu sehen sein, da oben links der Ursprung sein sollte.
Im Prinzip stimmt es.
Die ClippingArea sagt dann wie der Viewport intern skaliert werden soll, also wo der Ursprung sein soll und ob eine Vergrösserung/Verkleinerung stattfindet.
Beim Viewport sollten unten und rechts die Ränder zu sehen sein, da oben links der Ursprung sein sollte. Im Prinzip stimmt es.
rechts ist klar aber wieso unten? der ursprung im kartesischen ko-system ist doch unten links ... bei dir ist dieser oben links und man arbeitet deswegen im negativen y-bereich. das verwirrt mich grad.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Öhm... denke nicht das das beim Viewport stimmt.
Nehmen wir mal an, du renderst auf ein panel. Das Panel hat eine gewissen Größe (640x480).
Jetzt sagst du, dass dein Viewport die Dimension 10000x5000 haben soll.
Das ist kein problem. Denn dann wird der Inhalt der Szene der als "sichtbar" gilt, in die 640x480 hineingepresst.
Wenn du z.B. das mit glOrtho machen würdest, dann würden sich 10000/640= 15,625 OpenGL-Einheiten, 1Pixel teilen (jedenfalls in der Breite).
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Denn dann wird der Inhalt der Szene der als "sichtbar" gilt, in die 640x480 hineingepresst. Wenn du z.B. das mit glOrtho machen würdest, dann würden sich 10000/640= 15,625 OpenGL-Einheiten, 1Pixel teilen (jedenfalls in der Breite).
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hmm... ich hab mir gerade nochmal glViewport und gluPerspective durchgelesen. Eventuell war ich gerade falsch unterwegs.
Das doofe ist, dass ich mich mit OpenGL und vor allem OpenGL-Theorie lange nicht mehr auseinander gesetzt habe. Ich hab ein Template das geht, und das reicht für mich.
glViewport dient dem letzten Schritt der Projektion. Bis dahin hat OpenGL ermittel wie die normalisierten Gerätekoordinaten sind (Stimmt das?). glViewport wird dann benutzt um diese Koordinaten in Koordinaten auf deinem z.B. Panel umzurechnen. Dazu benötigt OpenGL die Angaben von glViewport.
Wenn du bei glViewport die Position und höhe und breite änderst, kannst du die Ausabe im letzten Schritt quasi nochmal ändern.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Hallo sNIk,
damit deine gerenderten Primitive letztlich sichtbar werden musst Du nach den Transformationen mit deiner Modelview- und Projektionsmatrix noch eine Viewporttransformation durchführen.
Durch die Viewporttransformation werden also letztlich die gerenderten Primitive in deine Fensterkoordinaten umgerechnet.
Einfach gesagt legst du mit glViewport die Größe deines Ausgabebildes fest.
Wenn du z.B. in eine 512x512 Pixel große Textur rendern möchtest, setzt du den Viewport auf 512x512. Dann renderst du dein Bild und speicherst das Ergebnis in der Textur ab.
Für das Rendern an sich macht es natürlich Sinn die Größe des Viewports an die Größe deines Fensters/Panels anzupassen. In gewisser Weise bestimmst du so also die Auflösung deines Ausgabebildes und damit die Anzahl der Pixel/Fragmente.
Die Clippingarea dient dazu Primitive die gar nicht auf deinem Bild liegen würden zu entfernen (zu clippen). Die Clippingarea bildet typischerweise die Begrenzung deines Sichtfrustums. Die bekanntesten Clippingplanes sind wohl die Near- und Far-clippingplane, die du typischerweise beim setzen deiner Projektionsmatrix angibst (z.B. bei gluPerspective). Die 4 anderen Clippingplanes (links, rechts, oben, unten) werden von gluPerspective durch den Öffnungswinkel bestimmt.
Wenn du statt gluPerspective auf glFrustum zurückgreifst kannst du die Clippingarea direkt angeben.
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Also könnte man mit einem Viewport der größer ist als das Fenster/Panel einen AA-Effekt erzielen?
Oder wird der Rest des Framebuffers am Fenster/Panel einfach abgeschnitten?
Mitglieder in diesem Forum: 0 Mitglieder und 8 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.