Utilisation de la texture ping-pong

Categories:

Introduction

Ce document explique l’utilisation de textures ping-pong, technique largement employée par de nombreuses applications CPGPU, et son usage en filtrage espace-échelle (scale-space filtering) pour la postproduction.

Cette technique fait appel à un couple de surfaces de texture qu’emploie alternativement un nuanceur (shader) comme données d’entrée ou de sortie : il utilise l’une d’elles en entrée pour certains calculs, puis écrit le résultat (sortie) vers la seconde ; à l’itération suivante, la seconde texture est utilisée en entrée, tandis que le résultat est écrit vers la première. Le rôle de chacune s’inverse ainsi à chaque nouvelle itération, d’où l’appellation de « textures ping-pong ». Le rôle des deux textures concernées est analogue à celui de variables temporaires d’un programme géré sur un CPU.

Cet article est en l’occurrence axé sur la réalisation de textures ping-pong sous DirectX*. Il explique également comment s’en servir pour réaliser un filtrage espace-échelle en postproduction ou en traitement simple d’images.

Le corps de cet article explique les textures ping-pong et leur application au filtrage espace-échelle. Il se conclut par un mode d’emploi de cette technique pour l’implémentation de la transformée de Fourier rapide (algorithme FFT) sur le GPU.

En revanche, il n’aborde pas les questions de benchmarking ni d’optimisation.

Textures ping-pong

L’illustration qui suit est une représentation schématique du fonctionnement des textures ping-pong. Les ovales y représentent les nuanceurs de pixels (pixel shaders), les rectangles les textures utilisées pour les opérations ping-pong, et les flèches la direction du flux de données.

Le rastériseur fournit les données au nuanceur PS_0, qui, en sortie, alimente la Texture_0. Le nuanceur PS_1 utilise ces données en entrée et écrit le résultat en Texture_1. Le nuanceur PS_2 utilise ces données en entrée et écrit son propre résultat en Texture_0. Texture_0 et Texture_1 sont les textures ping-pong de l’exemple mentionné plus haut. On notera par ailleurs que l’on emploie ici deux nuanceurs de pixels, PS_1 et PS_2, mais, que, selon l’application, il se peut qu’un seul nuanceur emploie les textures ping-pong.

On applique cette technique à la réalisation d’une application de filtrage espace-échelle par itération sur les deux nuanceurs de pixels (PS_1 et PS_2) tout en alternant les deux textures (Texture_0 et Texture_1) comme données d’entrée et de sortie.

Filtrage espace-échelle

Le filtrage espace-échelle est expliqué en détail par Witkin[1]. Il s’agit d’une notion utilisée en traitement de l’image et du signal ainsi qu’en reconnaissance de formes. C’est une base pour la gestion des signaux d’entrée à différentes échelles, paramétrées par une variable appelée « paramètre d’échelle ». Cette représentation des signaux s’appelle « représentation espace-échelle ».

Dans le cas présent, le signal est une image. Si le résultat de l’application est une scène 3D, son rendu s’effectue en une texture, qui sert alors d’image d’entrée ; si des données d’entrée sont une image, celle-ci est alors directement chargée sous forme de texture. Ainsi, les données en entrée du processus de filtrage sont en définitive toujours une image. On utilise donc indifféremment les termes surface de texture et image, sans qu’il en résulte d’ambiguïté.

L’espace-échelle le plus couramment utilisé est l’espace-échelle linéaire, que l’on appelle aussi « gaussien ». La suite de cet article ne concerne que celui-ci, le signal d’entrée étant une image bidimensionnelle. Les termes image et texture y sont employés indifféremment.

La représentation espace-échelle fournit un jeu de représentations de la même image de base, dont on peut sélectionner n’importe laquelle à l’aide d’un seul et même paramètre (échelle). Dans l’application qui nous concerne, nous disposons d’un curseur pour sélectionner le paramètre d’échelle, à partir duquel l’application va générer une représentation espace-échelle de l’image, en effectuant la convolution de l’image I(x, y) à l’aide du filtre F(x, y, p) ci-dessous :

Dans l’équation ci-dessus, p est le paramètre d’échelle. On obtient alors différentes représentations espace-échelle d’I(x, y) en modifiant p. On remarquera que, pour p = 0, le filtre devient une opération d’identité et donne l’image initiale. Pour des valeurs positives croissantes de p, on obtient en sortie des images de plus en plus lissées.

