Allgemeine Fragen Was ist Computer Grafik? àGenerierung von

Werbung
Allgemeine Fragen
Was ist Computer Grafik?
Generierung von Bildern durch den Computer + Tools
Einsatz?
- Kunst und Unterhaltung: Film, Animation und
SFX, Games
- Prozess Überwachung
- CAD
- Wissenschafts-Visualisierungen
Unterschied von Computer Graphics und
Bildverarbeitung (Image Processing)
 Bilder sind bei CG der Output und bei BV der Input
Szenerie besteht aus
- Virtuelle Welt
o Sichtbare Objekte: Geometrie,
Appearence (Farben, Spiegelung),
Motion (Bewegung)
o Lichter
- Beobachter: Standort, Blickrichtung, Winkel
Pipeline
- Modal Space: Geometrie Erstellung im Ursprung
- World Space: Geometrie erhält Standort
- Eye Space: Punkte im
Kamerakoordinatensystem
- Clip Space: Perspektive -> Linien nicht mehr
Parallel
- Perspective Transformation after Clipping
- Window Space: Transformiere zu
Bilschirmkoordinaten
- Shading: Fülle (Farbe) die Dreiecke per
Interpolation
- Tiefen Buffer: Male Pixel wenn tiefe Sichtbar
Licht
- Richtiges Licht zu Komplex -> Licht Modelle
Farbe wird beeinflusst von:
- Eigenschaften des Lichts: Farbe
- Eigenschaften der Oberfläche/Material
- Orientierung von Licht, Objekt und Beobachter
OpenGL Lichtmodell
- Nur Punktlichter: keine Halbschatten
- Keine Gegenseitige Beeinflussung der Objekte
- Keine Schatten: Lichtquelle trifft alle Objekte
(Licht geht durch alles hindurch), Schatten geht
nur mit Shadow-Mapping
- Keine Spiegelungen
- RGB Color Modell (Rote Kugel braucht rotes
Licht)
Häufig verwendete Restriktionen / Einstellungen:
-
Ambient und Diffuses Licht sind gleich
Specularers Licht ist grau oder weiss
Intensität des Lichtes ist bei Diffuse und
Specular gleich
Das emissive Licht ist 0 (schwarz) oder alle
anderen Parameter sind 0
Gut zu wissen:
-
Diffuses Licht hängt von der Normale und der
Lichtquelle ab
Speculares Licht auch noch von der
Benutzerposition
Lichtquellen
- Punktlichter, nicht Sichtbar, sind Objekte
- Eigenschaften: Farbe, Position, Richtung,
Abschwächung
Reflexion Modell: Intraktion des Lichts mit dem Material
(Die Eigenschaft einer Oberfläche wird durch
Reflexionkoeffizienten festgelegt)
- Geometrie: Oberfläche Normale, Richtung Licht,
Richtung Beobachter
- Oberfläche
o Ambient reflection (Licht, dass das
Objekt zurück strahlt): Objekte
 Innen: grosser Anteil
 Aussen: geringer Anteil
