# High Level Shading Language

High Level Shading Language (HLSL) ist eine für DirectX entwickelte Programmiersprache, die für die Programmierung von Shader-Bausteinen eingesetzt wird. Gelegentlich wird auch die gesamte Gruppe der höheren Programmiersprachen für Shader als HLSL bezeichnet.

## Aufgabe

Unter „Shading“ versteht die Computergrafik die Veränderung einzelner Vertices bzw. Fragmente innerhalb der Grafikpipeline. Dabei wird möglichst hardwarenah gearbeitet, was lange die Verwendung von Assembler nötig machte. Die Programmierung mit Assembler ist jedoch recht unpraktisch, fehleranfällig und vom Hardwarehersteller abhängig. Diesen Umstand sollen High Level Shading Languages beheben. Sie stellen hochsprachliche Strukturen zur Verfügung, die die Programmierung vereinfachen und damit dem Programmierer ermöglichen, sich auf sein Ziel zu konzentrieren. Ein Compiler übersetzt den Code der Hochsprache in Maschinensprache für den Grafikprozessor. Die DirectX-spezifische Hochsprache HLSL wird zur Laufzeit der Applikation von der DirectX-Bibliothek mit Hilfe des Grafiktreibers in die für die aktuelle Grafikhardware geeignete Assemblersprache übersetzt. Unterschiedliche Shader für Nvidia- oder ATI/AMD-Grafikkarten sind damit nicht mehr notwendig.

## Sprach-Elemente

HLSL bietet keine OOP-Ansätze wie andere Sprachen. Es ist stark an C orientiert, stellt aber für die Shader-Programmierung optimierte Datentypen und Operationen zur Verfügung.

### Globale Shader-Parameter

Parameter, die an einen Shader übergeben werden, stehen in HLSL global im kompletten Code zur Verfügung. Sie werden außerhalb von Methoden oder Structs geschrieben, meist zu Beginn des Codes.
Für die Bedeutung der obigen Matrizen siehe den Artikel Grafikpipeline.

### Eingabe und Ausgabe des Vertex-Shaders

Statt jeden Parameter einzeln in die Parameterliste einer Shader-Methode zu schreiben, sind in der Praxis einheitliche Structs üblich. Dies spart Schreibarbeit und schafft mehr Übersichtlichkeit. Im Prinzip können beliebige Werte und Vektoren mit der Eingabestruktur übergeben werden, eine Position ist aber fast immer dabei.
Der „In-Struct“ gibt die Datenstruktur an, wie sie vom Drahtgittermodell an den Shader gereicht wird, also an den VertexShader. Dieser verarbeitet die Daten und gibt einen „Out-Struct“ als Rückgabetyp zurück. Dieser wird dann an den PixelShader weitergereicht, der am Ende nur noch einen float4 oder ähnliches zurückgibt, mit der endgültigen Pixelfarbe.

### Vertex/Pixel Shader Methode

Für Vertex-Shader und Pixel-Shader muss eine Methode vorhanden sein. Diese nimmt eine Datenstruktur auf und verarbeitet sie entsprechend. Der Vertex-Shader wird einmal für jeden Vertex aufgerufen, der Pixel-Shader einmal pro zu renderndem Texturpixel.

### Geometrie-Shader

Die Implementierung eines Geometry-Shaders ist optional und ermöglicht es, ein Primitiv auf 0 bis n neue Primitive abzubilden. Die Art der Ausgabe-Primitive sowie die Maximalanzahl der produzierten Vertices muss allerdings zur Übersetzungszeit bekanntgegeben werden. Die Implementierung erfolgt hier prozedural und verwendet eigens dafür eingeführte Datenstrukturen (PointStream<T>, LineStream<T> und TriangleStream<T>).
Weiter besteht die Möglichkeit, auch auf die benachbarten Dreiecke und Linien zuzugreifen. Dies kann mit Hilfe der Input-Modifier trianglead und lineadj erreicht werden. Typische Anwendungen für Geometry-Shader sind die Generierung von Point-Sprites und das Rendern in CubeMap-Texturen. Hier ein einfacher Geometry-Shader, der jedes Dreieck, auf das er angewandt wird, zu seinen Schwerpunkt hin verkleinert:

### Techniken

Zuletzt müssen die definierten Methoden in Form von Techniken und Durchläufen zugeordnet werden, damit sie vom Compiler entsprechend umgesetzt werden. Die Syntax der Shader hat sich mit DirectX 10 geringfügig geändert, daher wird die Zielversion auch bei der Technik nochmal explizit angegeben.

## Alternativen

* RenderMan (Shading Language der Pixar Animation Studios)
* CG (C für Grafik)
* OpenGL Shading Language
* OpenGL ES Shading Language