prix

Stéphane Charpentier | 12/05/2005
Accès direct :

Le Vertex Pipeline - version programmable (suite)

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.

Image
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.
 
 
 

Actualités relatives Cartes graphiques