o Diffuse reflection: geht In Material und
kommt mit diffuse Richtung raus,
erscheint immer gleich hell egal wo
o
o
Diffuses Licht
beobachter steht.
Specular reflection: Reflektiertes Licht
Emissive light: Material sendet Licht
selbst aus
Spekulares Licht
𝐼𝑛𝑡𝑒𝑛𝑠𝑖𝑡ä𝑡 𝐷𝑖𝑓𝑓𝑢𝑠
= 𝐼𝑛𝑡𝑒𝑛𝑠𝑖𝑡ä𝑡𝐿𝑖𝑐ℎ𝑡𝑞𝑢𝑒𝑙𝑙𝑒 ∗ 𝐷𝑢𝑓𝑓𝑢𝑠𝑒𝑟 𝐾𝑜𝑒𝑓𝑓𝑖𝑧𝑖𝑒𝑛𝑡
∗ max(𝑊𝑖𝑛𝑘𝑒𝑙 𝑧𝑤𝑖𝑠𝑐ℎ𝑒𝑛 𝑁𝑜𝑟𝑚𝑎𝑙𝑒𝑛 𝑢𝑛𝑑 𝐿𝑖𝑐ℎ𝑡𝑞𝑢𝑒𝑙𝑙𝑒, 0)
𝑠⃗ ∙ 𝑛⃗⃗
𝐼𝑑 = 𝐼𝐿 ∙ 𝑓𝑑 ∙ max(
, 0)
|𝑠| ∙ |𝑛|
𝑟⃗ 𝑣⃗
𝐼𝑠 = 𝐼𝐿 ∙ 𝑓𝑠 ∙( ∙ )𝑘𝑃ℎ𝑜𝑛𝑔
|𝑟| |𝑣|
k= Phong Koeffizient : je höher desto kleiner Glanzlicht
r = siehe Reflexion bei Raytracer
Ray Tracing
-Raytracing wird nicht für Echtzeitanwendungen
verwendet
- In Echtzeit wird Gouraud und Phong Shading
angewendet
- Für jeden Pixel im Buffer wird ein Strahl ausgeschickt
(Was sehe ich)
- der erste Treffer wird genommen und von der
Oberfläche die Lichtkomponenten zugerechnet
- Vorteil: Hidden Surface Problem gelöst, Schatten,
Reflexionen und Transparenz einfach umsetzbar
Transparenz
𝐼 = (1 − 𝑡) ∙ 𝐼𝑆 + 𝑡 ∙ 𝐼𝐵
𝐼 = Farbe Intensität
𝐼𝑆 = TransparentesObjekt
𝐼𝐵 = Dahinterliegendes Objekt
𝑡 = Transparenz Koeffizient (0..1)
Reflexion
Reflexion:
Mathematische Grundlagen
Quaternions: Gibt es weil man nicht Matrixen
Euelerwinkel interpolieren soll
Homogene Koordinaten
- Ermöglicht behandeln von Skalierung, Rotation
und Transformation durch Matrix Multiplikation
- Ermöglicht etwas ins Unendliche zu setzen
- Macht alle Transformationen Linear
Man nimmt eine Dimension dazu. Man kann über den
letzten Parameter einen Punkt mehrfach bestimmen.
Alle Vielfachen sind derselbe Punkt. Letzter Wert 0 =
unendlich,
- Umwandlung in Kartesische Koordinaten: teilt
durch letzten Wert
Affine Transformationen:
Transformationen
- Objekte werden im Ursprung modelliert
- Ermöglicht aus einfachen Objekten komplexere
zu modelieren
- Eine Szene von irgendwo aus betrachten
- Animationen
Eine Transformation verschiebt einen Punkt, eine
Transformation von einem Objekt verschiebt alle Punkte
des objetks.
Problem: Während Rotationen und Skalierungen als
Matrixmultiplikation durchgeführt werden können, ist
Transformation eine Addition von Vektoren. 
⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
𝑅𝑒𝑓𝑙𝑒𝑘𝑡𝑖𝑒𝑟𝑡𝑒𝑟𝑆𝑡𝑟𝑎ℎ𝑙 = 2 ∙ 𝑂𝑏𝑒𝑟𝑓𝑙ä𝑐ℎ𝑒𝑛𝑛𝑜𝑟𝑚𝑎𝑙𝑒 ∙
⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ ∙ 𝑂𝑏𝑒𝑟𝑓𝑙ä𝑐ℎ𝑒𝑛𝑜𝑟𝑚𝑎𝑙𝑒
⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗ )
(𝑉𝑒𝑘𝑡𝑜𝑟𝑍𝑢𝐵𝑒𝑡𝑟𝑎𝑐ℎ𝑡𝑒𝑟
⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗⃗
− 𝑉𝑒𝑘𝑡𝑜𝑟𝑍𝑢𝐵𝑒𝑡𝑟𝑎𝑐ℎ𝑡𝑒𝑟
⃗⃗ ∙ (𝑉
⃗⃗ ∙ 𝑁
⃗⃗) − 𝑉
⃗⃗
𝑅⃗⃗ = 2 ∙ 𝑁
R= Reflektierter Strahl (Vektor)
N= Oberflächennormale
V= Beobachtervektor (von Oberfläche Richtung Beobachter)
Brechung (Refraction)
T = Brechungsvektor
N = Normale
E = umgekehrter Einfallswinkel (Vektor zum Beobachter
N: Brechungszahlen)
Homogene Koordinaten
Translation: Translation
1 0
𝑀 = [0 1
0 0
0 0
0 𝑥
0 𝑦
]
1 𝑧
0 1
Shearing: Schiefstellen
1 𝑓
𝑀 = [0 1
0 0
0 0
0
0
1
0
0
0]
0
1
Perspektische Ansicht
Frustum: sichtbarer Bereich
- Öffnungswinkel
- Distanz Nearplane
- Distanz Farplane
(wenn ein Objekte vor der Nearplane oder nach der
Farplane ist, wird es nicht angezeigt)
Eine Perspektive verliert die Tiefeninformation, diese
wird aber benötigt um die Hidden Surfaces zu entfernen.
Man braucht aber nur zu wissen wer näher ist, nicht
genau wo.
Pseudo-Teifen Funktion: zwischen -1 Near Plane und 1
FarPlane
Siehe OpenGL: gluPerspective(winkel, bildverhältnis,
near, far)
Tiefe
In Z Pseudotiefe:
- Linien bleiben Linien
- Ebenen bleiben Ebenen
- Parallelen bleiben Parallelen
- Winkel ebenso
Skalierung: Scaling
𝑥 0 0 0
0 𝑦 0 0
𝑀= [
]
0 0 𝑧 0
0 0 0 1
Rotieren: Rotate Urzeiger in Richtung Achse
Nicht Kommutativ: Drehung um Z um Y und X = X.Y.Z
1 0
0
0
0
𝑐𝑜𝑠
−𝑠𝑖𝑛
0]
𝑥 − 𝐴𝑐ℎ𝑠𝑒 (𝑅𝑜𝑙𝑙) = [
0 𝑠𝑖𝑛 𝑐𝑜𝑠 0
0 0
0 1
𝑐𝑜𝑠 0 𝑠𝑖𝑛 0
0 0]
𝑦 − 𝐴𝑐ℎ𝑠𝑒 (𝑃𝑖𝑡𝑐ℎ) = [ 0 1
−𝑠𝑖𝑛 0 𝑐𝑜𝑠 0
0
0 0 1
𝑐𝑜𝑠 −𝑠𝑖𝑛 0 0
0 0]
𝑧 − 𝐴𝑐ℎ𝑠𝑒 (𝑌𝑎𝑤) = [ 𝑠𝑖𝑛 𝑐𝑜𝑠
0 0
1 0
0 0
0 1
Punkt-Projektion
Linien-Projektion
Perspektivische Transformationsmatrix
Perspektivische Projektion = Perspektivische
Transformation + orthographisch Transformation
(Transformation, welche die Z-Achse entfernt)
Meshes
- Polygonal Meshes: Objekte durch Oberflächen
dargestellt
o Braucht viele Ebenen
- B-Splines: gebogene Oberflächen  CAD
- Constructive solid goemetry: Komplexe Objekte
aus simplen generieren
- Spatial subdivision: CT Scans erzeugt Voxels
(3dPixel) Prozess heisst Volume Rendering
Shading und Texturen
Flat-Shading: übernimmt die Farbe des ersten Vertex
- Gouraud Shading: Interpoliert Pixelzeile durch
Vorrechnung der Kantenpunkte
- Phong Shading: interpoliert Normalen auf Fläche
o 6-8 mal langsamer als Gourard
o Wird von OpenGL nicht unterstützt.
-
Hidden Surface Removal
-
Schatten
- so komplex das es von keiner Real-Time Engine
unterstützt wird.
Prozess:Curved Surfaces zu Polygonen heisst
polygonialization oder tesselation
Jedes Polygon bzw. jeder Vertex hat eine
Normale
Ein Face besteht aus den Vertexes und den
Normalen einer Oberfläche
Front & Back Face
Front wenn: Vertices sind im Gegenurzeigersinn
vom Auge aus zu sehen
Pseudotiefe wird nicht im framebuffer sondern im
depth-buffer gespeichert
Gibt viele Algorithmen, aber depth-buffer einer der
einfachsten
Vorgehen, ermittle Tiefe und vergleiche mit der Tiefe
die bereits im Buffer steht falls kleiner überschreibe
den Wert im Buffer/und male darüber
Nachteil: Berechnet Farben die dann wieder
überschrieben werden, Speicher intensiv (heute egal)
Textures
Meist als Bitmap repräsentiert
Ein Bild auf einer Obferlfäche gilt als Texture
Schwierigkeit besteht darin jedes Pixel des Bitmaps
auf die entsprechenden Vertexes abzubilden.
Ist ähnlich wie Gouraud-Shading jedes Pixel muss
interpoliert werden falls die Obferfläche gekrümmt
ist.
Es kann keine Lineare interpolation benutz werden,
darum wird hyperbolic interpolationverwendet.
-
Setzen von Texture Koordinate
glTexCoord2d(s, t); // Muss vor
glVertext3d gemacht werden
-
Lichtmodulation und Texturfarbe
-
Die Farbe der Oberfläche wir durch die Textur
ersetzt.
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE
, GL_REPLACE)
Die Textur wird mit der Licht-Berechnung
moduliert.
glTexEnvi (GL_TEXTURE_ENV , GL_TEXTURE_ENV_MODE
, GL_MODULATE)
Textur auf einer gekrümmten Fläche
auf
Textur Filtering
Normalerweise stimmt die Grösse des Texel
(Teilstück der Textur) nicht mit der grösse eines Pixel
überrein. Man stelle sich eine Figur vor die gesamt
nur 1px gross ist, wie soll da nun eine Textur von
30px auf 30px abgebildet werden?
Die Regeln für dieses mapping nennt man Filter
Magnification filter: Ein pixel mapt zu weniger als
einem Textel
Minification filter: Ein pixel mapt zu mehr als einem
Textel
Filteralgorytmus:
o nearest das Textel mit den nächsten
Koordinaten zum Mittelpunkt des Pixels
wird gebraucht.
o linear Überschüssiges 2 X 2 Array aus Textel
welches am nächsten zum Mittelpunkt des
Pixels liegt wird gebraucht.
Textur auf einer Kugelfläche
OpenGL
- C-API
- Enthält primitive Grafik Kommados
- State Machine: setzt den Status um und er holt
immer was in Status ist
- Matrizen werden in Arrays gespeichert [16]
wobei die indexe zuerst den Spalten nach gehen
- Es gibt einen 32x MatrixStack die Oberste Matrix
wird benutzt zum zeichnen
Modelview Matrix (OpenGL beide in gleicher Matrix)
- Model: definiert Position und Orientierung von
Objekten
- View: definiert Position und Orientierung von
Kamera
Zuerst werden die Objekte definiert und danach die
Kamera, was aber umgekehrt heisst das zuest die ViewKommandos stehen muss. (Zuerst View dann Model, da
Matrixen-Multiplikation Rückwärts rechnet.)
gluLookAt(eyeX, eyeY, eyeZ, targetX, targetY,targetZ, upX, upY, upZ)
besteht aus, wo der Benutzer steht + wohin er schaut +
wie die Kamera steht
Matrix Operationen
- glMatrixMode(mode): GL_MODELVIEW,
GL_PROJECTION
- glLoadMatrix(m): lädt die angegebene Matrix
- glLoadIdentity(): lädt die Einheitsmatrix
- glMultMatrix(m): multiplikation mit m
- glRotate(angle, x,y,z)
- glTranslate(x,y,z)
- glPushMatrix()
- glPopMatrix()
Licht
//Licht Position und Eigenschaften definieren
Float light_position[] = {1.0,1.0,1.0, 1.0} //letzter Param
bestimmt Ob Punkt (1.0) oder unendlich (0.0)
float lightAmbient[] = {0.2f,0.2f,0.2f};
float lightDiffuse[] = {0.8f, 0.8f, 0.8f};
float lightSpecular[] = {1.0f, 1.0f, 1.0f };
// Werte setzen
glLightfv(GL_LIGHT0, GL_POSITION, light_position)
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient)
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse)
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular)
//Licht aktivieren
glEnamble(GL_LIGHT0);
glEnable(GL_LIGHTNING);
// Objekten Materialien zuweisen
float mat_ambient_diffuse[] = {0.5f,0.5f,1.0 f};
float mat_specular[] = {1.0,1.0,1.0};
float mat_shininess[] = {50.0};
gluPerspective(
GLdouble fovy,
GLdouble aspect,
GLdouble zNear,
GLdouble zFar )
//
//
//
//
angle in y direction
aspect ratio (width/height)
near plane
far plane
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE,
mat_ambient_diffuse);
glMaterailfv(GL_FRONT, GL_SPECULAR, mat_specular);
glMaterailfv(GL_FRONT, GL_SHININESS, mat_
shininess);
void glViewport(GLint x, GLint y, GLsizei width,
GLsizei height )
Viewport und Perspective zusammen bestimmen wie
die Szene auf den Bildschirm gezeichnet wird.
Textur
Display Lists
Kopieren wir da einfach den Code rein?
Mit den Befehlen glNewList() and glEndList() kann eine
Liste erstellt werden, welche OpenGL Commandos
enthält. Diese Kommandos werden bei mehrfachem
Aufrufen von glCallList() nur einmal ausgeführt, dannach
ist das Resultat bzw. die Funktionalität der Liste
bekannt. -> Performance verbesserung
Die Werte in der Liste können nach Abschluss nicht
mehr geändert werden.
Es wird gebraucht bei:
- Matrix Multiplikationen
- Texturen
- Licht Berechnungen
- Raster Bitmaps
Collusion Detection / Kollisionserkennung
Zwei Phasen Kollisionserkennung:
Broad Phase: Findet Objektpaare die Kollidieren mit
-
Hilfe von einfachen Objektformen (bounding volumes:
Kugel, Quader)
Narrow Phase: exakte Kollisionserkennung (für jeden
Punkt)
Broad Phase
Space-time coherence: Zeit der nächsten Kollision berechnen
 damit kann man laufen lassen bis dahin ohne Berechnung