Les noyaux gaussiens sont séparables en composants horizontaux et verticaux. En d’autres termes, le filtre bidimensionnel ci-dessus peut se séparer en deux filtres unidimensionnels :

Or un filtre séparable est moins lourd en termes de charge de traitement qu’un filtre non séparable. Dans notre implémentation, on effectue la convolution horizontale de l’image (passe horizontale), puis on réalise la convolution verticale de l’image résultante (passe verticale).

La scène d’entrée est d’abord rendue en Texture_0. Si les données de résultat sont une image, on effectue le rendu d’un polygone sur l’écran et on utilise l’image comme mappe de texture. Le nuanceur PS_0 réalise le rendu de la scène 3D ou de l’image 2D en Texture_0. Dans le cas d’une image 2D en entrée, celui-ci intervient comme un nuanceur d’échantillonnage de texture d’identité, pour amener l’image en Texture_0.

Au départ, l’image en Texture_0 est la zéroième représentation d’échelle de l’image d’entrée, ce qui correspond à p = 0 dans l’espace échelle. Dans notre implémentation, c’est à ce niveau de la représentation espace-échelle du signal que correspond la position minimale (la plus à gauche) du curseur.

Le nuanceur PS_1 prend la Texture_0 en entrée et réalise la convolution de l’image à l’aide du filtre de passe horizontale, en écrivant le résultat en Texture_1. Le nuanceur PS_2 prend la Texture_0 en entrée et réalise la convolution à l’aide du filtre de passe verticale. Le résultat de PS_2 s’écrit en Texture_0. Le résultat final de l’application des filtres (passes horizontale et verticale) s’écrit en Texture_2, ce qui correspond à la représentation espace-échelle de niveau 1 de l’image.

Selon le niveau de représentation souhaité, on répète alors autant de fois que nécessaire l’application successive de ces deux filtres. Lorsque l’on a effectué le nombre voulu de passes de floutage, les données finales sont transmises à la surface d’affichage (viewport).

L’application



La série d’images ci-dessous reprend les options possibles pour l’implémentation du filtrage espace-échelle qui nous occupe ici.

Les deux boutons de droite permettent ainsi de sélectionner en entrée une modélisation 3D ou bien une image 2D ainsi qu’un rendu en niveaux de gris ou en RVB. Dans le sens horaire en partant du haut à gauche, ces quatre images correspondent respectivement à une modélisation 3D complète, une modélisation 3D en niveaux de gris, une image en couleur et une image en niveau de gris. Elles sont rendues en zéroième échelle.

Le curseur de droite permet quant à lui de régler le niveau d’échelle de l’image à afficher, avec gradation de la gauche vers la droite. Résultat de quatre échelles différentes, les images ci-dessous illustrent l’effet du filtrage espace-échelle sur le rendu d’une modélisation 3D ainsi que d’une image 2D.

Il existe plusieurs applications de cette technique en analyse et traitement de l’image, celle-ci servant aussi dans d’autres domaines.

L’espace-échelle gaussien n’est pas la seule possibilité pour ce type de filtres, même s’il s’agit de la plus utilisée. Il se trouve en fait que c’est la méthode canonique pour les filtres espace-échelle. Si nous l’avons retenue, c’est surtout en raison de la séparabilité du filtre correspondant et parce que nous souhaitions expliquer l’usage des textures ping-pong.

Perspectives

Nous prévoyons d’utiliser ce cadre afin d’implémenter la transformée de Fourier rapide (FFT) pour une répartition optimale des charges entre le CPU et le GPU.

Nous prévoyons aussi d’employer l’algorithme FFT de Cooley-Tuckey. Outre les textures ping-pong, il nous faut également pouvoir envoyer au sous-système graphique un tableau de données en virgule flottante, ce qui est implémenté dans le cadre actuel.

Notre motivation pour la mise en place de ce cadre était de réaliser plusieurs bancs d’essai dimensionnables de nuanceurs de pixels correspondant à différentes fonctions : échantillonnage de textures de différents types, génération procédurale de textures, shaders à intensités arithmétiques élevées, etc. Or la version actuelle de ce cadre correspond à ces prémisses.

Conclusion

Cet article aborde les textures ping-pong et l’une de leurs applications, à savoir le filtrage espace-échelle. Cette implémentation est un préalable à la mise en œuvre de l’algorithme FFT sur sous-système graphique. L’article fournit l’ensemble des pièces nécessaires à cette implémentation dans le programme hôte ainsi que l’ensemble des paramètres des nuanceurs de pixels, des mappes de texture, etc. pour la mise en œuvre de l’algorithme FTT de Cooley-Tuckey.

