Les shaders sous OpenGL pour Android

 

 

Dans OpenGL, les données qui vont premettre de produire une image 3D sont classiquements injectées dans un pipeline. Voici un schéma simplifié de ce pipeline:

Image non trouvée !

Durant l'évolution de ces données dans ce pipeline jusqu'au rendu final, celles-ci pourront subir des tranformations, voire de nouvelles données pourront être ajoutées.

Ces phases de transformations de données vont déclencher des micros-programmes: les shaders.

Ils permettent d'intervenir plus finement sur le rendu d'une image 3D à des phases bien précises. A tel point que cette intervention permettra par exemple d'exécuter un shader directement lors du traitement d'un pixel !

Un shader s'exécute au niveau de la carte graphique. Le CPU est donc soulagé de cette tâche car c'est le GPU qui va exécuter ce programme.

Le langage de programmation est le GLSL (pour OpenGL Shading Language). Il s'agit d'un langage ressemblant à du C créé par l'OpenGL ARB (OpenGL Architecture Review Board) afin de permettre aux développeurs d'avoir un contrôle directe du pipeline graphique le tout sans avoir à utiliser l'ARB assembly language (sorte de langage assembleur).

Il faudra passer par les phases de compilation/linkage comme pour la plupart des langages de programmation. Mais il y aura tout de même une différence avec les autres ! Là où vous livrez habituellement un code exécutable, ici il faudra fournir le source qui sera compilé et linké à la volé !

Cependant, ne cherchez pas de compilateur ou de linker à installer avec vos outils de développement, ceux-ci sont fournis directement avec OpenGL (plus exactement les constructeurs de cartes graphiques au niveau des pilotes pour OpenGL) !

Un shader s'exécutant sur le GPU, encore faut-il que celui-ci puisse le faire. Il faudra donc tester la compatibilité de la carte graphique avec les shaders.

Enfin, une notion importante à comprendre: Les shaders ne s'exécutent pas en même temps que vos traitements OpenGL ! Ceux sont deux environnements différents.

 

- Le langage GLSL

- Les différents types de shader

- Compiler/linker le source

- Exécuter un shader

 

Annexes

 

OpenGL sur différentes plateformes

De la documentation sur les shaders (en Anglais):https://www.opengl.org/documentation/glsl/ dont OpenGL Shading Language Specification.

 

 

Voici deux solutions pour charger facilement du code GLSL à l'aide de la classe helper OpenFileGLSLHelper.java suivante:

Image non trouvée !

public String onResourceFile (int resourceId) utilise les ressources. Stockez votre fichier texte GLSL sous res/raw. Pour rappel, l'id sera sous Android R.raw.nomfichier où nomfichier est le nom de votre fichier GLSL sans l'extension.

Si le répertoire raw n'existe pas, créez le et faîtes un clean sur le projet pour qu'éclipse le reconnaisse.

public String onAssetFile (String fileName) utilise le répertoire assets. Vous n'avez qu'à passer le nom de votre fichier en paramètre voire répertoire + fichier (exemple en créant monfichier.glsl dans un répertoire glsl sous assets, passez glsl/monfichier.glsl)