\chapter{Shader in OpenGL}
    Shader sind kleine Programme die direkt auf der Hardware der Grafikkarte
    ausgeführt werden. Generell unterscheidet man zwischen Vertex- und 
    Pixelshadern, wobei erstere - wie der Name impliziert - auf den Vertices
    operieren und deren Attribute verändern können, und letztere auf
    den Bildpunkten der fertig gerenderten Szene - in der OpenGL-Terminologie
    Fragments - operieren und somit deren Farbe ändern können.

    \begin{figure}
        \centering
        \includegraphics[width=0.9\textwidth]{images/simplepipe}
        \caption{Vereinfachte Darstellung der OpenGL Visualisierungspipeline}
        \label{fig:simplepipeline}
    \end{figure}
    
    Betrachten wir zunächst einmal eine vereinfachte Abbildung der oben besprochenen 
    Visualisierungspipeline - Abbildung \ref{fig:simplepipeline} - 
    wie ordnen sich Shader dort ein?

    Die intuitive Antwort auf diese Frage ist auch die Richtige:
    Vertex Shader greifen im Schritt der Vertex Transformationen, Fragment Shader
    während der Färbung in die Pipeline ein.
    Vertex Shader ersetzen die Transformationen des statischen Teils der Pipeline, 
    Fragment Shader ersetzen den Schritt der Einfärbung der traditionellen
    Pipeline komplett.

    Wozu noch statische Transformationen und Färbungen mag man sich fragen, wo man
    doch theoretisch alles direkt per Shadern machen könnte? Diese Frage ist durchaus
    berechtigt, denn eigentlich könnten Shader durchaus die traditionellen Pipelines
    komplett implementieren, die Frage ist aber falsch gestellt: warum nicht?

    Durch das Hinzunehmen von Shadern in die Pipelines wird Legacy-Applikationen
    nicht geschadet, sie funktionieren weiterhin. Der Benutzer der nur Shader nutzen
    will kann die traditionelle Pipeline einfach ignorieren.

    Es gibt viele Möglichkeiten Shader in OpenGL zu nutzen, drei sollen an dieser
    Stelle kurz vorgestellt werden:

    \section{ARB Programs}
    Das ARB hat Mitte 2002 zwei eigene Spezifikationen zu Vertex- beziehungsweise 
    Fragment-Shadern veröffentlicht: die \emph{ARB\_vertex\_program} und
    \emph{ARB\_fragment\_program} Extensions. Diese definieren jeweils eine Art
    Pseudo-Assembler den alle konformierenden GPUs sprich Treiber implementieren müssen.

    Diese beiden Assembler sind sehr mühsam zu benutzen da sie fast keine Features bieten
    die man von Hochsprachen gewöhnt ist. Aber sie werden von fast allen Herstellern
    (und vor allem von Ati und NVIDIA) unterstützt. Außerdem zeigen sich hier
    typische Konzepte der inneren Funktion von Grafikkarten.

    \section{Cg - C for Graphics}
    Cg steht für \emph{C for Graphics} und ist eine von NVIDIA (\cite{nvidia}) entwickelte
    Hochsprache. Cg basiert - wie der Name schon andeutet - auf C und nutzt beinahe
    identische Syntax zur Deklaration von Funktionen und Variablen. Erweitert wurde diese
    Syntax allerdings um Methoden zur einfachen Behandlung von komplexen Datentypen die
    für Grafik-Anwendungen typisch sind.

    Viele Entwickler sehen in Cg die beste Alternative zur Programmierung von Shadern,
    allerdings werden die hierfür nötigen Extensions fast ausschließlich von NVIDIA-Karten
    unterstützt.

    Erwähnenswert ist diese Sprache dennoch da sie weit verbreitet ist, und da der Autor
    zur Entwicklung der Shader in diesem Dokument ein Programm aus dem \emph{Cg Toolkit} 
    (\cite{cgtk}) nutzte, den cgc (\emph{Cg Compiler}). Aufgrund der robusten Codebasis
    des NVIDIA-Treibers ist es diesem Compiler möglich verschiedene Eingabe-sprachen wie
    GLSL oder eben Cg in verschiedenste Ausgabesprachen zu wandeln.
    
    \section{GLSL - OpenGL Shader Language}
    Die \emph{OpenGL Shader Language} basiert auf ANSI C, wurde aber ebenfalls um
    Vertex- und Matrix-Typen erweitert, um einen einfacheren Umgang mit den typischen
    Operationen in Grafik-Applikationen.
    
    GLSL ist Teil der OpenGL 2.0 Spezifikation, allerdings unterstuetzen noch nicht viele
    Systeme diese Version vollstaendig. Abhilfe schaffen die beiden Extensions
    \emph{GL\_ARB\_fragment\_shader} und \emph{GL\_ARB\_vertex\_shader}.
    
    GLSL wird ebenfalls von den meisten Herstellern unterstuetzt, und ist deswegen
    der wahrscheinlichste Kandidat fuer eine Standardsprache fuer Shader in 
    OpenGL-Applikationen.
    
    