Space coherence: es ist weniger Prezise und es kann die
Kollision erst erkennen wenn es bereits soweit ist. Zurücksetzen
Narrow Phase
Komplizierte Strukturen (Objekte mit vielen Polygonen)
werden mit hierarchischen Bounding Volumes realisiert.
- Octrees (3D) oder Quadtress(2D)
- Binary Space Partitioning Trees (BSP-Trees)
Octrees
Typen - Bounding Volumes (Kollisionskörper):
Kugeln (Spheres)  ineffizient bei Langen Objekten
AABB: (axis aligned bounded boxes) Quader-boxen mit
-
Weltachsen Ausrichtung
OBB: (oriented bounding boxes) Achsen am besten
angepasst
AABB
Kollision wenn alle Projektionen
auf Achsen überlappen.
Keine Kollision wenn mind. eine
Projektion auf Achse nicht
überlappt
OBB
Keine Kollision wenn eine
Achse existiert die keine
Überlappung erzeugt.
(Seperating axis)
Seperating Axis: falls gefunden  keine Kollision
- Suche: Ortogonale der Oberflächen (3), Orthogonale auf
-
Ebene aufgespannt von 2 Kanten
Max 15 Achsen: je 3 Flächennormalen der Boxen + 9
der Kanten Kombinationen
2D Raum: nur Normalen zu Seitenlinien also 4 Achsen
Quadtrees
-
-
Volle bzw. ganz leere Blöcke sind Baumblätter
Wird auch bei Karten/Geographie verwendet
Animation
Möglichkeiten
- KeyFraming
- Explizites Scripting
KeyFraming
Wie bei Disney: chief animator zeichnet die wichtigen Frames
(keyframes) und die anderenwerden interpoliert.
Transaktionen kein Problem  Matrix mit Zeitfunktion
Bei Rotationen werden Quaternions gebraucht.
Charakter Animation
Rigging: Charakter mit Skelett (Bones +Joints) versehen
Kinematik:
-
-
Forward Kinematik
Forward Kinematic FK: Definiert für jedes Gelenk
Bewegung
Inverse kinematik IK: Definiert den endpunkt und ermittelt
die Einstellung bei Gelenken.
MeshSkinning: Oberfläche wird vom Skelet beeinflusst
Blending
Farbe bestimmt durch RGBA (redm green, blue,
alpha)
- Alpha 0: transparent, 1: undurchsichtig
D: momentan buffer, S neu überblendet
Blending im OpenGL
-
-
Alpha als 4ter Parameter glColor()/glMaterial()
glEnable(GL_BLEND)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
aS*CS +(1-aS)*CD =
(aS*rS+(1-aS)rD, aS*gS+(1-aS)gD, aS*bS+(1-aS)bD,
aS*aS+(1-aS) aD)
Immer zuerst die hintersten Objekte rendern
Billboarding: Bilder mit Alpha
-Billboard: eine Ebene (Bild) die immer rechtwinklig zur
Kamera steht
Fog/ Nebel
Objekte erhalten mit Distanz zu Kamera ein Fading zur Fog-Farbe.
Faktor f wird über folgende Funktionen bestimmt:
GL_EXP: f=exp(-d*z)
GL_EXP2: f=exp(-(d*z)^2)
GL_LINEAR: f= (end-z)/(end-start)
glFog()
C0: ursprungsfarbe Cf: fog Farbe
Antialiasing
Phänomen der Sampling Theorie: um
rekonstruieren zu können muss Abtastfrequenz 2mal so
gross sein wie bandbreite.
AA: Texturen
Passiert wenn wir ein Texturbereich auf über Texel bereich
haben und er per zufall einen Texel nimmt. Wird reduziert
durch mittelung aller Pixel.(Kostspielig, Integral über alle.)
Annäherungen:
AA: Supersampling
Samplet mehr als einmal pro pixel bsp doppelt so oft. Danach berechnet man
jeweils die Werte die darauf sind und den Rest mit hintergrund.
MIP maps (multum in parvo/many things in small place)
-
MIP ist eine Sequenz von texturen mit abnehmender Auflösung
Für weit entfernte Objekte werden kleinere Texturen verwendet
glTexParametri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_NEAREST_MIPMAP_LINER)
-
Pixel als Kreis anstatt Quadrat betrachten, Kreis
mappt zu einer Ellipse, Mittelwert über Ellipse
Stochastic Smapling
- MIP maps
AA in OpenGL
glEnable(GL_POINT_SMOOTH oder GL_LINE_SMOOTH)
glHint(target, hint)
GL_POINT_SMOOTH_HINT,
GL_LINE_SMOOTH_HINT.
GL_POLYGON_SMOOTH_HINT,
GL_FOG_SMOOTH_HINT,
GL_PERSECTIV_CORRECT_HINT
GL_NICEST oder GL_FASTEST  prefiltering oder
nicht
Bump Map
Rauhe Oberfläche vorgaukeln durch Normalen„Textur“
Normalen werden durch die R=x,G=y,B=z Anteile
bestimmt, deshalb auch eher bläulich
Normalerweise vereinfachtes Lichtberechnung,
nur ein Licht nur diffus
Wichtig: LichtVektor noch in anderes System
umrechnen
Tangent Vektor *
-
gluBuild2DMipmaps() anstelle von glTexImage2D()
Environment Mapping
Trick um auszusehen als würde sich Umwelt in Objekt spiegeln.
Funktionier in etwa wie Raytracer: und macht Map daraus
Typen
o Sphere
o Cube
Cube Maps
o Schicke von Objekt aus strahlen und zeichne sie auf die
entsprechende der 6 Texturen
o Klassisch vorberechnet/heute auch Laufzeit
o Sieht bei ausfallswinkel der Kamera vom Objekt welcher
Pixel getroffen wird.
Sphere
o Nur eine Textur, dafür nur eine Seite Reflektion von Kugel,
sonst gleich
Refraction Environment Mapping: gleiche wie oben einfach mit Brechung
Shadow Mapping
Berechne Szene aus Sicht vom Licht. Speichere Tiefen-Buffer (Was
wird beleuchtet)
Berechne von Kamera jede Koordinate im (ins Licht System
transformierte System) vergleiche x, y mit Depth-Buffer. Falls nicht
gleich  Schatten
=
Parallay Mapping
Um realistischer zu sein gibt es noch eine Höhen
Map
-
OpenGL Extensions & Performance
-
Erweiterbare API (Stable
Core/Dynamic Extension)
Vorteil: schneller erweiterbar
Typen:
ARB (Architecture Review Board):
Gremium mehrerer Firmen bestimmen
Standard
EXT:mehrere Hersteller unterstützen
Funktion
Specific: Spezifischer Hersteller
(NVIDIA)
Advanced 3D Rendering
Multitexturing:
- Mehr als eine Textur pro Oberfläche (4 oder 16)
- MaxAnzahl überprüfen mit: GL_MAX_TEXTURE_UNITS_ARB
bzw. glGetIntegerv()
- Kann den DetailLevel erhähen: Landschaft mit einer grossen
Textur und gekachelter Detailtextur
Kopieren wir hier Code
Textur-Mapping-Methoden
- Environment Mapping
- Refraction Environment Mapping
Benutzung:
Unix: glext.h
Windows: wglGetProcAddress
GLEW: vereinfachte Library die beides
macht
2D Rendering
Billboards: Polygon das immer
Richtung Kamera gerichtet ist
o Oft mit Transparenz benutzt
o Beispiel: Charakter, Gras,
Linseneffekte, SkyBoxes
(Würfel der Welt
Hintergrund)
Partikel System: verwendung von
vielen Billboards
o Hat Attribute (position,
speed, color, size, lifetime)
o Wichtig: Reihenfolge
beachten, wenn nicht
einheitliche Textur (Tiefe egal
z.B. Feuer) sonst 
Tiefensortierung und malen
zuletzt
Performance Tuning
Culling Techniken: weglassen von
Geometrie
-
Occlusion Culling: Verdecktes nicht
zeichnen
Frustum culling:Alles ausserhalb
Frustum
Backface culling: Dreieck-Rückseiten
nicht zeichnen
Level of Detail: mehrer Meshes für gleiches
Objekt. Je nach Distanz anderes benutzt
Flaschenhälse:
CPU: Applkation limit, Treiberlimit
Texture: Texture Speicher überlauf
Framebuffer: Shader statt multipass
rendering
-
Bump Mapping
Displacment Mapping: beeinflusst Geometrie
o Sehr Rechenintensiv
o Auf Grafikkarte erzeugt er Triangles
Real Time Rendering
Realtime
- Schnell, wenige Details
- Computerspiele, Simulationen
Offline Rendering
- Langsam, hoch detailiert
- Kino und Wissenschaft
Motivation
- Dynamische Interaktive Applikationen
- Minimale Framerates: 10 Hz (Animation wahrnehmbar), 30Hz
(Flimmerfrei mit doublebuffering) 60 Hz
Prinzip: Reduziere Geometrie
Tuning: Flaschenhals  Bus zu Grafikkarte
- Vertex Array: wie normal aber ein Treibercall mit Array von
Vertices
o glEnableClientState(GL_VERTEX_ARRAY)
o glEnableClientState(GL_COLOR_ARRAY)
o glVertexPointer(3, GL_INT, 0, arrayName)
o glColorPointer(3, GL_FLOAT, 0, colorArray)
o glDrawArrays(GL_TRIANGLES, 0<startindex>, 6<wie
viele>)
- mit Indices: jeder Vertex nu rein mal dafür ein IndexArray
o glDrawElements(GL_QUADS, 24<anzahl Indices>,
GL_UNSIGNED_BYTE, indices)
- Display List: statische Daten in videoRAM, optimierung
Kommandos, Frustum & Occlusion Culling
- Vertex Buffer Object VBO: ermöglicht Vertexes in video-RAM
zu speichern
o glGenBuffersARB(1, &VBOVertices)
o glBindBufferARB(GL_ARRAYBUFFER_ARB,
VBOVertices)
o glBufferDataARB(GL_ARRAY_BUFFER_ARB,
numTrinagles * 3 * 3 * sizeof(float), geometry,
GL_STATIC_DRAW_ARB)
- Instanzierung (Instancing): GPU erzeugt mehrere Instanzen
vom gleichen Objekt bei einem einzigen Zeichnenaufruf
Tuning: Zusammenfassung
- DisplayLists oder VertexBuffer für statische Objekte
- VertexArrays oder dynamische VertexBuffer für verformbare
Objekte
- Instancing für mehrere gleiche Objekte
- Datentrasfer so kelin wie möglich halten
GPU Programmierung - GLSL (OpenGL Shading Language)
SLI (Scalable Link Interface) / Crossfire Technik
Grafikkarten Schnittstelle: meist PCI Express 1,2,4,16,32x Mehrere Grafikkarten koppeln
Hohe Rechengeschwindigkeit aufgrund der Parallelität:
2 Techniken:
dazu mehrere Pipelines die gleichzeitig selbe Operationen ausführen.
- AFR (Alternate Frame Rendering): Abwechselnd
Früher 4 heute bis zu 240 pro Karte
Bild rendern
- SFR (Split Frame Rendering): jeder Rendert
Hälfte
Graphic Architektur
Graphic Pipeline
-
Application Stage  3D Dreiecke
Geometry-Stage  2D Dreicke
o Vertex verarbeitung, 3D zu 2D, Attribute
Rasterization-Stage  Pixels
o Dreieck verarbeitung, auf Raster bringen, Shading
Pixels, Sichtbarkeit
-
-
Vertex Programmierung
Input: Vertex Parameter (Position etc.), Programm
-
-
Paramter und OpenGL States
Output: homogene ClipSpace Position 2D Position,
Farben, Texturkoordinaten, Nebel Koordinaten, generierte
Vertex Attribute
Es kommt immer ein Vertex rein und muss einer
raus
Keine Kanten, Oberflächen oder Nachbarvertex
bekannt
Vertex Shader wird einfach ersetzt, muss
OpenGL Funktionalität wieder
einprogrammieren (Modelview Transformation
etc.)
GLSL
GPU Programmierung:
-
ASM (Assembler)
RenderMan(Pixar)
HLSL: DirectX Microsoft
CG: Nividea
GLSL: OpenGL
Gleiche Sprache für Vertex und Fragment
Programmierung: Basiert auf C/C++
seit OpenGL 2.0 fest integriert
Applikation/Game
3D API (OpenGL/Direct3D)
GPU Front-End
Programmable Vertex Processor (modern): für
Transformationen zuständig, Input: Vertex Position,
Normale Tangente TexturKoordinaten, Farbe etc.
Primitive Assembly: Kompiliert Vertices in Punkte und
Polygone, Clipping, Entfernt BackFace triangles
Rasterization Interpolation: bestimme für Dreiecke die
Raster die belegt sind, Interpoliere Farbe/Textur
Programmable Fragment Processor (modern): Fragmente
ändern, Input: Tiefe und TexturKoordinaten
Raster Operations: Tiefen Überprüfung (32 bit, 24 z Buffer,
8 für Stencil Buffer (Sichtbaren bereich markieren)),
Blending Limitierte Programmierbarkeit,
Frame Buffer
Fragment Programmierung
- Input: Fragment Attribute, Programm Parameter
und OpenGL States
- Output: schlussendliche Farbe und Tiefe des
Fragments
- Man kann Fragmente wegschiessen
- Keine Vertex oder Nachbarfragment
Infromationen
- Tauscht wiederum den Standardshader mit
Funktionalität aus. (Textur, Farbsumme, Nebel
nicht eingerechnet)
Sprache
Daten Typen
-
Skalare: float, int bool
- Vektor: vec2, vec3, vec4 (float); ivec2 …(int); bvec(bool)
- Matricen: mat2, mat3, mat4 (nur float)
- Samplers: Texturzugriffvariable sampler1D, sampler2D, 3D
- Structures, Arrays und void
Geht nicht:
-
Float b = 2; // 2.0f
Float e = (float)2;
Steuerungsanweisungen:
-
If/else,
For
While do
Continue, break, discard
Paramter
-
in: default
out: rückgabe
inout beides
Variablen Qualifiers
-
Const: Konstanten
Attribute: Globale Variablen die bei jeder Vertex ändern
Shader Kreieren:
Gluint glCreateShader(shaderType);
// GL_VERTEX_SHADER oder GL_FRAGMENT_SHADER
void glShaderSource(
GLuint shader,
int numOfStrings,
const char **strings,
int *lenOfStrings);
void glCompileShader(GLuint program);
Programm erstellen:
GLuint glCreateProgram();
void glAttachShader(GLuint program, GLuint shader);
// beide Shader attachen
void glLinkProgram(GLuint prog);
void glUseProgram(GLuint program);
void setShaders() {
char *vs,*fs;
v = glCreateShader(GL_VERTEX_SHADER);
f = glCreateShader(GL_FRAGMENT_SHADER);
vs = textFileRead("toon.vert");
fs = textFileRead("toon.frag");
const char * vv = vs;
const char * ff = fs;
glShaderSource(v, 1, &vv,NULL);
glShaderSource(f, 1, &ff,NULL);
free(vs);
free(fs);
glCompileShader(v);
glCompileShader(f);
p = glCreateProgram();
glAttachShader(p,v);
glAttachShader(p,f);
glLinkProgram(p);
}
glUseProgramObject(p); //enable object „p“
glUseProgramObject(0); //ausschalten des aktuellen Shaders
Attribute abfragen:
GLint location = glGetUniformLocation(p, „name_of_uniform“);
float f = 1.0;
float fv[] = {1.0, 2.0, 3.0);
glUniform{1|2|3|4}{f|i}(location, f);
glUniform{1|2|3|4}{f|i}v(location,3, fv);
-
-
z.B. Normale
Uniform: Globale Applikationsvariablen (glBegin glEnd)
gleich für alle Vertex z.B. gl_ModelviewMatrix,
gl_LightSource[0]
Varying: werden von Vertex zu Fragment Shader
übergeben
Farbtheorie
- Steht in Bezihung zur Wellenlänge des Lichts
- Kann aus den Primärfarben rot, grün, blau
gebildet werden
- Licht ist ein elektromagnetisches Phenomen
- Es gibt drei arten von Zapfen die verschieden
sensitiv auf Wellenlängen reagieren.
- Einige Lichtquellen emittieren genau eine
Wellenlänge Laser
- Normale aber meistensein Spektrum
- Mensch erkennt ca. 10mio Farben
Spektrum besteht aus:
- Hue: Farbton
- Saturation: Sättigung
- Value: Hellwert
Farbalgebra (S, P,N sind Spektren):
- Wenn S=P gilt S + N = P + N
- aS = aP
- Linearkombinationen: T = a.A + b.B
- Wie Vektor behandelt 3Komponenten und selbe
Rechnungen
- 3 Komponenten müssen nicht rgb sein, müssen
nur Linear unabhängig sein
- Meistens rgb weil die Zäpfchen darauf am
sensibelsten sind
Kurven und Oberflächen
Curves
-
Bezier curves  Nachteil: ganze Kurve ändert sich
immer
Splines
B-Splines, NURBS
Surfaces
-
Surfaces of revolution
Ruled surfaces
Bezier surface patches
B-spline surface patches
-
Catmull-Clarke Subdivision Surfaces : zwischen
Polygone
Curves and Surfaces with OpenGL
-
Quadratische Bezier-Kurven
- Drei Punkte definieren Kurve
Kubische Bezier-Kurven
- Vier Punkte definieren Kurve
 Alles Weitere in Folien nachsehen
