(8) OpenGL-Pipeline Vorlesung Computergrafik T. Grosch
y v v p ' = M ORTHO M PERSP M R L V 4T 4 K 2 S4 T4 3 R 444 24444 3 M PROJECTION M MODELVIEW v p u v y v x v x v z v z v C -f (r,t) A Modell/Weltkoordinaten y v z v -n z v x v (,,) Kamerakoordinaten y v x v (l,b) View Frustum (-,-,-) Kanonisches Volumen T. Grosch - 2 -
Viewport
Viewport-Transformation y v z v y v z v (,,) (,,) x v x v (-, -,-) (-,-,-) -) Transformation des kanonischen Volumens Transformation der xy-koordinaten aus (-,) )in die Bildschirm- (genauer Window -) koordinaten, z.b. (,599)x(,599) Transformation der z-koordinaten aus (-,) in den Bereich (,) für z-buffer T. Grosch - 4 -
Viewport Transformation (xy-werte) - y v z v höhe y v z.b. Fenster der Größe 6x6 Pixel - x v breite x v - T. Grosch - 5 -
y = h-.5 Bildschirmkoordinatensystem y v (;h-) (b-;h-) Ein Bildschirmfenster der Höhe h und der Breite b hat Pixelkoordinaten in x- Richtung von bis b-; in y- Richtung von bis h- Die Pixelkoordinaten sind die Mittelpunkte der quadratischen Pixel mit Kantenlänge y = -.5 x = -.5 (;) (b-;) x = b-.5 x v T. Grosch - 6 -
Bildschirmkoord.system system OpenGL y = h y v Offset des Pixelmittelpunktes Offset des Pixelmittelpunktes um.5 (.5;h-.5) (b-.5;h-.5) (.5;.5) (b-.5;.5) x = b x v T. Grosch - 7 -
Viewport in OpenGL y v y v h/2 y v y h - v -b/2 b/2 v x x - -h/2 b x v p ' p' x y = b 2 px + b 2 px = p x = = h 2 py + h 2 p' x b T. Grosch - 8 -
Viewport Es ist wichtig, wie die Pixel nachher bei der Rasterisierung angesprochen werden Bei OpenGL: Das gesamte Clip-Volumen wird auf den darstellbaren Fensterbereich abgebildet Verwendet man Anti-Aliasing durch Subpixelstrukturen, so kommen keine zusätzlichen Regionen dazu, die bereits weg-geclippt g sind. OpenGL p' = b 2 p + b p' x y = h 2 p x y + h 2 2 T. Grosch - 9 -
Viewport: Allgemein Angaben in Fensterkoordinaten h OpenGL-Kommando glviewport( GLint x, y, b, h); (x, y) b Viewport : p' x = b 2 px + b 2 + x p ' y = h 2 py + h 2 + y p' z = pz + 2 ( p + ) (,) p z v 2 z v z v - T. Grosch - -
Viewport als Matrix Viewport als Matrix M Viewport + 2 2 x b b Viewport + 2 2 2 2 y h h 2 2 2 2 lvi (GLd bl b h) 2 2 glviewport(gldouble x, y, b, h); T. Grosch - -
Beispiel Viewport.c Viewport.exe T. Grosch - 2 -
Typisches Programm void display() { glclear(gl_color_buffer_bit GL_DEPTH _BUFFER_BIT);... glutswapbuffers(); } void reshape( int w, int h) { glviewport(,, w, h); glmatrixmode(gl_projection); glloadidentity(); gluperspective(45, (float)w/h,., 2.); } glmatrixmode(gl_modelview); glloadidentity(); void init() { glclearcolor(.,.,.,.); glenable( GL_DEPTH_TEST); } void main( int argc, char **argv) { glutinit(&argc, argv); glutinitdisplaymode( GLUT_DOUBLE GLUT_RGBA GLUT_DEPTH); glutinitwindowsize(6,6); glutcreatewindow(..."); glutidlefunc(idle); glutspecialfunc(special); glutmousefunc(mouse); glutmotionfunc(motion); glutreshapefunc(reshape); glutkeyboardfunc(keyboard); glutdisplayfunc(display); p y init(); glutmainloop(); } T. Grosch - 3 -
OpenGL Rendering Pipeline v p' = V 4T 4 K 2 S4 T4 3 R v p' ' M MODELVIEW v p = Kamera im Ursprung, Blickrichtung entlang der negativen z-achse (Rechtssystem) 2 M ORTHO M PERSP M R L 444 24444 3 M PROJECTION v p' Division durch homogene Koordinate Viewport-Transformation Linkssystem: z-achse (noch) linear skaliert, kanonisches Volumen vor perspekt. Division 3 v p' '' = M Viewport v p' ' Linkssystem: z-achse nicht-linear skaliert, kanonisches Volumen nach perspektivischer Division: [-,]³ 4 Bildschirm- bzw. Fensterkoordinaten [,b-] x [,h-] x [,] T. Grosch - 4 -
Clipping
Clipping Wo? (l,t) -n -f y v z v (r,b) (-w,-w,-w) (w,w,w) x v y v z v (,,) 2 x v (-,-,-) 3 T. Grosch - 6 -
Problem mit Option -f (l,t) -n (r,b) Ebenengleichungen der Clippingebenen nicht so einfach zu bestimmen, bzw. Tests komplexer T. Grosch - 7 -
Option 3? Option 3? y v z v Bestimmung der Ebenengleichungen der Clipebenen: z (,,) = n AX v o de C pebe e x v (-,-,-) = = y y x o z = = y x Ergebnis: = + = x z Sieht einfach aus, aber = + = + z y T. Grosch - 8 -
Problem mit Option 3 p' z Unstetigkeit in der z-transformation: p' = n + f nf z p z f n n+f z-werte kleiner werden auf z - Werte größer n+f geflippt, was Clipping schwierig macht. n f p z y v z v Beispiel: Der Punkt A liegt vor der near-plane Eigentlich sollte die Linie A B gezeichnet werden Stattdessen wird die Linie A B gezeichnet A (-,-,-) A B A (,,), x v T. Grosch - 9 -
Festlegung OpenGL: Option 2 Clipebenen ) x w = y v z v 2) 3) y w = z w = 2 (w,w,w) 4) 5) 6) x + w = y + w = z + w = (-w,-w,-w) 6 x v (4D Raum hier etwas vereinfacht dargestellt, da w nicht konstant ) T. Grosch - 2 -
Festlegung OpenGL: Option 2 Clipebenen ) x w = y v z v 2) 3) y w = z w = 2 (w,w,w) 4) 5) 6) x + w = y + w = z + w = (-w,-w,-w) 6 x v (4D Raum hier etwas vereinfacht dargestellt, da w nicht konstant ) T. Grosch - 2 -
Clipping Verfahren in 3D Clipping Linie kanonisches Volumen (Quader) Cohen-Sutherland (6 Bit) Schnittpunkt Gerade Ebene, sonst praktisch gleich Clipping Polygon kanonisches Volumen (Quader) Sutherland-Hodgman Schnittpunkt Gerade Ebene, sonst ähnlich T. Grosch - 22 -
OpenGL Rendering Pipeline Kamera im Ursprung, Blickrichtung entlang der negativen z-achse (Rechtssystem) Linkssystem: z-achse (noch) linear skaliert, kanonisches Volumen vor perspekt. Division Clippingi Linkssystem: z-achse nicht-linear skaliert, kanonisches Volumen nach perspektivischer Division: [-,]³ v v p' = V 4T 4 K 2 S4 T4 3 R p v p' ' M MODELVIEW v M ORTHO M PERSP M R L p' 444 24444 3 = M PROJECTION Division durch homogene Koordinate Viewport-Transformation v p' '' = M Viewport v p' ' Bildschirm- bzw. Fensterkoordinaten [,b-] x [,h-] x [,] T. Grosch - 23 -
Materialien und Beleuchtung
Bisher: Eckpunktfarben Änderungen pro Eckpunkt möglich glbegin(gl_polygon); glcolor3f(,,); glvertex3f(,,); glcolor3f(,,); glvertex3f(,,); glcolor3f(,,); glvertex3f(.5,,); glend(); T. Grosch - 25 -
Beleuchtung Ohne Beleuchtung wirken die Objekte sehr flach, Formen sind schwer zu erkennen OpenGL verwendet klassisches Beleuchtungsmodell: allgemeines Umgebungslicht Lichtquellen und Materialien mit Umgebungslicht (ambient) diffuser Reflexion (diffuse) spiegelnder Reflexion (specular) Eigenausstrahlung von Materialien (emission) T. Grosch - 26 -
Diffuse Oberfläche (Lambert ) In der Computergraphik werden Oberflächenmaterialien oft als ideal diffus betrachtet. Egal von welcher Richtung man auf die Fläche sieht: sie wirkt immer gleich hell. Beispiel: Blatt Papier M d T. Grosch - 27 -
Diffuse Oberfläche (Lambert ) Entscheidend ist aber der Einfallswinkel des Lichts ϕ M Senkrechter Lichteinfall: Sehr hell d M ϕ d M ϕ Waagrechter Lichteinfall: Sehr dunkel d T. Grosch - 28 -
Lambert-Gesetz Die sichtbare Fläche nimmt mit dem cos des Einfallswinkels ab: n v ϕ A cosϕ M r L M g L M b L r g b cosϕ Materialfarbe Lichtfarbe cosϕ A ϕ: Winkel zwischen Oberflächennormalen und Lichteinfall ϕ ϕ ϕ M d M d M d T. Grosch - 29 -
Bemerkung Bei den Farben handelt es sich um rgb-vektoren M r Lr M g Lg cosϕ M b Lb Die Multiplikation ist eine komponentenweise Multiplikation (Licht hat seine eigene Mathematik ) Beispiel: Material rot, Licht ist weiß (Resultat: rotes Licht) Material rot, Licht 2 ist grün (Resultat: schwarz) T. Grosch - 3 -
Spiegelnder Term (Phong ) Glanz/Spiegelung tritt entlang des reflektierten Lichtvektors auf Blickt man in die Spiegelung des Lichtvektors, ist der Glanz sehr hell. M r L r n M g Lg cos ψ M b L b ψ n: Glanzzahl ψ: Winkel zw. reflektiertem Lichtstrahl und Blickrichtung T. Grosch - 3 -
Glanzzahl ψ cos n ψ n = n = n = 5 n = N = 5 N = 5 T. Grosch - 32 -
Phong-Beleuchtungsmodell Materialien bestehen aus Diffuser Komponente Spiegelnder Komponente Problem Abgewandte Flächen sind schwarz Lösung: Ambienter Term Wird immer aufaddiert d a Lq i= ( n M ) d cosϕi + Ms ψi Li # L = M L + cos T. Grosch - 33 -
Phong-Beleuchtungsmodell + # Lq L = Md La + + i= ( n M ) d cosϕi + Ms cos ψ i Li M d : diffuse Materialfarbe M s : spiegelnde Materialfarbe L a : ambiente Lichtfarbe L i : Farbe der Lichtquelle i n: Glanzahl Alle Terme (M, L) sind rgb- Farben Für den zu beleuchtenden Oberflächenpunkt muss die Normale bekannt sein Freiheit: die Materialfarbe kann von der spiegelnden Materialfarbe verschieden sein Problem: Die Summe aller Farben kann größer werden. T. Grosch - 34 -
L OpenGL-Beleuchtung = M e + M a L a + # Lq i= Klassisches Beleuchtungsmodell Viele Freiheiten Die einzelnen Anteile werden dann aufsummiert um die Farbe des Punktes zu erhalten Werte größer werden auf geclippt Global Ambiente Lichtfarbe ( n M + + ) a La, i Md cosϕi Ld, i Ms cos ψi Ls, i Materialien Emissionsfarbe Ambiente Reflexion(sfarbe) Diffuse Reflexion(sfarbe) Spiegelnde Reflexion(sfarbe) Glanzzahl Für jede Lichtquelle Position Ambiente Lichtfarbe Diffuse Lichtfarbe Spiegelnde Lichtfarbe T. Grosch - 35 -
Materialemission Emission dient zur Simulation selbstleuchtender Materialien, die allerdings keine anderen Objekte beleuchten. Die Emissionsfarbe wird einfach als Basishelligkeit genommen. Parameter: Emissionsfarbe Me L = M e + M a L a + # Lq n ( M a La, i + M d cosϕi Ld, i + M s cos ψ i Ls, i ) i= T. Grosch - 36 -
Ambiente Beleuchtung Simuliert gestreutes Umgebungslicht völlig unabhängig von der Geometrie Parameter: Ambiente Reflexion(sfarbe) Ma, ambiente Lichtfarbe La Gibt es als globalen Wert und pro Lichtquelle L = M e + M a L a + # Lq n ( M a La, i + M d cosϕi Ld, i + M s cos ψ i Ls, i ) i= T. Grosch - 37 -
Diffuse Beleuchtung Entspricht der Abstrahlung matter Oberflächen abhängig von Oberflächennormale und Lichteinfall Parameter: Diffuse Reflexion(sfarbe) Md, Lichtfarbe Ld L = M e + M a L a + # Lq n ( M a La, i + M d cosϕi Ld, i + M s cos ψ i Ls, i ) i= ϕ M d T. Grosch - 38 -
Spiegelnde Beleuchtung simuliert Spiegelungseffekte abhängig von Blickrichtung und reflekt. Lichtrichtung Parameter: Spiegelnde Reflexion(sfarbe) M s & Lichtfarbe Ls, Glanzzahl n L = M e + M a L a + # Lq n ( M a La, i + M d cos ϕi Ld, i + M s cos ψ i Ls, i ) i= ψ N = 5 N = 5 T. Grosch - 39 -
Materialien Alle Materialeigenschaften werden über eine Funktion gesetzt: glmaterial{if}[v](side, name, value); side: GL_FRONT, GL_BACK oder GL_FRONT_AND_BACK name: GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR, GL_EMISSION, GL_AMBIENT_AND_DIFFUSE erwarten eine RGBA-Farbe Die Glanzzahl kann über GL_SHININESS gesetzt werden lightmaterial.exe Nate Robin T. Grosch - 4 -
Lichtquellen von einigen Features gibt es mehr als eine Instanz, z.b. Lichtquellen, Clip-Planes etc. diese werden meist über eine Funktion, die als ersten Parameter eine Kennzeichnung der Instanz hat, manipuliert, z.b. gllightf( GL_LIGHT,, ); setzt einen Wert für die. Lichtquelle die Konstanten sind fortlaufend nummeriert GL_<CONST>i = GL_<CONST> + i T. Grosch - 4 -
Lichtquellenparameter Alle Parameter werden gesetzt durch gllight{if}[v](gl_lighti, GLenum name, value); die maximale Lichtquellen-Anzahl kann durch glget(gl_max_lights) abgefragt werden (typischerweise 8 Lichtquellen) jede Lichtquelle hat 3 Farbwerte (jeweils RGBA): ambiente Stärke (GL_AMBIENT) diffuse Stärke (GL_DIFFUSE) spekulare Stärke (GL_SPECULAR) T. Grosch - 42 -
Lichtquellenparameter Jede Lichtquelle hat eine GL_POSITION Homogene Koordinate entscheidet, ob Punktlichtquelle oder gerichtete Lichtquelle 4 elementiger Vektor v v[3]== => gerichtete Lichtquelle v[3]== => Punkt- oder Spotlichtquelle
Beispiel GLfloat ambient[] = {.,.,.,. }; Shading Modell (lineare GLfloat diffuse[] = {.,.,.,. }; Interpolation) einschalten GLfloat specular[] = {.,.,.,. }; Lichtquelle Nr. Werte GLfloat position[] = {., -.5,.5, 5. }; definieren glshademodel(gl_smooth); gllightfv(gl_light, GL_AMBIENT, ambient); gllightfv(gl_light, GL_DIFFUSE, diffuse); gllightfv(gl_light, LIGHT GL_SPECULAR, specular); gllightfv(gl_light, GL_POSITION, position); glenable(gl_lighting); glenable(gl_light); Beleuchtung einschalten Lichtquelle Nr. einschalten T. Grosch - 44 -
Beispiel (cont.) GLfloat mat_ emission[] = {.,.,.,.}; GLfloat mat_ambient[] = {.25,.2,.7,. }; GLfloat mat_diffuse[] = {.75,.6,.23,. }; GLfloat mat_specular[] = {.63,.56,.37,. }; GLfloat shininess[] = { 5. }; glmaterialfv(gl_front, GL_EMISSION, mat_emission); glmaterialfv(gl_front, GL_AMBIENT, mat_ambient); glmaterialfv(gl_front, GL_DIFFUSE, mat_diffuse); glmaterialfv(gl_front, lf GL_SPECULAR, mat_specular); glmaterialfv(gl_front, GL_SHININESS, shininess); DrawSphere( ); T. Grosch - 45 -
Eckpunkt-Normalen Von der Applikation muss die Beispiele Normale definiert werden /* Normale pro Eckpunkt */ Aufruf: glbegin g (GL _...) glnormal3{s,i,f}[v](); l3{ glnormal3f( ); kann für jeden Eckpunkt oder glvertex3f( ); konstant für die Fläche gesetzt werden glend(); Normalen werden auch transformiert /* konstante Flächennormale */ OpenGL generiert keine glnormal3f( ); Normalen (!) glbegin (GL_...) Eckpunkt-Normale = State glvertex3f( ); glend(); T. Grosch - 46 -
Flat-Shading n v Mit Hilfe der Oberflächen- Normalen wird durch das Beleuchtungsmodell die Farbe der Fläche berechnet. Diese ist quasi konstant über die gesamte Fläche P P 3 P 2 glshademodel(gl_flat); T. Grosch - 47 -
Gouraud-Shading 3 n v Mit Hilfe der Normalen an den Eckpunkten werden durch das Beleuchtungs- modell die Farben an den Eckpunkten berechnet. Bei der Scan-Konvertierung werden dann die Farben der Eckpunkte bi-linear interpoliert. n v F F 3 F n v 2 F 2 glshademodel(gl_smooth); T. Grosch - 48 -
Phong-Shading 3 Bei der Scan-Konvertierung werden die Normalen der Eckpunkte bi-linear interpoliert. Für jedes Pixel wird das Beleuchtungsmodell ausgewertet und die Farbe des Pixels bestimmt. n v n v F n v n v 2 (In OpenGL standardmässig nicht möglich ) T. Grosch - 49 -
OpenGL Es gibt nur Gouraud- Shading Effekt wie bei Phong- Shading nur durch sehr feine Unterteilung der Oberflächen T. Grosch - 5 -
Wichtige Anmerkungen Es werden nur die Eckpunkte Lichtquellen haben keine beleuchtet Geometrie, sind also nicht Sind besonders starke, sichtbar lokale Effekte (z.b. Lichtquellen werden nur Highlights) wichtig, müssen berücksichtigt, solange sie die Flächen von der eingeschaltet sind Applikation unterteilt werden Somit kann man für glcolor hat sobald GL- verschiedene Objekte LIGHTING eingeschaltet ist verschiedene Lichtquellen (per default) keinen Einfluss aktivieren mehr auf die Objektfarbe Diese wird durch die Materialeigenschaften bestimmt (*Alternative: glcolormaterial ) T. Grosch - 5 -
Position der Lichtquelle Die Position (und Richtung) Unterschied zwischen: der Lichtquelle wird genauso gllightfv (GL_LIGHT, GL_POSITION,pos); behandelt wie ein glrotatef( ); Geometrieprimitiv DrawObject( ); Transformation mit Licht bleibt fest GL_MODELVIEW glrotatef( ); gllightfv g (GL_ LIGHT, GL_ POSITION,pos); DrawObject( ); Licht dreht sich mit dem Objekt T. Grosch - 52 -
Weitere Lichteinstellungen Über gllightmodel{if}[v]( GLenum name, value ) können verschiedene Einstellungen gemacht werden Ambientes Beleuchtungsmodell Schnelle / exakte Beleuchtung glänzender Flächen Beleuchtung der Rückseiten (Normal-Flip) glcolormaterial( GLenum side, GLenum name ); glcolor() in Materialeigenschaft umwandeln (schneller Materialwechsel) T. Grosch - 53 -
Berechnung der Normalen Wie berechnet man die Normalen für die Punkte? Einfache Mittelung der Normalen der angrenzenden Flächen? Besser: winkelgewichtete Normale der angrenzenden Flächen. Oder: flächengewichtete ht t Normale der angrenzenden Flächen. Problem: man braucht Nachbarschaftsinformationen. Welche Fläche grenzt an Punkt C? Dreiecke müssen im konsistenten Uhrzeigersinn definiert werden A n v B E v n = CB CA v n 2 = CA CE v n = CE CD 3 n v n v 3 C 2 v v v n = + v ( n + n + ) 2 n3 Flächengewichtet, da n i nicht normiert (n anschließend normieren). T. Grosch - 54 - D
Fazit: Beleuchtung Nur angenähert durch Materialparameter bestimmen: ambient, diffus, specular glmaterial(); nur an Eckpunkten Wichtigste: GL_DIFFUSE, GL_AMBIENT Lichtquellen einschalten: Der Weg zur Beleuchtung: glenable(gl_lighti); Lichtparameter bestimmen: gllight(); Strom einschalten: Wichtigste: GL_DIFFUSE, glenable(gl_lighting); GL_POSITION Geometrie darstellen Normalen mit glnormal(); Evtl. Lichtmodell definieren: angeben gllightmodel(); (möglichst wenig Lichtquellen Wichtigste: verwenden, da jede extra Zeit GL_LIGHT_MODEL_AMBIENT kostet) T. Grosch - 55 -
Lichtquellen
Lichtquellen Bis jetzt wurde nur von der Lichtrichtung gesprochen, nicht wo sie herkommt OpenGL bietet 3 verschiedene Arten Lichtquellen: gerichtete Punkt Spot T. Grosch - 57 -
Gerichtete Lichtquellen entsprechen einer unendlich weit entfernten Lichtquelle parallel einfallende Strahlen Parameter: Richtung, Farbe Definition: homogene Koordinate der Position : GLfloat position[] = {., -.5,.5,. }; gllightfv(gl_light, GL_POSITION, position); T. Grosch - 58 -
Punktlichtquelle ein lokalisierter Punkt strahlt das Licht aus unterschiedliche Winkel auf eine ebene Fläche Parameter: Position, Farbe Definition: homogene Koordinate der Position!= GLfloat position[] = {., -.5, 5 5.5, };. gllightfv(gl_light, GL_POSITION, position); T. Grosch - 59 -
Spotlichtquelle Nur um einen bestimmten Winkel um eine angegebene Richtung wird Licht ausgestrahlt je weiter von der Richtung weg desto schwächer wird das Licht (cos n -Verteilung) Parameter: Position, Richtung, Exponent, Farbe T. Grosch - 6 -
Spotlichtquellen haben zusätzlich zu Punktlichtquellen eine Richtung (GL_SPOT_DIRECTION) einen Öffnungswinkel (GL_ SPOT_ CUTOFF) ) einen Exponenten (GL_SPOT_EXPONENT) T. Grosch - 6 -
Abschwächung Punkt- oder Spotlichtquellen können ihre Stärke abhängig von der Entfernung d zur Oberfläche abschwächen L = d: Abstand zwischen Lichtquelle und dem Eckpunkt k c : GL_CONSTANT_ATTENUATION k l : GL_LINEAR_ATTENUATION a = k q : GL_QUADRATIC_ATTENUATION M e + M a L a + #Lqq i= a Abschwächungsfaktor a = bei gerichteten Lichtquellen k c + k l d + k q d ( n M L + M cosϕ L + M ψ L ) a a, i d i d, i s cos i 2 s, i T. Grosch - 62 -
(Default)-Werte der Lichtquellenattr. T. Grosch - 63 -
Wo wird beleuchtet? Nach der Modelview-Transformation sind Normalen und Eckpunkte im Kamerakoordinatensystem. Diese Werte werden für die Beleuchtung verwendet. 2 3 4 T. Grosch - 64 -
Zusammenfassung Viewport OpenGL Pipeline Clipping Beleuchtung Nächste Woche Texturen T. Grosch - 65 -