Instructions
Avoir des registres où mettre des valeurs, c'est bien, mais si on peut
les manipuler, c'est beaucoup mieux. C'est à ça que vont servir les
instructions. Il n'en existe pas beaucoup, comparé à un processeur plus
général comme un x86, mais elles sont à peu près toutes en rapport avec
la 3D ou au moins l'arithmétique. Nous n'alons pas ici énumérer toutes
les instructions, mais sachez qu'il y a des racines carrées
réciproques, des produits scalaires, des multiplications, additions,
etc.
Le fait qu'il y en ait peu est à la fois un avantage et un
inconvénient. Un avantage car la complexité des GPUs est réduite, mais
un inconvénient car cela limite également les possibilités. Cependant,
à partir des vertex shaders 2.0 et 2.x, beaucoup plus de choses peuvent
être réalisées.
Vertex shader de réflection/réfraction (nVIDIA)
Ainsi, les vertex shaders n'avaient aucune instruction permettant le
contrôle de flux. Du coup, le GPU exécutait "bêtement" les instructions
les unes après les autres. Il arrivait donc souvent que plusieurs
vertex shaders offrant des fonctionnalités quasiment identiques soient
créés, avec seulement une ou deux instructions différentes.
La possibilité de contrôler le flux des shaders a commencé avec
les
boucles, qui permettent de répéter certaines instructions plusieurs
fois. Auparavant, si l'on voulait exécuter vingt fois la même
instruction, il fallait taper l'instruction vingt fois. Avec les
boucles, il suffit de taper l'instruction une seule fois. Cela permet
également d'économiser des instructions, puisque le nombre
d'instructions est limité (bien que cette limite soit très haute avec
les derniers GPUs).
Second type de contrôle de flux,
les branchements conditionnels
permettent d'effectuer certaines instructions sous certaines
conditions, réduisant cette fois-ci le nombre de shaders différents à
écrire, plutôt que le nombre d'instructions.
Bien qu'un vertex shader soit censé traiter un vertex uniquement grâce
aux informations de ce dernier ainsi qu'aux constantes qui peuvent être
fournies au vertex shader, les vertex shaders 3.0 possèdent une
instruction capable de récupérer les informations d'une texture, chose
normalement possible uniquement dans un pixel shader. Cette instruction
est encore très peu utilisée, notamment car les cartes supportant
vertex shaders 3.0 sont peu répandues. L'utilité principale d'accéder
aux données d'une texture est de pouvoir faire du displacement mapping
de façon très simple (il est possible de faire du displacement mapping
avec les versions précédentes des vertex shaders, mais c'est plus
compliqué et demande plus de ressources).
Versions
On entend souvent parler de "Shader Model 3.0" et autres termes
relatifs aux shaders. De manière générale, "shader model" signifie
simplement vertex ET pixel shader. Les versions, quant à elles, sont
assez nombreuses. Dans ce chapitre nous ne nous occuperons évidemment
que des vertex shaders, les pixel shaders viendront plus tard.
Les cartes supportant les vertex shaders supportent au minimum les
versions 1.0 et 1.1. La version 1.0 est d'ailleurs pratiquement tombée
dans l'oubli. La version 1.1 ne fait qu'ajouter quelques instructions
(qu'il était possible d'effectuer avec la version 1.0, d'une façon un
peu détournée). Cette version correspond aux débuts des vertex shaders,
qui n'étaient qu'une suite d'instructions assez simple, sans contrôle
de flux, mais capables de réaliser pas mal de choses. Cette version
correspond à DirectX 8.
Ensuite sont venus plus ou moins en même temps, avec DirectX 9, les
vertex shaders 2.0, 2.x et 3.0. Les vertex shaders 2.0 possèdent plus
d'instructions, plus de registres, et le support des boucles. Ceci
permet de réaliser des shaders légèrement plus complexes, tout en
simplifiant leur création.
Les vertex shaders 2.x sont un peu spéciaux, et font le lien entre les
vertex shaders 2.0 et 3.0. Ainsi, les vertex shaders 2.x correspondent
aux vertex shaders 2.0 auxquels sont ajoutées la plupart des
fonctionnalités des shaders 3.0, mais de manière optionnelle. Ainsi,
une carte supportant toutes les options des vertex shaders 2.x est en
quelque sorte une carte supportant les vertex shaders 3.0. Parmi ces
nouvelles fonctionnalités, on trouve notamment de nouvelles
instructions au niveau du contrôle de flux.
Enfin, les vertex shaders 3.0 correspondent plus ou moins aux vertex
shaders 2.x, avec toutes les options disponibles, et une instruction de
plus permettant d'accéder aux données disponibles dans les textures,
comme expliqué un peu plus haut.
Les nouvelles versions des vertex shaders n'arriveront pas dans
l'immédiat, ce qui n'est pas une mauvaise chose, et ce pour plusieurs
raisons. Non seulement la dernière version offre de très nombreuses
possibilités, mais les développeurs ont du mal à suivre, avec sur le
marché des cartes supportant trois versions différentes des vertex
shaders.