Feste Funktionspipeline: Unterschied zwischen den Versionen

Aus DGL Wiki
Wechseln zu: Navigation, Suche
K (kommas gesetzt)
K (Rechtschreibfehler korrigiert)
 
(13 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
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
  
 
= Vertex Pipeline =
 
= Vertex Pipeline =
[[Bild:VertexPipeline.GIF]]
+
[[Bild:VertexPipeline.GIF|framed|right|Die Vertexpipeline]]
  
 
== Eingabe Konvertierung ==
 
== Eingabe Konvertierung ==
Zeile 11: Zeile 11:
  
 
== [[Modelview]] Muliplikation ==
 
== [[Modelview]] Muliplikation ==
Der [[Vertex]] wird mit der im [[Modelview]] [[Matrix]] Stack oben aufliegenden Matrix multipliziert.<br>
+
Der [[Vertex]] wird mit der im [[Modelview]] [[Matrix]] [[Stack]] oben aufliegenden Matrix multipliziert.<br>
 
Siehe auch: [[glMatrixMode]], [[glPushMatrix]], [[glPopMatrix]], [[glTranslate]], [[glScale]], [[glRotate]], [[glMultMatrix]], [[glLoadMatrix]], [[glLoadIdentity]]
 
Siehe auch: [[glMatrixMode]], [[glPushMatrix]], [[glPopMatrix]], [[glTranslate]], [[glScale]], [[glRotate]], [[glMultMatrix]], [[glLoadMatrix]], [[glLoadIdentity]]
  
Zeile 42: Zeile 42:
  
 
== Z Anpassung ==
 
== 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.<br>
+
Hier wird der zuerst im Bereich [-1|1] liegende z Teil des [[Vertex]] auf den für den [[Tiefenpuffer|Z Buffer]] benötigten Bereich [0|1] gescaled.<br>
 
Siehe auch: [[glDepthRange]]
 
Siehe auch: [[glDepthRange]]
  
== [[Polygon]] [[Culling]] ==
+
== [[Polygon]] [[Backface Culling|Culling]] ==
Das Front- oder Backface [[Culling]] findet hier statt.<br>
+
Das [[Backface Culling|Front- bzw. Backface Culling]] findet hier statt.<br>
 
Siehe auch [[glFrontFace]], [[glCullFace]]
 
Siehe auch [[glFrontFace]], [[glCullFace]]
  
Zeile 55: Zeile 55:
 
== Rasterizer ==
 
== Rasterizer ==
 
Hier werden aus dem Primitiv die Fragmente berechnet.
 
Hier werden aus dem Primitiv die Fragmente berechnet.
 +
 +
<br>
 +
<br>
  
 
= Fragment Pipeline =
 
= Fragment Pipeline =
[[Bild:FragmentPipeline.png]]
+
[[Bild:FragmentPipeline.png|framed|right|Die Fragmentpipeline]]
  
 
== Rasterizer ==
 
== Rasterizer ==
Zeile 79: Zeile 82:
 
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 bei geclippten 3ecken nicht richtig gesetzt (siehe [[glEdgeFlag]] und [[Clipping Plane]]).
+
{{Warnung|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>
 
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]]
 
Siehe auch: [[glEnable]], [[glDisable]], [[glPolygonOffset]] und [[glPolygonStipple]]
  
== Texel Generierung ==
+
== [[Texel]] Generierung ==
 
Berechnung der Farbwerte der Texel. Hier werden für eine [[Trilineare Filterung]] zuerst die beiden [[Mipmap|Mipmaps]] welche verwendet werden sollen berechnet, danach werden die 8 umliegenden Texel (4 in jedem Mipmap) entsprechend interpoliert.<br>
 
Berechnung der Farbwerte der Texel. Hier werden für eine [[Trilineare Filterung]] zuerst die beiden [[Mipmap|Mipmaps]] welche verwendet werden sollen berechnet, danach werden die 8 umliegenden Texel (4 in jedem Mipmap) entsprechend interpoliert.<br>
 
Siehe auch: [[glGenTextures]], [[glDeleteTextures]], [[glTexImage1D]], [[glTexImage2D]], [[glTexImage3D]], [[glTexSubImage1D]], [[glTexSubImage2D]], [[glTexSubImage3D]], [[gluBuild1DMipmaps]], [[gluBuild2DMipmaps]], [[glTexParameter]], [[glEnable]], [[glDisable]] und [[glBindTexture]]
 
Siehe auch: [[glGenTextures]], [[glDeleteTextures]], [[glTexImage1D]], [[glTexImage2D]], [[glTexImage3D]], [[glTexSubImage1D]], [[glTexSubImage2D]], [[glTexSubImage3D]], [[gluBuild1DMipmaps]], [[gluBuild2DMipmaps]], [[glTexParameter]], [[glEnable]], [[glDisable]] und [[glBindTexture]]
Zeile 109: Zeile 112:
  
 
== Alpha Test ==
 
== 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.<br>
+
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.<br>
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glAlphaFunc]]
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glAlphaFunc]]
  
 
== Stencil Test ==
 
