Die High-Level Shading Language (HLSL) ist die Shader-Sprache von Microsoft für Direct3D. Sie entstand ab 2002 mit DirectX 9, als die feste Render-Pipeline durch programmierbare Shader ersetzt wurde, und wurde gemeinsam mit Nvidias Cg entwickelt — beide Sprachen sind C-ähnlich und teilen viele Konzepte. Seit Direct3D 10 ist HLSL die Pflicht-Sprache der einheitlichen Shader-Pipeline und wird bis heute in Direct3D 12 eingesetzt.
Shader-Modelle
HLSL-Features werden über Shader-Modelle (SM) gestuft, die an die DirectX-Version gekoppelt sind:
- SM 2.0/3.0: DirectX 9, erste voll programmierbare Pixel-/Vertex-Shader
- SM 5.0: DirectX 11, Tessellation und Compute-Shader
- SM 6.x: DirectX 12, u. a. SM 6.5 mit Raytracing (DXR) und Mesh-Shadern
Grundgerüst
HLSL arbeitet mit Semantics (z. B. POSITION, SV_Position, SV_Target), die Datenströme zwischen Pipeline-Stufen verbinden. Konstante Daten liegen in Constant Buffers.
cbuffer ConstantBuffer : register(b0) {
float4x4 WorldViewProjection;
};
struct VS_INPUT {
float3 pos : POSITION;
};
float4 main(VS_INPUT input) : SV_Position {
return mul(float4(input.pos, 1.0), WorldViewProjection);
}
Wichtige Bausteine
- Typen:
float2/float3/float4,float4x4,Texture2D,SamplerState - System-Values:
SV_VertexID,SV_InstanceID,SV_IsFrontFace,SV_Depth— erzeugt die Hardware selbst - Intrinsics:
mul,lerp,saturate,dot,normalize, Texturabtastung mitSample - Kontrollstrukturen wie in C:
if,for,while,switch,discard
Compiler
Der klassische Compiler fxc.exe erzeugt DXBC und unterstützt bis Shader Model 5.1. Der moderne Open-Source-Compiler DXC (DirectXShaderCompiler, LLVM-basiert) übersetzt HLSL nach DXIL und kann zusätzlich SPIR-V für Vulkan ausgeben.
HLSL ist das DirectX-Pendant zu GLSL (OpenGL) und teilt sich mit Cg (Nvidia) die C-ähnliche Basis. Was eine GPU dabei leistet und wie der Grafikspeicher VRAM genutzt wird, erklären die verlinkten Artikel.