Glossar
G/T FLOPS
Gtri/sec
tesselation
Rendering
Shading
Giga/Terra Floating Point Operations per Second
Giga triangle per second
Prozess der aus CurvedSurfaces Polygone erstellt
Prozess von Definition zu Bild
Ist ein Interpolationsschema das für jeden Pixel
bestimmt wie er aussieht anhand der Oberfläche, der
Farbe der Vertices.
4-Feld-Baume um Objekte zu lokalisieren 2D
Quadtree
Grad
Bogen
0
0
sin
0
cos
1
tan
0
30
𝜋
6
1
2
√3
3
√3
3
Red
45
𝜋
4
√2
2
√2
2
1
60
𝜋
3
√3
2
1
2
90
𝜋
2
1
√3
nd
0
100%, 0%, 0%
100%, 50%, 0%
Yellow
100%, 100%, 0%
Chartreuse
50%, 100%, 0%
Lime
0%, 100%, 0%
SpringGreen
0%, 100%, 50%
Aqua / Cyan
0%, 100%, 100%
0%, 50%, 100%
Blue
0%, 0%, 100%
50%, 0%, 100%
Fuchsia/Magenta 100%, 0%, 100%
100%, 0%, 50%
Black
0%, 0%, 0%
Gray / Grey
50%, 50%, 50%
100%,
100%,
White
100%
0, 36%, 36%
Firebrick
70%, 13%, 13%
Multiplikation mit einem Skalar
𝜆𝑎𝑥
𝑎𝑥
𝑎
𝜆𝑎
𝜆 𝑎⃗ = 𝜆 ( 𝑦 ) = ( 𝑦 ) wenn 𝜆 = 0 → 𝜆 𝑎⃗ = 0
𝑎𝑧
𝜆𝑎𝑧
Addition/Subtraktion Gesetze
1
1
2
kommutativ 𝑎⃗ + 𝑏⃗⃗ = 𝑏⃗⃗ + 𝑎⃗
(−2) + (−2) = (−4)
3
3
6
1
1
0
(−2) − (−2) = (0)
3
3
0
assoziativ
(𝑎⃗ + 𝑏⃗⃗) + 𝑐⃗ = 𝑎⃗ +(𝑏⃗⃗ + 𝑐⃗)
Vektor-Länge (Betrag)
2
𝑎⃗ (3) → |𝑎⃗| = √22 + 32 + 42 = √4 + 9 + 16 = √29
4
Skalar-Produkt
𝑎⃗∙𝑏⃗⃗ = |𝑎⃗| ∙ |𝑏⃗⃗| ∙ cos(𝜃)
Gesetze
1.
𝑏𝑥
𝑎𝑥
(𝑎𝑦 ) ∙ (𝑏𝑦 )
𝑎𝑧
𝑏𝑧
2. kommutativ
𝑎⃗∙𝑎⃗ = |𝑎⃗| ∙ |𝑎⃗| = |𝑎⃗|2
𝑎⃗∙𝑏⃗⃗ = 𝑏⃗⃗∙ 𝑎⃗
3. distributiv
4.
5.
⃗⃗⃗⃗ = 𝑎⃗∙𝑏⃗⃗ + 𝑎⃗∙ 𝑐⃗
𝑎⃗ ∙ (𝑏⃗⃗ +𝑐)
(𝛼𝑎⃗)∙ (𝛽𝑏⃗⃗)= (𝛼𝛽)𝑎⃗ ∙ 𝑏⃗⃗
𝑎⃗∙𝑏⃗⃗ = 0 → 𝑤𝑒𝑛𝑛 𝑠𝑒𝑛𝑘𝑟𝑒𝑐ℎ𝑡
= 𝑎𝑥 𝑏𝑥 + 𝑎𝑦 𝑏𝑦 + 𝑎𝑧 𝑏𝑧
(𝑎⃗∙𝑏⃗⃗)∙𝑐⃗ ≠ 𝑎⃗∙ (𝑏⃗⃗∙𝑐⃗)
Winkel zwischen 2 Vektoren
1
−3
(−2) ∙ ( 4 )
1
−3
𝑎⃗ ∙ 𝑏⃗⃗
−3 + (−8) + 6
−5
3
2
𝑎⃗ (−2) 𝑏⃗⃗ ( 4 ) → cos(𝑎⃗,𝑏⃗⃗) =
=
=
→ cos −1 (
)
2 + (−2)2 + 32 ∙ √(−3)2 + 42 + 22
⃗⃗ |
∙
∙ √29
|𝑎
√14
√14
⃗|
∙
√29
|𝑏
√1
3
2
Orthogonal-Projektion (Vektor auf anderem Vektor)
𝑉𝑒𝑘𝑡𝑜𝑟: 𝑃𝑟𝑜𝑗𝑏⃗⃗ (𝑎⃗) =
⃗⃗
𝑎⃗⃗∙𝑏
2
⃗⃗|
|𝑏
∙ 𝑏⃗⃗
Vektor-Produkt
𝑢2 𝑢3
𝑢1 𝑢3 𝑢1
𝑢
⃗⃗×𝑣⃗ = ( |𝑣 𝑣 | , − |𝑣 𝑣 | , |𝑣
2
3
1
3
1
𝑢2 𝑢3
|𝑣 𝑣 |= 𝑢2 𝑣3 − 𝑣2 𝑢3
2
3
Betrag = Fläche Parallelogramm
𝐵𝑒𝑡𝑟𝑎𝑔: 𝑃𝑟𝑜𝑗𝑏⃗⃗ (𝑎⃗) =
𝑢2
𝑣2 | )
𝑎
⃗ ∙ 𝑏⃗
|𝑏⃗|
Gesetze
1.
𝑢
⃗⃗×𝑣⃗ = − 𝑣⃗ ×⃗⃗⃗⃗
𝑢
2.
𝑢
⃗⃗×𝑢
⃗⃗ = ⃗0⃗
3. Senkrecht
𝑢
⃗⃗×𝑣⃗ = 𝑠𝑒𝑛𝑘𝑟𝑒𝑐ℎ𝑡 𝑧𝑢 𝑢
⃗⃗ 𝑢𝑛𝑑 𝑣⃗
𝑢
⃗⃗ ∙(𝑢
⃗⃗×𝑣⃗) = 0 = 𝑣⃗ ∙(𝑢
⃗⃗×𝑣⃗)
|𝑢
⃗⃗×𝑣⃗|2 = |𝑢
⃗⃗|2 |𝑣⃗|2 − (𝑢
⃗⃗∙𝑣⃗)2
|𝑢
⃗⃗×𝑣⃗| = |𝑢
⃗⃗||𝑣⃗| ∙ sin(𝑢
⃗⃗,𝑣⃗)
4. Langrange
5. Sinussatz
Gemischtes-Produkt/Spatsprodukt
[𝑢
⃗⃗∙ (⃗⃗⃗⃗
⃗⃗| ∙ |⃗⃗⃗⃗
⃗⃗,⃗⃗⃗⃗
⃗⃗,⃗⃗⃗,
𝑣 ⃗⃗⃗⃗⃗
𝑤]=𝒖
𝒗 ×⃗⃗⃗⃗⃗
𝒘 )= | 𝒖
𝒗 ×⃗⃗⃗⃗⃗
𝒘 | ∙ 𝐜𝐨𝐬(𝒖
𝒗 ×⃗⃗⃗⃗⃗
𝒘)
Zyklisches Tauschen: [ 𝑢
⃗⃗,⃗⃗⃗,
𝑣 ⃗⃗⃗⃗⃗
𝑤 ] = [ ⃗⃗⃗,
𝑣 ⃗⃗⃗⃗⃗,𝑢
𝑤 ⃗⃗ ] = [ ⃗⃗⃗⃗⃗,𝑢
𝑤 ⃗⃗,⃗⃗⃗
𝑣]
Betrag = Volumen des Spats
𝑢2 𝑢3
𝑢1 𝑢3 𝑢1
𝑢
⃗⃗×𝑣⃗ = ( |𝑣 𝑣 | , − |𝑣 𝑣 | , |𝑣
2
3
1
3
1
𝑢2
𝑣2 | )
Herunterladen