Feste Funktionspipeline: Unterschied zwischen den Versionen
Flash (Diskussion | Beiträge) K (→Siehe auch) |
Flash (Diskussion | Beiträge) K (Unvollständig erklärt) |
||
Zeile 1: | Zeile 1: | ||
− | {{Unvollständig}} | + | {{Unvollständig|Es Fehlt Matrix Kontrolle, Feedback, Eingabe Konvertierung, Lighting und Texture Koordinaten generierung. }} |
Fixe Funktionspipeline für OpenGL 1.1 | Fixe Funktionspipeline für OpenGL 1.1 |
Version vom 31. Juli 2010, 15:54 Uhr
(Mehr Informationen/weitere Artikel) Es Fehlt Matrix Kontrolle, Feedback, Eingabe Konvertierung, Lighting und Texture Koordinaten generierung. |
Fixe Funktionspipeline für OpenGL 1.1
Inhaltsverzeichnis
- 1 Vertex Pipeline
- 1.1 Eingabe Konvertierung
- 1.2 Modelview Muliplikation
- 1.3 Primitive erstellen
- 1.4 Flat Shading
- 1.5 Benutzerdefinierte Clipping Planes
- 1.6 Projection Multiplikation
- 1.7 Kamera Clipping
- 1.8 Division durch w
- 1.9 Viewport Multiplikation
- 1.10 Z Anpassung
- 1.11 Polygon Culling
- 1.12 Polygon mode
- 1.13 Rasterizer
- 2 Fragment Pipeline
- 2.1 Rasterizer
- 2.2 Texel Generierung
- 2.3 Texel Anwendung (Berechnung)
- 2.4 Nebel Berechnung
- 2.5 Deckungsberechnung Antialiasing
- 2.6 Pixel Besitzer Test
- 2.7 Scissor Test
- 2.8 Alpha Test
- 2.9 Stencil Test
- 2.10 Tiefen Test
- 2.11 Blending
- 2.12 Dithering
- 2.13 Logische Operationen
- 2.14 Farb Maskierung
- 2.15 Frame Buffer Kontrolle
- 2.16 Siehe auch
- 2.17 Ressourcen
Vertex Pipeline
Eingabe Konvertierung
Hier erhält die Vertex Pipeline durch entsprechende Konvertierung(en) eine standardisierte Form eines Vertices.
Siehe auch: glVertex, glVertexPointer, glArrayElement
Modelview Muliplikation
Der Vertex wird mit der im Modelview Matrix Stack oben aufliegenden Matrix multipliziert.
Siehe auch: glMatrixMode, glPushMatrix, glPopMatrix, glTranslate, glScale, glRotate, glMultMatrix, glLoadMatrix, glLoadIdentity
Primitive erstellen
Hier werden die Eingabedaten über die Art des Primitives gegebenenfalls konvertiert und weiter gereicht.
Siehe auch: glBegin, glEnd, glDrawElements, glDrawArrays
Flat Shading
Gegebenenfalls wird der bereits berechnete Farbwert für das Flat Shading für alle Punkte des Primitives gleich gesetzt.
Siehe auch: glShadeModel
Benutzerdefinierte Clipping Planes
Hier werden gegebenenfalls die Primitive an benutzerdefinierten Ebenen abgeschnitten, weiter gereicht oder komplett verworfen.
Siehe auch: glClipPlane
Projection Multiplikation
Hier werden die Vertices mit der am Projection Matrix Stack oben aufliegenden Matrix multipliziert.
Siehe auch glOrtho, glFrustum, gluPerspective, glMatrixMode
Kamera Clipping
Das clippen am Kamera Sichtkörper
Siehe auch: Clipping Plane
Division durch w
Hier werden x, y und z Koordinaten des Vertices durch die w Koordinate dividiert. In diesem Schritt erfolgt bei der perspektivischen Projektion die eigentliche Projektion auf den Bildschirm (oder andere Ausgabemedien).
Viewport Multiplikation
Hier wird der x und y Teil des Vertex mit der Viewport Matrix multipliziert. Das Ergebnis sind die Pixelcoordinaten des Vertex.
Siehe auch: glViewport
Z Anpassung
Hier wird der zuerst im Bereich [-1|1] liegende z Teil des Vertex auf den für den Z Buffer benötigten Bereich [0|1] gescaled.
Siehe auch: glDepthRange
Polygon Culling
Das Front- bzw. Backface Culling findet hier statt.
Siehe auch glFrontFace, glCullFace
Polygon mode
Gegebenenfalls wird hier 1 3eck in 3 Linien oder 3 Punkte zerlegt. Das typische Wireframe kommt häufig hier zustande.
Siehe auch: glPolygonMode
Rasterizer
Hier werden aus dem Primitiv die Fragmente berechnet.
Fragment Pipeline
Rasterizer
Die Aufgabe des Rasterizers ist es, aus 2 dimensionalen Primitiven die durch 1, 2 oder 3 Vertices gegeben sind die Pixel zu berechnen die gezeichnet werden sollen. Jedes Pixel das gezeichnet werden soll wird weiter durch die Fragment Pipeline geschickt wo es noch ein Reihe von Tests durchlaufen muss bis es endgültig in den Frame Buffer gelangt. Für jedes Fragment werden folgende Werte berechnet und weiter gereicht:
- Koordinaten innerhalb des Frame Buffers
- Interpolierte Tiefe (Z-Wert)
- Interpolierte Texturkoordinaten (gegebenenfalls auch mehrere Texturkoordinaten)
- Interpolierter Farbwert (gegebenenfalls auch 2 Farbwerte)
- gegebenenfalls Deckung für Antialiasing
Auf moderneren Grafikkarten werden hier die erzeugten Fragmente auf mehrere Fragment Prozessoren aufgeteilt und parallel berechnet um eine höhere Füllrate zu erzielen.
Punkte
Größe des Punkte wird kontrolliert durch glPointSize. Wenn Punkt antialiased (siehe auch glEnable( GL_POINT_SMOOTH ), Aliasing und Antialiasing) gezeichnet werden sollen, so wird die prozentuelle Deckung des Pixels für später berechnet und gespeichert gespeichert. Ein Antialiased Punkt ist ein Kreis, nicht antialiased Punkte werden als Quadrat dar gestellt.
Siehe auch: glEnable, glDisable und glPointSize
Linien
Breite der Linie wird kontrolliert durch glLineWidth. Antialiasing von Linien wird durch glEnable( GL_LINE_SMOOTH ) erreicht. Ist GL_LINE_STIPPLE aktiviert, so werden hier die nicht entsprechenden Fragmente verworfen bzw. nicht erzeugt.
Siehe auch: glEnable, glDisable, glLineWidth und glLineStipple]]
3ecke
Mit GL_POLYGON_SMOOTH kann hier das Antialiasing erreicht werden.
GL_POLYGON_SMOOTH schaltet sehr häufig in Softwaremodus um, da nicht in Hardware verfügbar. Und auch im Softwaremodus werden häufig die Edge Flags bei geclippten 3ecken nicht richtig gesetzt (siehe glEdgeFlag und Clipping Plane). |
Mit glPolygonStipple kann man auch hier das erzeugen von Fragmenten verhindern werden. Gegebenenfalls wird die Tiefe (Z-Wert) noch mit glPolygonOffset modifiziert.
Siehe auch: glEnable, glDisable, glPolygonOffset und glPolygonStipple
Texel Generierung
Berechnung der Farbwerte der Texel. Hier werden für eine Trilineare Filterung zuerst die beiden Mipmaps welche verwendet werden sollen berechnet, danach werden die 8 umliegenden Texel (4 in jedem Mipmap) entsprechend interpoliert.
Siehe auch: glGenTextures, glDeleteTextures, glTexImage1D, glTexImage2D, glTexImage3D, glTexSubImage1D, glTexSubImage2D, glTexSubImage3D, gluBuild1DMipmaps, gluBuild2DMipmaps, glTexParameter, glEnable, glDisable und glBindTexture
Texel Anwendung (Berechnung)
Ausgehend von Farbe (glColor), Texelfarbe(n) und Texturfarb konstante (glTexEnv) wird hier ein neuer Farbwert für das Fragment berechnet.
Siehe auch: glTexEnv, glColor und GL_ARB_texture_env_combine
Nebel Berechnung
Wenn GL_FOG aktiviert ist, so werden hier die Distanz basierten Nebelberechnungen so wie durch glFog definiert mit Hilfe des Z-Wertes des Fragmentes durchgeführt.
Siehe auch: glEnable, glDisable und glFog
Deckungsberechnung Antialiasing
Hier wird im RGBA Modus der Alpha Wert eines Fragmentes anhand der Deckung die durch den Rasterizer berechnet wurde modifiziert.
Siehe auch: glEnable( GL_POLYGON_SMOOTH ), glEnable( GL_LINE_SMOOTH ), glEnable( GL_POINT_SMOOTH ) und glDisable
Pixel Besitzer Test
Prüft ob der aktuelle OpenGL Context (siehe wglMakeCurrent) im Besitz des Pixels, welches gezeichnet werden soll, ist. Ist dies nicht der Fall (Beispielsweise durch ein darüber liegendes Fenster welches das Pixel verdeckt), so wird beim Fenstersystem angefragt was zu tun ist. Eine Mögliche Reaktion ist beispielsweise das Verwerfen des Fragmentes.
Siehe auch: wglCreateContext, wglDeleteContext, wglMakeCurrent und wglGetCurrentContext
Scissor Test
Wenn GL_SCISSOR_TEST aktiviert ist, so wird hier geprüft ob das Fragment innerhalb des Rechtecks liegt welches mit glScissor definiert wurde. Ist dies nicht der Fall, so wird das Fragment verworfen.
Siehe auch: glEnable, glDisable und glScissor
Alpha Test
Wenn GL_ALPHA_TEST aktiviert ist, so wird geprüft ob der Alpha Wert des Fragmentes die mit glAlphaFunc definierte Bedienung erfüllt. Wird die Bedienung nicht erfüllt, so wird das Fragment verworfen.
Siehe auch: glEnable, glDisable und glAlphaFunc
Stencil Test
Wenn GL_STENCIL_TEST aktiviert ist, so wird geprüft ob der Stencil Teil des aktuellen Framebuffer an der Fragmentposition die Bedienung, welche mit glStencilFunc angegeben wurde, erfüllt. Ist dies nicht der Fall, so wird das Fragment verworfen.
Siehe auch: glEnable, glDisable und glStencilFunc
Tiefen Test
Wenn GL_DEPTH_TEST aktiviert ist, so wird geprüft ob der Tiefen Teil des aktuellen Framebuffer an der Fragmentposition die Bedienung, welche mit glDepthFunc angegeben wurde, erfüllt. Ist dies nicht der Fall, so wird das Fragment verworfen.
Siehe auch: glEnable, glDisable und glDepthFunc
Blending
Wenn GL_BLEND aktiviert ist, so wird die Farbe des Fragmentes und die Farbe aus dem aktuellen Framebuffer an der Fragmentposition anhand der oder des Alphawertes und der mit glBlendFunc angegebenen Funktion interpoliert.
Siehe auch glEnable, glDisable, glBlendFunc und GL_ARB_imaging
Dithering
For allem im Farbindex-Modus wird hier die Illusion von mehreren unterschiedlichen Farben und weiche Übergänge erzeugt. Die Bedienung für diesen Algorithmus ist allerdings, das er nur am aktuelle Fragment basiert (Beispielsweise Fensterosition und Farbwert) was die Berechnungsmöglichkeiten etwas einschränkt.
Siehe auch: glEnable( GL_DITHER ), glDisable, Antialiasing und Dithering
Logische Operationen
Hier können auf Bit-Ebene logische Operationen durchgeführt werden. Wenn im RGBA Modus GL_COLOR_LOGIC_OP aktiviert ist, so wird dafür Blending ausgeschalten.
Siehe auch: glEnable, glDisable und glLogicOp
Farb Maskierung
Hier kann mittels glIndexMask, glColorMask, glDepthMask und glStencilMask gesteuert werden welche Werte in den Framebuffer geschrieben werden sollen und welche nicht. Was genau rein geschrieben wird, kann für den Stencil Buffer wird entweder hier oder auch schon beim Stencil Test durch glStencilOp festgelegt werden.
Siehe auch: glIndexMask, glColorMask, glDepthMask, glStencilMask und glStencilOp
Frame Buffer Kontrolle
Dieser Teil übernimmt die Kontrolle über alle vorhandenen Framebuffer. Beispielsweise durch glDrawBuffer kann der aktuelle Frame Buffer gewechselt werden.
Siehe auch
ShaderModel für die Änderung an der Pipeline mit Einführung von Shadern.