Programmation des GPU en C++

La montée en puissance des GPUs s’est accompagnée du développement de langages de programmation spécifiques comme Cg ou GLSL pour tirer parti de leurs performances. La syntaxe de ces langages est proche du C, mais ils sont clairement destinés à la programmation d’applications graphiques, et demandent une bonne connaissance du fonctionnement interne des GPU.

Pour exécuter des programmes plus généraux sur les GPUs, l’idéal serait de disposer de compilateurs capables de générer “tout seuls” du code optimisé pour les GPU à partir d’un source C++ standard. On n’y est pas encore, mais ça progresse.

Actuellement, il existe des librairies permettant d’utiliser le GPU comme coprocesseur au travers d’un API comme:

Dans sa thèse de doctorat “GPU++ - An Embedded GPU Development System for General-Purpose Computations” Thomas Jansen a franchi une étape de plus en permettant de développer des shaders directement en C++ à l’aide d’une librairie qui génère du code GPU (je n’ai pas encore compris comment) à la compilation sur un compilateur standard.

RapidMind propose une “plateforme” basée sur une idée similaire, mais en la généralisant encore. Leur système permet d’optimiser le même code sur des processeurs aussi différents que les GPU multi-coeurs, les GPU et le processeur Cell qui équipe les PlayStation 3. Mais comme on le voit ci-dessous, le langage C++ est difficilement reconnaissable derrière l’utilisation d’un API et de macros:

Cette approche est cependant très générale et efficace, comme on le voit sur la page des “Case Studies“, qui inclut au moins deux domaines qui m’intéressent:

  1. La simulation des fluides
  2. Les fractales. J’y reviens dans un prochain article

Documents intéressants:

VideoTrace : modelisation 3D à partir d’une video

l’ Australian Centre for Visual Technologies a développé VideoTrace, une technologie assez extraordinaire permettant de modéliser un objet réel en 3D à partir d’un bout de film. Démonstration:

C’est encore au niveau du proto, mais il fait peu de doute qu’on verra cette technologie très prochainement intégrée à nos outils de modélisation préférés. Et peut-être que dans quelques années il n’y aura même plus besoin de dessiner sur les images pour aider…

référence : Anton van den Hengel, Anthony Dick, Thorsten Thormählen, Ben Ward, Philip H. S. Torr “VideoTrace: Rapid interactive scene modelling from video“, 2007, SIGGRAPH 2007 Conference Proceedings

Mathias Müller : Simulation temps réel de fluides dans les jeux

Le cours “Real Time Fluids in Games” de Matthias Müller-Fischer présenté à la conférence SIGGRAPH 2007 est une remarquable synthèse des différents problèmes posés par la simulation réaliste des fluides. L’auteur propose de distinguer 3 situations et les solutions correspondantes:

  1. “L’eau procédurale” (Procedural Water) pour représenter de vastes étendues océaniques ou de l’eau sans interaction physique avec le jeu.
  2. La technique des “champs de hauteur” (Heightfield Fluids) permet de calculer en temps réel des vagues causées par des interactions physiques sur de petites étendues d’eau.
  3. Les “fluides basés sur les particules” (Particle Based Fluids) sont proposés pour traiter les situations où le fluide gicle ou s’écoule de façon turbulente.

Procedural Water

Cette approche vise un but purement visuel. La physique n’est utilisée que pour précalculer des textures et les animer pour obtenir un rendu réaliste sans calculs supplémentaires. L’article de Yuri Kryachko “Using Vertex Texture Displacement for Realistic Water Rendering” paru dans GPU Gems 2 explique par exemple comment des images telles que celle ci-dessous sont générées dans le jeu Pacific Fighters

Heightfield Fluids

Cette technique consiste à modifier en temps réel un maillage représentant la surface de l’eau, modélisée comme une membrane sur laquelle se propagent les vagues. Matthias Müller la décrit de façon très complète dans son document, largement assez pour l’implanter dans une démo Demoniak 3D, par exemple (encore un projet en cours de plus, je vous en reparle bientôt…)

