Multi-texturing en Shockwave 3D

> Sommaire

> Introduction

L’utilisation du multi-texturing dans le cadre de la 3D temps-réel est la clef du rendu photo-réaliste. Le principe est simple, plusieurs “couches” de textures se superposent les unes sur les autres, chacunes s’appliquant de manières différentes sur les précedentes, ces “couches” (layers) étant parfois dépendantes les unes des autres. Les textures des layers peuvent ainsi être combinées suivant différentes fonctions, en suivant ce principe deux textures peuvent donner des résultats completement différents, de plus en modulant les attributs des layers des shaders (paramètres et fonctions) on peut obtenir des effets de pulsations ou de transitions entre opacité et transparence.

Voici quelques exemples d’effets très intéressants réalisable avec Director 8.5 :

  • L’application rapide des lightmaps : shadows-maps (précalcul des ombres portées et des nuances de la réflexion ambiante et diffuse) et illumination-maps (création d’aires lumineuses sur les murs) en une seul passe.
  • Le dirty mapping qui “salit” des objets en fonction de leurs géométries et diverses paramètres, afin des les rendres moins unis dans leurs acpects, et par là même plus crédibles dans leurs rendus (plugin Dirty-Reyes pour 3DS MAX).
  • Le details mapping, qui permet d’augmenter (virtuellement) la complextité apparente de surfaces “rugeuses ou bruitées” lorsqu’on s’en approche, et d’éviter l’effet “tuile”.
  • En plaçant de petites textures (patches) sur la texture de base, on peut créer des tâches de sang sur des ennemis, des craquelures sur un objet, des éraflures sur une carroserie, ou des animations sur un écran.
  • L’emboss bump mapping qu’il soit en une, deux, ou trois passes. Permettant de simuler la perturbation de la réflexion diffuse sur une surface non-lisse (voir la documentation du benchmark 3DMark 2000), et ce même avec des cartes graphiques non pourvu de cette capacités, moyennant une utilisation plus importante du CPU, et une qualité de rendu moindre qu’avec d’autres méthodes.

D’autres techniques plus évoluées suivent ce procédé, mais demandent des opérations sur les layers que ne permet pas ShockWave Director 3D actuellement, ce dernier reposant sur les fondations simples, stables, communes, et portables de différentes APIs 3D (OpenGL 1.2 sans extensions ARB, DirectX 5.2, DirectX 7.0).

Ce mode de rendu qui commence seulement à être plus intensivement employé dans les jeux en 3D temps-réel, est également disponible sur une page web grace à la technologie ShockWave Director 3D de Macromedia, et permet d’excellents rendus ( 1 et 2 ) proches du photo-réalisme.

Sommaire

> Les “Textures Units” des cartes graphiques accélératrices 3D

3DPI texture units Depuis de nombreuses années les cartes accélératrices 3D assurent un support hardware du multi-texturing proportionel à leurs nombres d’unités de texturage (texture units). Les premières à ma connaissance sont les Voodoo 2.

Mais cette architecture a été popularisé par nVidia à partir de la GeForce 2. Même la GeForce 2MX carte d’entrée de gamme extrêmement courante possède deux unités de texturage.

Comment savoir le nombre de TU dont dispose notre carte ? On peut “taper” put getRendererServices().getHardwareInfo() dans Director, mais la solution la plus simple et la plus élegante est d’utiliser l’Xtra 3DPI, ce dernier est l’outil parfait et le compagnon idéal de tous développeurs 3D en lingo.

Attention ! Cela ne veut pas dire qu’une carte ne disposant que d’une seul TU ne peut pas faire de multi-texturing, seulement ce sera moins rapide, il ne devrait pas y avoir de pertes de précision du fait que les opérations logiques et arithmétiques se feront en interne de la carte. Plusieurs cycles seront nécessaire pour accéder au même résultat. Mais quelques précisions sur les technologies des cartes accélératrices 3D s’impose. En voici un brèf résumé inspiré d’articles issus du site internet Hardware.fr.

> Texel (texture element) :

Pixel sur lequel le plaquage de textures 3D a été effectué.

> Filtrage (filtering) :

