Feste Funktionspipeline: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (Texel Generierung)
(3ecke)
Zeile 66: Zeile 66:
 
Mit GL_POLYGON_SMOOTH kann hier das Antialiasing erreicht werden.
 
Mit GL_POLYGON_SMOOTH kann hier das Antialiasing erreicht werden.
  
ACHTUNG! 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 nicht richtig behandelt (siehe [[glEdgeFlag]]).
+
ACHTUNG! 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.<br>Siehe auch: [[glEnable]], [[glDisable]], [[glPolygonOffset]] und [[glPolygonStipple]]
 
Mit [[glPolygonStipple]] kann man auch hier das erzeugen von Fragmenten verhindern werden. Gegebenenfalls wird die Tiefe (Z-Wert) noch mit [[glPolygonOffset]] modifiziert.<br>Siehe auch: [[glEnable]], [[glDisable]], [[glPolygonOffset]] und [[glPolygonStipple]]

Version vom 26. September 2004, 18:42 Uhr

Hinweis: Dieser Artikel ist noch unvollständig.
(Mehr Informationen/weitere Artikel)

{{{1}}}

Incomplete.jpg

Fixe Funktionspipeline für OpenGL 1.1

Vertex Pipeline

VertexPipeline.GIF

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- oder 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

FragmentPipeline.png

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.

ACHTUNG! 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 glAphaFunc 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 Frame Buffer 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 Frame Buffer 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 Frame Buffer an der Fragmentposition anhand der oder des Alphawertes und der mit glBlendFunc angegebenen Funktion interpoliert.
Siehe auch glEnable, glDisble, 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 Frame Buffer 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 Frame Buffer. Beispielsweise durch glDrawBuffer kann der aktuelle Frame Buffer gewechselt werden. Siehe auch: SwapBuffers und glDrawBuffers