== 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.<br>
+
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.<br>
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glStencilFunc]]
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glStencilFunc]]
  
 
== Tiefen Test ==
 
== 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.<br>
+
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.<br>
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glDepthFunc]]
 
Siehe auch: [[glEnable]], [[glDisable]] und [[glDepthFunc]]
  
 
== Blending ==
 
== 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.<br>
+
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.<br>
Siehe auch [[glEnable]], [[glDisble]], [[glBlendFunc]] und [[GL_ARB_imaging]]
+
Siehe auch [[glEnable]], [[glDisable]], [[glBlendFunc]] und [[GL_ARB_imaging]]
  
 
== [[Dithering]] ==
 
== [[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.<br>
+
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 Fensterposition und Farbwert), was die Berechnungsmöglichkeiten etwas einschränkt.<br>
 
Siehe auch: [[glEnable]]( GL_DITHER ), [[glDisable]], [[Antialiasing]] und [[Dithering]]
 
Siehe auch: [[glEnable]]( GL_DITHER ), [[glDisable]], [[Antialiasing]] und [[Dithering]]
  
Zeile 133: Zeile 136:
  
 
== Farb Maskierung ==
 
== 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.<br>
+
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 entweder hier oder auch schon beim Stencil Test durch [[glStencilOp]] festgelegt werden.<br>
 
Siehe auch: [[glIndexMask]], [[glColorMask]], [[glDepthMask]], [[glStencilMask]] und [[glStencilOp]]
 
Siehe auch: [[glIndexMask]], [[glColorMask]], [[glDepthMask]], [[glStencilMask]] und [[glStencilOp]]
  
 
== Frame Buffer Kontrolle ==
 
== Frame Buffer Kontrolle ==
Dieser Teil übernimmt die Kontrolle über alle vorhandenen [[Frame Buffer]]. Beispielsweise durch [[glDrawBuffer]] kann der aktuelle Frame Buffer gewechselt werden.
+
Dieser Teil übernimmt die Kontrolle über alle vorhandenen [[Framebuffer]]. Beispielsweise durch [[glDrawBuffer]] kann der aktuelle Frame Buffer gewechselt werden.
Siehe auch: [[SwapBuffers]] und [[glDrawBuffers]]
+
 
 +
 
 +
 
 +
== Siehe auch ==
 +
 
 +
[[SwapBuffers]] und [[glDrawBuffer]]
 +
 
 +
[[ShaderModel]] für die Änderung an der Pipeline mit Einführung von [[Shader]]n.
  
 
== Ressourcen ==
 
== Ressourcen ==
[http://www.opengl.org/documentation/specs/version1.1/state.pdf OpenGL 1.1 State Machine (PDF)]
+
<ul>
[http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf OpenGL 1.2.1 Specification (PDF)]
+
<li>[http://www.opengl.org/documentation/specs/version1.1/state.pdf OpenGL 1.1 State Machine (PDF)]</li>
 +
<li>[http://www.opengl.org/documentation/specs/version1.2/opengl1.2.1.pdf OpenGL 1.2.1 Specification (PDF)]</li>
 +
</ul>

Aktuelle Version vom 15. Juli 2011, 21:31 Uhr

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

Es Fehlt Matrix Kontrolle, Feedback, Eingabe Konvertierung, Lighting und Texture Koordinaten generierung.

Incomplete.jpg

Fixe Funktionspipeline für OpenGL 1.1

Vertex Pipeline

Die Vertexpipeline

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

Die Fragmentpipeline

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.

Warnung.png 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 Fensterposition 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 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

SwapBuffers und glDrawBuffer

ShaderModel für die Änderung an der Pipeline mit Einführung von Shadern.

Ressourcen