La principale limitation de cette méthode est que la hauteur du fluide ne peut avoir qu’une seule valeur en chaque poitn de la surface. Matthias montre comment contourner cette limitation dans 2 cas:

  1. pour les objets flottants que l’eau peut partiellement recouvrir ou des objets semi immergés, il montre qu’une seule variable supplémentaire par point du maillage permet d’en tenir compte pour modifier la surface de façon réaliste
  2. l’article de  N. Thürey, M. Mueller-Fischer, S. Schirm, M. Gross “Real-time Breaking Waves for Shallow Water Simulations” montre comment utiliser un système de particules pour représenter la crête des vagues, les déferlantes et les rouleaux.

Toutes ces techniques sont illustrées sont illustrées dans cette video:

Après avoir cofondé Novodex à Zürich, Matthias Müller y travaille pour Ageia, entreprise qui développe et commercialise l’API PhysX  permettant d’intégrer facilement la simulation physique aux jeux ainsi qu’un “Physical Processing Unit” (PPU) accélérant notablement les calculs correspondants. Le support des “heightmap fluids” est annoncé pour la prochaine version de PhysX.

Particle Based Fluids

Quand le fluide gicle et s’écoule de façon turbulente, Matthias Muller propose de modéliser le fluide comme un ensemble de particules en interaction entre elles et avec l’environnement. Cette méthode est très différente de celle que j’avais décrite ici, basée sur la résolution des équations de la mécanique des fluides. Elle présente l’avantage de pouvoir plus facilement représenter les interactions entre le fluide et son environnement, comme on le voit dans cette vidéo montrant plusieurs exemples:

Par contre, et comme on le voit déjà dans l’exemple de la vague déferlante, le réalisme visuel des fluides représentés par des particules n’est pas terrible, ce qui est assez facile à comprendre.

Autres références:

BioShock

J’ai vachement bien fait d’upgrader mon PC, ça m’a permis de dévorer LE jeu de 2007 :

BioShock est incroyablement prenant grâce à une ambiance unique soutenue par une réalisation quasiment irréprochable. On se retrouve plongé dans Rapture, un genre de Metropolis sous-marin des années 1950 dans lequel le génie génétique a prolongé les “expériences médicales” nazies, une atmosphère délirante et stressante mais qui nous emmène de surprise en découverte.

Le “gameplay” est excellent et très bien pensé, notamment le fait que les munitions et autres ressources sont relativement rares et qu’il faut donc bien explorer le jeu et utiliser au mieux ce qu’on y trouve plutôt que de “canarder dans le tas”.

A noter cet excellent jeu doit définitivement être réservé aux adultes. J’avoue avoir été moi-même dérangé par le choix cornélien concernant le sacrifice des “petites soeurs” : faut-il vraiment étriper de jolies petites filles pour obtenir plus d’Adam, cette ressource indispensable à la poursuite du jeu ?

A part ça, le jeu est techniquement magnifique, mais il requirt une machine dernier cri. J’ai particulièrement apprécié le rendu de l’eau (un sujet qui m’intéresse pas mal) que l’on trouve un peu partout sous divers aspects. La déformation de la vision lorsque le jouer passe sous une cascade est particulièrement réussie, entre autres.

La seule vraie critique concerne un point énervant : il n’est pas possible de reconfigurer les touches A, Q et Z du clavier français pour les changer en  Q, W et A pour correspondre au clavier suisse ! Impossible de jouer pour un gamer suisse habitué aux FPS ou ces touches sont devenues le standard poru contrôler les déplacements. Honte aux développeurs. Bouh! . Heureusement, on peut s’en sortir en éditant un fichier de configuration, mais c’est pénible…

Ensembles de Julia calculés en temps réel par GPU

Retrouvé par hasard un travail très intéressant de Keenan Crane (dont on a déjà parlé ici) datant de 2005 sur cette page et dans cet article. Il s’agit d’un véritable tutoriel sur le ray-tracing en temps réel d’un objet mathématique particulier, l’ensemble de Julia, le tout calculé sur un GPU. Comme le dit Keenan, il y a deux problèmes avec l’ensemble de Julia:

  1. il prend des siècles à calculer
  2. il est totalement inutile

mais il est très beau, comme on le voit sur ces captures :

En fait, l’ensemble de Julia est un objet à 4 dimensions que l’on visualise par “tranche en 3 dimensions”. En coupant une tranche en 2 dimensions dans une direction particulière, on obtient d’ailleurs l’ensemble de Mandelbrot plus connu, que Demoniak3D calcule sur GPU de façon spectaculaire.

