g80gl

Alors que NVidia ne fournit pas encore de pilote pour DirectX 10 (donc windows Vista, seul système à supporter cette version de DirectX qui introduit l’ensemble des nouvelles fonctionnalités), il
propose déjà une série d’extensions OpenGL exposant toutes les nouvelles capacités du GPU.

Je vais décrire rapidement ce qui me semble intéressant dans ce que j’ai lu de ces extensions dans les specs de NVidia (http://developer.nvidia.com/ object/nvidia_opengl_specs.html ).

Geometry Shader.

L’architecture G80 fournit l’ajout au pipeline 3D (devenu virtuel) d’une nouvelle étape programmable : Le Geometry Shader. Cette étape se situe après le vertex shader et avant le clipping, l’assemblage puis la rasterisation. Elle prend en entrée les primitives (point, ligne triangle) pour lesquelles elle peut accéder aux informations de sommets pour fournir en sortie un ensemble de nouvelles primitives. De nouveaux types de primitives ont été introduits permettant de passer au shader les sommets adjacents d’une primitive afin de les utiliser pour générer les nouvelles primitives.

L’extension EXT_geometry_shader4 ajoute cette fonctionnalité à GLSL alors que l’extension NV_geometry_program4 la fournit via un langage assembleur similaire à celui employé par ARB_vertex_program et ARB_fragment_program.

Shaders Model 4.

La révision 4 du modèle des shaders telle qu’elle est décrite dans Direct X 10 et implémentée sur le G80 est exposée dans OpenGL via les extensions EXT_gpu_shader4
(pour le GLSL) et NV_gpu_program4 (pour l’assembleur NVidia). Elles fournissent ainsi un jeu d’instructions unifiées pour l’ensemble des shaders qui supportent maintenant tous totalement les branchements dynamiques par exemple ou l’accès aux textures sans restrictions.

Cette révision ajoute principalement la gestion totale des entiers pour les opérations arithmétiques et logiques, les attributs, ainsi que pour l’adressage dans les textures et l’accès aux valeurs stockées en entiers (gestion via l’extension EXT_texture_integer).

Un nombre plus important d’attributs peuvent être passés entre vertex shader et fragment shader. Le fragment shader a maintenant également la possibilité de choisir le mode d’interpolation des attributs qu’il reçoit.

Transform Feedback.

(NV_transform_feedback)

Il s’agit de l’implémentation OpenGL de la fonction de stream output de DirectX 10. Elle permet de récupérer (dans un buffer object) les attributs de sommets générés par le vertex shader ou le
geometry shader plutôt que ceux-ci soient envoyés pour assemblage et rasterisation. Elle permet ainsi de désactiver l’étape de rasterisation du pipeline. Les données une fois dans un buffer object peuvent être réutilisés comme vertex buffer, pixel buffer, texture buffer ou parameter buffer object (cf. plus loin).

Texture Array.

(EXT_texture_array)

Cette extension introduit la notion de tableau ou empilement de textures 1D et 2D. Un tableau de texture est accédé comme une unique unité de texture dans un shader via un vecteur à 2 ou 3
composantes. Pour un tableau de textures 2D, la coordonnée “r” correspond ainsi au niveau de la texture désirée dans l’empilement et “s”-”t” à la coordonnée 2D du pixel dans la texture. La différence entre un tableau de textures 2D et une texture 3D est que le tableau ne supporte pas le filtrage trilinéaire entre couches mais supporte par contre, au contraire des textures 3D, le rendu vers une couche (via framebuffer object). Ceci est du au mode de stockage interne des tableaux optimisées pour être une cible de rendu efficace qui diffère de celui des textures 3D qui sont
optimisées pour un accès et un filtrage efficace.

Texture Buffer Object.

(EXT_texture_buffer_object)

Ce buffer object (sur le même modèle que Vertex et Pixel Buffer Object) fournit un nouveau binding/type de texture appelé TEXTURE_BUFFER_EXT qui vient s’ajouter aux textures 1D, 2D, 3D, CUBE et
rectangles. Ce type permet d’utiliser sans recopie un buffer object (vertex, pixel, transform feedback) attaché au binding en spécifiant le format à utiliser pour en interpréter les données. Il comprend par contre un grand nombre de restrictions : pas de mipmapping, pas d’accès via des coordonnées normalisées, pas de filtrage. Il ne peut pas non plus être utilisé par les fonctions fixes de traitement de fragments. Il est accédé via un nouveau type de sampler dans les shaders.

Ce buffer est donc principalement dédié à faire du calcul générique.

Parameter Buffer Object.

(NV_parameter_buffer_object)

Ce buffer object fournit un nouveau type de paramètres constants pour les shaders. Ces paramètres similaires aux paramètres uniformes peuvent ainsi etre spécifiés par lots à partir de n’importe quel buffer object et interprétés dans le shaders comme une suite de mots 32bits ou de vecteurs à 4 composantes. Le nombre de paramètre pouvant être spécifié est sans doute limité par contre (je n’ai pas encore trouvé de chiffre) et il va falloir voir ce que ca donne niveau efficacité.

Instanciation de Vertex Array.

(EXT_draw_instanced)

Permet de rendre plusieurs fois le même vertex array en un seul appel. Un identifiant d’instance est ajouté et permet au vertex et geometry shader de savoir de quelle instance est issue la primitive reçue.


Extension des Draw Buffers (MRT)

(GL_EXT_draw_buffers2)

Permet d’activer et de désactiver le blending et de choisir un color mask indépendamment pour l’ensemble des buffers utilisés simultanément.

Nouveaux formats de textures et de framebuffers

- Format RGB flottant compact (de taille totale 32bits) avec exposant partagé (EXT_texture_shared_exponent).

- Format RGB flottant 32bits compact (EXT_packed_float)

- Formats de compression de textures (EXT_texture_compression_latc et EXT_texture_compression_rgtc)

- Format de depth buffer et depth textures flottants (NV_depth_buffer_float).

- Format de framebuffer IEC sRGB (EXT_framebuffer_sRGB)

- Extension du multi-sampling pour le contrôle du multi-sampling de primitives blendées (GL_NV_framebuffer_multisample_coverage). Je n’ai pas encore bien vu comment ça marche ni a quoi ça sert vraiment.