Voici les trois méthodes les plus utilisées :

  • Le Point Sampling (ou Pick Nearest), technique la plus simple, fait correspondre un Pixel à un Texel suivant ses coordonnées (méthode utilisée pour le rendu software ou par la Playstation 1). Visuellement pas terrible, cela se traduit par de gros blocs de pixels identiques lorsque l’on s’approche des murs par exemple. Ainsi que par des effets de moirage et/ou de scintillement. (texture.quality=#low)
  • Le Bilinear filtering (ou Linear) effectue une interpolation de couleurs à partir d’un carré formé par 4 Texels. Il faudra donc lire 4 Texels pour rendre un pixel en bilinear filtering. Cette méthode, introduite par la Voodoo 1, élimine le principal défaut du Point Sampling en créant une sorte d‘ effet de flou. (texture.quality=#medium)
  • Le Trilinear filtering (ou linear mip map linear) est tout simplement un Bilinear effectué sur 2 mip maps adjacents. Il faudra donc lire 8 Texels pour rendre un pixel en trilinear filtering. L’énorme avantage du trilinear sur le bilinear est d’adoucir les transitions entre les différents mip map. (texture.quality=#high)

> Mip mapping :

Issus de l’expression latine multum in parvo (signifant : plusieurs en un seul).

Images d’une texture mip mappée

De 128*128 Pixels … à 1×1 Pixels

Lorsque´un polygone est plus petit que la texture qui doit lui être appliquée, des effets de scintillement indésirables peuvent apparaître. Pour résoudre ce problème, on utilise le Mip Mapping. Une même texture est stockée sous plusieurs résolutions appelés mip maps, et selon l´éloignement du polygone on utilise le mip map adapté.

Note : ShockWave Director 3D gere de façons tout à fait transparente les différents niveaux de mip map.

> Multi texturing :

Au lieu d’utiliser une seule texture, on peut décider d’en appliquer plusieurs pour créer des effets de lumière par exemple.

Exemple de multitexturing

+ =
Dans cet exemple, 2 textures sont mélangées (blending) mais rien n’empêche d’en utiliser 3, 4, voir plus …

Bien évidemment, plus on augmente le nombre de textures, plus on utilise de Texels. Voici les mode de multitexturing les plus fréquemment utilisées par les développeurs :

Voici donc la consommation de Texels suivant le filtrage et le mode de texturing :

> Texel Engine & Pixel Engine :

La partie chargée de la rasterization sur les chips graphiques actuels est séparée en deux éléments distincts, le Texel Engine et le Pixel Engine.

Le premier a pour but d´effectuer toutes les lectures de Texels afin d´effectuer le bilinear ou le trilinear filtering, et d´envoyer un Texel issue de ces calculs au Pixel Engine.

Ce dernier s´occupera pour sa part d´effectuer le blending (mélange) entre plusieurs Texels en cas de multi texturing (suivant différents modes), et d´écrire ou non le Pixel dans le Front buffer, selon qu´il soit au premier plan ou pas (ceci étant déterminé par le Z-Buffer).

> Comment se mesure le fillrate :

Le fillrate se mesure en Millions de Pixels par seconde ou en Millions de Texels par seconde. Selon le type de fillrate que l´ont veut obtenir, on utilise les formules suivantes :

Il s´agit ici d´exemples simplifiés, qui ne tiennent pas compte du nombre de textures et de la méthode de filtrage utilisée. De plus si le texel engine ne gere pas assez de texels, il sera obliger d’éffectuer plusieurs accès, eux même liés à la bande passante d ela mémoire.

Vous comprendrez bien qu´il est vite facile de s´y perdre, et que les constructeurs utilisent parfois cette confusion pour gonfler en quelques sortes les caractéristiques de leur produit. Généralement, le Fillrate à la lecture des Texels n´est jamais utilisé.

On préfère en effet utiliser le Fillrate à la sortie des Texels Engine, exprimé en MTexels /s, et le Fillrate à la sortie des Pixels Engine, exprimé en MPixels /s. Mais pour les joueurs, seul compte le nombre de Pixels que peut afficher à l’écran le chip graphique.

> Les différentes architectures :

Voodoo 1, Banshee, Riva 128 et Rage Pro : Ces chips sont dotés d´un seul Pixel Pipeline contenant doté d´un Texel Engine capable de lire 4 Texels / cycle d´horloge, et d´un Pixel Engine.

Savage 3D et G200 : Ces chips disposent d´une architecture dérivée de la précédente. Leur Texel Engine est en effet capable de lire 8 Texels / cycle d´horloge, ce qui permet d´effectuer le tri-linear filtering sans perte de performance.

Voodoo 2, Voodoo 3 : La Voodoo 3 est toujours doté d´un seul Pixel Pipeline, mais cette dernière est dotée de deux Texel Engine, capable de lire 4 Texels / cycle d´horloge, et d´un Pixel Engine. Ceci permet au chip de ne pas baisser en performances lors du passage en dual-texturing.

Savage 4 : L´architecture du Savage4 est asssez proche de la Voodoo 2 et de la Voodoo 3 puisque l´on dispose d´un Pixel Engine et deux deux Texel Engine. Elle peut donc calculer un seul pixel par cycle d´horloge, mais passe en dual texturing sans perte de performance au niveau du fillrate. De plus, chaque Texel Engine pouvant lire 8 Texels, le tri-linear se fait sans perte de performance également.

Riva TNT, Rage 128 : L´architecture de ces chips est plus intelligente que celle de la Voodoo 3. Ainsi, elles disposent de deux Pixel pipeline. Chacun de ces pipelines est doté d´un Texel Engine standard (4 Texels / cycle d´horloge) et d´un Pixel Engine.

En dual ou quad texturing cette architecture offre des performances identiques à celle de la Voodoo 3, mais supérieure en single texturing : dans ce mode, ces chips peuvent effectuer le rendu de deux pixels par cycle d´horloge, contre un seul pour la Voodoo 3.

G400 : L´architecture de la G400 est proche de celle de la TNT et de la Rage 128, a une exception : chacun de leur deux Texel Engine peut lire 8 Texels par clock, ce qui permet a ses chips d´effectuer le tri-linear filtering sans perte de performances.

Savage 2000 : La Savage 2000 est doté de 2 Pixel Pipelines. Chacun d´entre eux est doté d´un Pixel Engine bien sûr, mais également de deux Texels Engines (capable de lire 4 Texels / clock) : contrairement au Savage 3D et au Savage 4 la Savage 2000 n´effectue pas le tri-linear filtering sans perte de performance.

GeForce 256 : La GeForce 256 va un peu plus loins, puisqu´elle dispose de pas moins de 4 Pixel Pipelines, dotés chacuns d´un Pixel Engine et d´un Texel Engine : il est donc possible en un cycle d´horloge de rendre quatre single textured pixel, deux dual textured pixel ou un quad textured pixel, que ce soit en dual ou tri-linear.

Avec la GeForce 2 GTS,nVidia conserve ses quatres unités de pixels, mais leurs associe à chacune deux unités de textures, chacune pouvent gérer jusqu’à quatres texels (nous voilà en présence d’une architecture équivalente à la Savage 2000 mais doublée, en ne considérant que la partie rendu).

Ainsi, en un seul cycle, la GeForce 2 est capable de produire quatres bilinear pixels en dual-texturing! A partir de la GeForce 3, nous pénetrons dans un autre univers grace aux vertex shaders et pixel shaders (vertex programs et pixel programs pour OpenGL) mais qui ne sont malheureusement pas encore pris en compte par ShockWave Director 3D. Son architecture pousse encore plus loin la notion de multi-texturing.

Sommaire

> Director et le multi-texturing

Comme dit précédement ShockWave Director 3D supporte le multi-texturing.

Huit layers sont mis à disposition accessible chacun individuellement via un index [ 1 – 8 ]

Tout d’abors on crée un shader comme ceci : sh1=w3d.newShader("sh1", #standard)
sh1.transparent=false
sh1.specular=rgb(0,0,0)
sh1.shininess=15
sh1.ambient=rgb(30,30,30)
sh1.diffuse=rgb(255,255,255)

Ce shader doit être lié à l’objet concerné de cette manière : mdlSphere.shaderList=sh1.

Mais auparavant le “renderer” (qui défini les propriétés de rendu, ainsi que l’API 3D) est initialisé de la manière suivante : rend=getRendererServices()
rend.renderer=#openGL
rend.textureRenderFormat=#rgba8888
rend.depthBufferDepth=24

Cette configuration assure une qualité de rendu optimale, les textures acceptent la transparence en plus de pouvoir être rendu en 24 bits.

Le depth buffer (z-buffer) est en 24 bits le maximum qu’autorise la carte graphique présente (peut être un jour les cartes graphiques grand public auront des depth buffer 32 bits).

Le choix d’OpenGL est guidé par le fait que certains rendus que je produit ne fonctionne pas en DirectX, et que globalement je trouve OpenGL plus performant.

Avec Director 3D seul quatre fonctions pour combiner les textures sont disponible :

Dans les chapitres qui vont suivre, nous verrons de quelle manière j’ai procédé pour obtenir le résultat suivant, couche par couche, layer par layer, et de quel manière les on peut utiliser ces différentes fonctions sur les textures.

Sommaire

> La texture principale (layer #1)

Voici la texture principale, les dimensions de celle-ci sont des puissances de 2, permettant une plus grande optimisation de la gestion de la mémoire, et de meilleurs performances potentiels. Celle-ci est dite “tuilable” c’est-à-dire que l’on peut la répeter indéfiniment en la juxtaposant à elle même.

Cette texture est appliquée sur une sphère sans mode particulier (textureModeList[1]=#none), la fonction utilisée étant la multiplication afin de bénificier de la réflexion diffuse issus de l’ombrage de Gouraud (blendFunctionList[1]=#multiply). Même en disposant d’une texture de dimensions conséquentes et en utilisant une qualité de “filtering” élevée, la sphère parrait bien terne et matte.

Texturing classique, aspect uni, sans réflexion spéculaire.
La réflexion diffuse est rendue en lissage de Gouraud

sphere : texture pricipale shader : texture pricipale

Sommaire

> Le specular lightmap (layer #2)

Le phénomène physique de la réflexion spéculaire, est déjà pris en compte par Director et ne nécessite pas le recours au multi-texturing, en effet le modèle d’illumination gère ce paramètre, mais le rendu de ce dernier est imparfait ceci dut au lissage de Gouraud qui n’interpole que les couleurs et non le vecteur qui intervient dans le calcul de cette réflexion (ce défaut est particulièrement visible avec des objets en mouvement, la réflexion donne l’impression de glisser de sommets en sommets).

Réflexion spéculaire classique alterée par le lissage de Gouraud
qui génere des “bandes de Mach”

reflexion speculaire : lissage de gouraud

Cependant Director permet un rendu de la réflexion spéculaire avec une précision du pixel, en se basant sur un cas particulier, celui d’une (et une seul) source lumineuse directionelle (la source lumineuse est considérée comme située à une tres grande distance, ainsi il n’y a pas de chute visible de la luminosité en fonction de la distance). Le principe est simple une texture représente l’intensité de la réflexion en deux dimensions, cette texture a été calculée à l’aide de fonctions mathématiques avec un logiciel que j’ai conçu afin d’être le plus fidele possible à une certaine réalitée. Le résultat s’avère beaucoup plus convainquant

Specular-lightmap appliqué sur la texture par défaut

reflexion speculaire : specular-lightmap

Le specular-lightmap n’est tributaire que
d’une lumière directionel (et une seul)

Cette texture est appliquée sur une sphère dans un mode particulier (textureModeList[2]=#specularLight), indiquant à Director qu’il doit appliquer la texture suivant des règles bien précises. La fonction utilisée est l’addition la réflexion spéculaire venant s’ajouter à la texture de base (blendFunctionList[2]=#add).

L’ajout de la réflexion spéculaire, plus réaliste guarde
toutefois un aspect “plastique”

sphere : texture pricipale + réflexion spculaire shader : specular lightmap

Le specular-lightmap n’est pas affecté par l’attribut de rendu “flat”

reflexion speculaire : flat

Sommaire

> Le glossmap (layer #3)

Le gloss map est une texture qui permet de moduler la texture précedement aposée. J’ai créer cette dernière à partir de la texture de base, j’ai rajouté à celle-ci un effet d’embossage lié au texte qui viendra prendre place par la suite.

Specular-lightmap & glossmap sur la texture par défaut

reflexion speculaire + glossmap

Aucun mode particulier n’est nécessaire (textureModeList[3]=#none) pour son application et la fonction a appliquer est la multiplication (blendFunctionList[3]=#multiply). Le but a été atteint on obtient un rendu de très bonne qualité, Qui donne à “notre planète” un aspect à la fois brillant et granuleux. Si la texture de gloss est convenablement créer on peut obtenir une rendu semblable à celui obtenu avec du bump-mapping.

Le gloss-mapping permet de moduler l’intensité de la réflexion spéculaire.
A noter l’effet d’ “emboss” du texte qui va venir par la suite

sphere : texture principale + specular + glossmap shader : glossmaping

Sommaire

> Illumination (layer #4)

Une dernière couche a été rajoutée afin d’afficher notre logo de telle manière qu’il apparaisse comme si il était lumineux. J’aurais même pu ajouter un halo afin de simuler un effet de glow pour renforcer ce rendu d’illumination. Aucun mode particulier n’est nécessaire (textureModeList[4]=#none) pour son application et la fonction a appliquer est le blending (blendFunctionList[4]=#blend), n’oublions pas ce texture possède une composante Alpha, donc n’oublions pas de prendre en compte ce paramètre (blendSourceList[4]=#alpha).

Le résultat final utilisant toutes les ressources du multi-texturing.
Une fois la dernière texture appliquée

sphere : résultat final shader : illumination

Sommaire

> Conclusion

Si les multi-texturing est la clef du rendu photo-réaliste, la qualité des textures en est la porte, tant par leurs finesses, leurs structures, etc… Par combinaison avec des textures possedant une composante Alpha, et expérimentant les différentes fonctions de mélange, on peut obtenir des résultats très différents et intéressant.

Magic Orb (1) Magic Orb (2) sphere : résultat final

Malheureusement l’algorithme de Macromedia qui applique le specular-lightmap n’est pas exempte de bug, ce qui pourrait expliquer pourquoi Macromedia communique aussi peu sur ce mode. La solution pour éviter ces artefacs, serait de déveloper un Xtra permettant d’appliquer le specular-lightmap correctement, cette remarque est valable également pour le diffuse-lightmap, lui aussi buggé

A suivre…

artefacs (1) artefacs (2)

Sommaire

> Exemples Director

SuperSonique Planet

Magic Orb

auteur : franck maussand
Copyright © 2002 (and more) SuperSonique.net. All rights reserved.

5.00 avg. rating (95% score) - 3 votes