Présentation des précurseurs
Comme souvent dans l’industrie les révolutions annoncées à grand renfort de marketing n’en sont jamais véritablement : en général il s’agit de récupérer des recherches universitaires ou d’intégrer dans des produits grands publics des innovations apparues quelques années plus tôt dans le monde professionnel. Le concept de HLSL n’échappe pas à la règle, en effet la notion de langage de shading est apparue initialement avec RenderMan.
RenderMan est une interface de description de scènes 3D créée par Pixar qui a été largement utilisée au cinéma. Cette interface permet essentiellement de définir une scène 3D, d’y placer objets, sources de lumières et caméras mais RenderMan ne s’arrête pas là et a introduit aussi la notion de « shaders ». Les shaders sont en fait des procédures écrites dans un langage appelé RenderMan Shading Language permettant d’adapter le rendu à des besoins spécifiques non pris en compte par l’interface de base.
Les shaders RenderMan sont de trois types :
- Les shaders de source lumineuse qui calculent la couleur de la lumière émise depuis un point sur la source lumineuse jusqu’à un point sur la surface illuminée.
- Les shaders de surface, utilisés pour modéliser les propriétés optiques des matériaux de la surface.
- Les shaders de volume qui modulent la couleur d’un rayon de lumière traversant un volume.
Les avantages d’un langage dédié sont certes attractifs, mais ne suffisent pas à contrebalancer les défauts dans un environnement temps réel et un langage comme RenderMan n’est adapté ni aux postulats des API, ni au hardware sous jacent, ce qui en soit se comprend tout a fait car il n’a pas été conçu dans cet optique. Sans compter qu’un langage de trop haut niveau rend difficile d’appréhender l’impact d’une opération particulière sur les performances. Enfin l’abstraction offerte par le langage aurait pu être perçue comme bridant les programmeurs, les obligeant à se conformer à un moule ne convenant par forcément à leurs besoins. L’ancêtre des HLSL commerciaux est donc à chercher ailleurs.
Le véritable inspirateur des HLSL commerciaux tels que nous les connaissons est donc plus le Stanford Shading Language. Ce projet qui a débuté en 1999, donc bien avant l’apparition des shaders dans nos cartes 3D, était initialement conçu pour permettre de mieux tirer profit des possibilités offertes par le rendu multi passes. Il se situe donc comme une couche d’abstraction supplémentaire entre le programmeur et la carte 3D au dessus de l’API (en l’occurrence OpenGL) et en offrant une virtualisation des ressources.
La première version ressemblait à un langage de type Lisp et n’était dédié qu’à la programmation des fragments mais devant les limitations qu’elle présentait elle fut rapidement étendue à plusieurs niveaux de traitement et le langage fut remplacé par une version inspirée du C.
Désormais le langage permet d’opérer au niveau des constantes (évaluées à la compilation), au niveau des groupes de primitives, au niveau des sommets et au niveau des fragments.

La compilation des shaders se fait en deux étapes de la façon suivante :
- Les shaders de surface et de source lumineuse (en inspiration directe de RenderMan) sont tout d’abord compilés dans un langage intermédiaire offrant une nouvelle forme d’abstraction appelée pipeline programs. Les pipeline programs sont de trois sortes chacun opérant à un niveau de fréquence différent (par groupe de primitives, par sommet, par fragment).
- Ces pipeline programs sont à leurs tours compilés en un code exécutable par le hardware en fonction de la cible (par exemple les programmes opérant sur les groupes de primitive seront compilés pour être exécutés par le CPU, les programmes opérant sur les sommets seront compilés pour être exécutés soit par le CPU soit par l’unité de vertex shader, les programmes opérant sur les fragments seront compilés pour être exécutés par les Registers Combiners ou par le hardware de multitexturing classique).
