IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Les shaders dans OpenGL

Introduction à la programmation de shaders GLSL

Les shaders dans OpenGL

Introduction la programmation de shaders GLSL


prcdentsommairesuivant

1. Introduction

Les shaders sont des programmes excuts par la carte graphique afin de calculer le rendu des pixels l'cran. Ce tutoriel a pour but d'expliquer le fonctionnement des shaders et leurs utilisations dans un programme OpenGL. Les seuls pr-requis dont vous avez besoin sont de savoir ouvrir une fentre OpenGL (avec WinAPI ou encore SDL ou Glut) et de connatre le fonctionnement des extensions (notamment si vous travaillez sous Windows). Il est aussi conseill de savoir ce qu'est le pipeline graphique utilis dans OpenGL, mais je reviendrai dessus un peu plus tard.

Vous pouvez tlcharger le projet de base (Code::Blocks / Windows) permettant l'affichage d'un cube rotatif en 3D utilisant des shaders en cliquant iciProgramme OpenGL basique pour travailler avec les shaders

1-A. Historique

1-A-1. Pipeline fixe

Durant les annes 1990, les premires cartes graphiques ddies capables de gnrer des images 3D en temps rel ont vu le jour. Par la mme occasion, les bibliothques OpenGL et DirectX ont t cres. cette poque, le pipeline graphique permettant d'afficher le rendu tait fixe. Le diagramme suivant dcrit ce pipeline :

Pipeline fixe
Pipeline fixe (Source: http://www.khronos.org/ )

Avec le pipeline fixe, les constructeurs de cartes graphiques peuvent optimiser le calcul de toutes ces tapes en crant un matriel spcifiquement conu pour cette tche.

Par contre, comme son nom l'indique, le pipeline fixe est statique, l'utilisateur ne peut pas modifier un des algorithmes utiliss.

1-A-2. Pipeline dynamique

Au fur et mesure des besoins, notamment dans les productions professionnelles telles que les films d'animation, le pipeline fixe se trouve trs limitant. La solution tait soit d'utiliser le CPU pour appliquer les algorithmes voulus, processus trs lent sachant que le CPU n'est pas spcialement optimis pour de telles tches, soit d'utiliser des cartes graphiques professionnelles ayant de nouveaux algorithmes ou mme des algorithmes pouvant tre modifis. Avec la forte demande des professionnels tels que les socits de films d'animation mais aussi les dveloppeurs de jeux vido, les cartes configurables sont devenues monnaie courante. Ce nouveau pipeline graphique est prsent dans le diagramme suivant :

Pipeline dynamique
Pipeline dynamique (Source: http://www.khronos.org/ )

Les blocs vertex shader et fragment shader sont ceux que nous pouvons programmer.

L'avantage de ce nouveau pipeline est de pouvoir intgrer notre propre algorithme pour dfinir le rendu voulu. Grce cela, une multitude d'effets ont pu voir le jour, tels que le Cell Shading, le bump mapping mais aussi l'implmentation de nouvelles techniques pour le calcul des lumires et des ombres.

La carte graphique est moins optimise en comparaison celle conue pour un pipeline fixe, mais le fait de pouvoir dfinir un algorithme prcis la place d'un algorithme plus gnraliste est un avantage.

Souvent les cartes graphiques supportant les shaders et le pipeline fixe, utilisent simplement des shaders pour reproduire le comportement du pipeline fixe.

1-A-3. volution du pipeline dynamique

Du point de vue des bibliothques graphiques, les shaders ont t intgrs partir d'OpenGL 2.0 (OpenGL 1.4 par le biais des extensions) et dans DirectX 8. Depuis ce temps, les langages des shaders ne font qu'voluer pour devenir de plus en plus puissants et performants.

Pour chaque version diffrente de shader, nous parlons de modles de shader (shader models (SM)). Il est possible de prciser la version que nous voulons utiliser dans notre shader. Nous verrons comment faire cela un peu plus loin.

Rapide historique (je ne citerai que les cartes des constructeurs ATI et NVidia):

Anne Version des shaders DirectX OpenGL ATI Nvidia Info
2001 SM 1.x DirectX8 OpenGL 2.0 Radeon R200 Geforce sries 3
2003 SM 2.x DirectX9.0 Radeon R300 / R420 Geforce FX
2004 SM 3.0 DirectX9.0c Radeon R520 Geforce sries 6 / 7
2006 SM 4.0 DirectX10 OpenGL 3.2 Radeon R600 Geforce sries 200 / 300 Apparition des Geometry Shader
2009 SM 5.0 DirectX11 OpenGL 4.1 Radeon R800 Geforce sries 400 Tesselation

1-B. Explication

Un shader est un programme que l'on excute directement dans le cœur mme de la carte graphique. La carte est optimise pour tous les calculs ncessaires la 3D (tels que la multiplication de matrices). Grce aux shaders, certaines parties de la carte graphique sont programmables et nous pouvons en faire ce que nous voulons. Par exemple, dans le pipeline fixe, nous n'avions que huit sources de lumire. En reprogrammant l'algorithme utilis pour le calcul des lumires nous pouvons imaginer l'intgration d'une neuvime lumire. De plus, nous pouvons mme changer l'algorithme afin de crer un effet totalement diffrent de ce que nous forait le constructeur.

  • Le vertex shader est excut pour chaque sommet.
  • Le fragment shader est excut sur chaque pixel dessin.

1-C. Fonctionnement

Comme il a t dit, nous allons pouvoir programmer directement nos cartes graphiques. Pour cela de nouveaux langages ont t invents. Au tout dbut, c'tait un assembleur spcialis pour les cartes graphiques. Pour OpenGL, le langage s'appelle le GLSL pour OpenGL Shading Language (langage de shading pour OpenGL) et pour DirectX, le HLSL pour High Level Shading Language (langage de shading de haut niveau).

Comme nous l'avons vu dans le diagramme du pipeline dynamique, nous avons besoin des blocs Vertex Shader et Fragment Shader pour reconstituer le processus complet de rendu. Cela signifie qu'il va falloir dvelopper deux programmes et que ceux-ci vont suivre un processus similaire la cration d'un programme, qui est compos de:

  • deux compilations ;
  • une dition de liens.

Il y a deux compilations, car nous devons compiler le Vertex Shader et le Fragment Shader. Par contre ils sont lis ensembles pour constituer un programme (Program Shader), ce qui reconstituera l'ensemble de notre pipeline graphique.

Il est tout fait possible de charger plusieurs Program Shader dans un programme OpenGL, mais il n'est pas possible d'en utiliser plusieurs pour le mme objet dessiner.


prcdentsommairesuivant

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2011 Alexandre Laurent. Aucune reproduction, même partielle, ne peut être faite de ce site ni de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.