Un exécutable avec son code source sont disponible sur la page “Ray Tracing Quaternion Julia Sets on the GPU” de Keenan Crane. Il utilise

Le problème, c’est que ce dernier code n’a plus l’air de fonctionner avec le tout récent Cg 2.0… Avant que je m’attaque à porter tout ceci en GLSL + LUa sur Demoniak 3D, est-ce que quelqu’un qui connait le Cg pourrait me dire ce qui cloche, voire corriger la version actuelle ?

Caustiques en temps réel

A peine avais-je terminé le post précédent qui présentait des textures de caustiques que je suis tombé sur un post de Level of Detail intitulé “Caustics Mapping: An Image-space Technique for Real-time Caustics” qui présente une nouvelle méthode permettant de calculer des caustiques en temps réel sur un GPU dur à Musawir A. Shah et Sumanta Pattanaik, de l’University of Central Florida.

La page Caustics Mapping: An Image-space Technique for Real-time Caustics présente leurs résultats, qui sont impressionnants car leur méthode permet même de tenir compte de la réfraction de la lumière avec un framerate très acceptable sur une vieille GeForce 6800 :

Je n’ai pas encore lu en détail leur article, mais l’idée de base est de calculer la texture de la caustique sur un principe simulaire au “shadow mapping”, en déterminant le point d’arrivée sur la texture d’un rayon passant par chaque vertex du modèle. L’utilisation d’un algorithme itératif de Newton-Raphson permet d’éviter de faire du véritable “ray-tracing”, opération peu adaptée au GPU, et d’atteindre des résultats qualitativement très acceptables en temps réel.

Bien envie de m’attaquer à ça avec Demoniak 3D …

Calendrier CGArena

CGArena offre des fond d’écran + calendrier 2008 d’images virtuelles magnifiques.

J’ai choisi celle-ci pour janvier (février, mars …)

 

elfe.png

Non, non, ce n’est pas une vraie femme… C’est une oeuvre de Soa Lee (www.soanala.com) , une artiste coréenne qui fait des personnages féminins magnifiques, à mon humble avis. Pas vraiment le même style que JeGX donc, mais merci pour le link ;-)

Jos Stam : Physique, Maya Nucleus et Caustiques

Dans “The Software That Will Take Digital F/X to the Next Level of AwesomeMichael Behar de Wired dresse le portrait de Jos Stam, chercheur formé à l’Université de Genève et développeur de modules de physique Maya chez Alias/Autodesk.

Son module nCloth est le premier basé sur le framework Nucleus et permet de calculer les mouvements réalistes de textiles dans Maya 8.5 comme dans ce joli exemple:

Comme Ron Fedkiv dont j’ai parlé ici, Jos s’intéresse aussi à la simulation de fluides et parvient à des résultats très encourageants:

Malheureusement, Jos ne maintient pas trop sa page perso, ce qui fait qu’on trouve beaucoup moins de matériel sur son travail que sur celui de Ron Fedkiv.

caus1.gifSa page sur les caustiques est par contre bien détaillée et très utile à ceux qui veulent simuler une surface d’eau vite fait bien fait car elle offre 8 ensembles de 32 textures périodiques 512×512 permettant de réaliser des caustiques animées comme ci-contre

A part ça, je me retrouve bien dans cette phrase de Jos Stam: “I started coding just for the beauty of it.”

Hyperion 3D devient Demoniak 3D

demoniak3d_300x300.jpg Suite à une sombre histoire, Hyperion3D s’appelle dorénavant Demoniak 3D.

JegX nous a pondu à la vitesse de la lumière une version 1.17 en renommant tout sur son passage.

En passant, bravo à Steph3D pour le logo.

 

 

La Recherche en Simulation Physique

Ron Fedkiw est chercheur et professeur à Stanford et sa page regorge de vidéos extraordinaires sur ses sujets de recherche en simulation physique et 3D, qui donnent une petite idée de ce qui sera possible de faire en temps réel dans quelques années (ou mois).

Une de ses spécialités est l’interaction de solides, de fluides et de gaz, comme par exemple dans sa “réaction chimique” :

Il y a également plusieurs exemples spectaculaires de mécanique des fluides, comme le phare :

Une impressionnante liste de publications au format .pdf ou .ps est disponible au bas de la page pour tous les détails mathématiques …

« Page précédentePage suivante »