Bibliographie

Références

Witkin, A. P. « Scale-space filtering », Proceedings of the Eighth International Joint Conference on Artificial Intelligence, Karlsruhe (Allemagne), 1019–1022, 1983.

[Cooley65] Cooley, J. W. et Tukey, O. W., « An Algorithm for the Machine Calculation of Complex Fourier Series », Mathematics of Computation, 19, 297-301, 1965.

Quelques mots sur les auteurs

Raghu Muthyalampalli est Software Engineer au Software Solutions Group d’Intel.

Shankar Swamy est Senior Graphics Architect au Software Solutions Group d’Intel.

LES INFORMATIONS QUE COMPORTE CE DOCUMENT CONCERNENT DES PRODUITS INTEL®. CELUI-CI N’ACCORDE AUCUNE LICENCE EXPRESSE, IMPLICITE OU AUTRE SUR UN DROIT QUELCONQUE DE PROPRIÉTÉ INTELLECTUELLE. À L’EXCEPTION DES DISPOSITIONS PRÉVUES AUX CONDITIONS GÉNÉRALES DE VENTE D’INTEL POUR LESDITS PRODUITS, INTEL DÉCLINE TOUTE RESPONSABILITÉ ET EXCLUT TOUTE GARANTIE EXPRESSE OU IMPLICITE SE RAPPORTANT À LEUR VENTE OU À LEUR UTILISATION. INTEL DÉCLINE NOTAMMENT TOUTE RESPONSABILITÉ ET TOUTE GARANTIE CONCERNANT LEUR ADÉQUATION À UN USAGE PARTICULIER, LEUR QUALITÉ LOYALE ET MARCHANDE, LA CONTREFAÇON DE TOUT BREVET, LA VIOLATION DE DROITS D’AUTEURS OU D’AUTRES DROITS DE PROPRIÉTÉ INTELLECTUELLE. Les produits Intel ne sont pas conçus pour une utilisation dans des applications médicales, de secourisme ou de maintien de la vie, dans des systèmes de commande ou de sûreté essentiels ou dans le nucléaire.

Intel se réserve le droit de modifier à tout moment et sans préavis les caractéristiques et descriptions de ses produits. Les concepteurs ne sauraient se fier ni à l’absence ni aux caractéristiques d’une fonction ou d’instructions déclarées comme étant « réservées » (reserved) ou « indéfinies » (undefined). Intel s’en réserve la définition ultérieure et sa responsabilité ne saurait être engagée de quelque manière que ce soit en cas de conflits ou d’incompatibilités résultant de modifications qui seraient alors apportées à cette fonction ou à ces instructions. Les informations fournies ici étant susceptibles de modification sans préavis, il est déconseillé de s'en servir comme base pour mener à terme un projet effectif.

Cet article ainsi que le logiciel qu’il décrit sont fournis sous licence et ne peuvent être utilisés ou copiés que dans les limites permises par ladite licence. Les renseignements proposés dans ce document ne le sont qu’à titre informatif, ils sont susceptibles de modifications sans préavis et ne sauraient être interprétés comme un engagement de la part d’Intel Corporation. Intel Corporation rejette par ailleurs toute responsabilité pour les erreurs et inexactitudes qui pourraient figurer dans ce document ou dans un logiciel quelconque qui l’accompagnerait.

La numérotation des processeurs Intel® ne constitue pas une indication quantitative de leurs performances. Elle permet de différencier des modèles appartenant à une même famille (ligne) de processeurs, mais non pas à des familles différentes. Voir http://www.intel.com/products/processor_number/fra/index.htm à ce sujet.

Les processeurs et jeux de composants Intel® peuvent comporter des défauts ou erreurs de conception, connus sous le nom d’errata, susceptibles de faire s’écarter le produit des spécifications établies. La liste des errata actuellement répertoriés est disponible sur demande.

On pourra obtenir un exemplaire des documents référencés ici en appelant le +1 800 548 4725 ou en se rendant sur le site Internet d’Intel à l’adresse www.intel.com.

Intel et le logo Intel sont des marques déposées ou enregistrées d'Intel Corporation ou de ses filiales, aux Etats-Unis et dans d'autres pays.

* Les autres noms et dénominations peuvent être revendiqués comme marques par des tiers.

© 2007, Intel Corporation. Tous droits réservés.

For more complete information about compiler optimizations, see our Optimization Notice.