ATI se passe du vertex texturing en démo

Publié le 30/03/2006 par
Imprimer
Démos Nvidia
En plus de l´implémentation dans quelques jeux, Nvidia a fait la démonstration depuis octobre 2004, de 3 techniques de rendu qui font appel au vertex texturing.


Cette première démo représente une déformation de terrain à l´aide d´une height map qui indique pour chaque vertex la déformation à appliquer. Pour offrir une qualité correcte de rendu, le sol doit être composé d´un nombre important de triangles. Cette technique n´est intéressante que pour les déformations dynamiques puisque dans le cas d´une déformation statique (par exemple créer un terrain accidenté qui ne bougera pas par la suite), il est plus facile et plus performant de le faire à la source.


La seconde démo de Nvidia est plus intéressante et représente une modélisation avancée des vagues et autres perturbations à la surface d´un petit lac. Grâce au vertex texturing, la surface de l´eau est réellement modifiée, il ne s´agit pas d´un simple trompe l´œil comme une forme de bump mapping / normal mapping aussi avancée soit elle (bien que cette technique soit utilisée pour parfaire le rendu). Pour preuve, nous avons affiché la géométrie. Notez qu´ici aussi la surface de l´eau doit, à la base, être constituée d´un nombre très élevé de triangles.


La dernière démo représente le rendu de tissus qui sont capables de bouger d´une manière réaliste par rapport au vent, au déplacement du personnage etc., en prenant bien entendu en compte différents paramètres physiques. Cette démo représente ainsi de la physique d´effet, qui permet d´enrichir le rendu d´une scène mais sans toucher au gameplay, soit la même catégorie d´effets que ce que permettra Havok FX et au contraire de la solution PhysX d´Ageia qui peut aller beaucoup plus loin.


Comment se passer du vertex texturing ?
Pour justifier cette absence, ATI avait mis en avant les limitations des implémentations actuelles (= de Nvidia) du vertex texturing : pas de filtrage géré nativement et coût très élevé en terme de performances. Limitations qui sont exactes mais qui n´empêchent pas son utilisation dans certains cas puisque quelques jeux l´utilisent. ATI avait également parlé d´une technologie différente qui permet de se passer du vertex texturing tout en offrant plus de possibilités : le render to vertex buffer (R2VB). Grossièrement, cette technique permet d´utiliser directement en entrée dans les vertex shaders les données sorties par les pixel shaders. Elle repose principalement sur l´ajout de cette possibilité dans les drivers et est donc fonctionnelle sur toutes les cartes graphiques DX9, depuis la Radeon 9700 (et à priori Nvidia pourrait également l´implémenter).

En simplifiant, avec le vertex texturing, on applique les données contenues dans une texture calculée par les pixel shaders sur un flot de vertices. Avec le R2VB, on transfère les données (ou une partie de celles-ci) des vertices vers les pixel shaders et c´est via ceux-ci que l´on applique alors les données contenues dans une texture calculée auparavant (ou on calcule le tout en même temps) et on écrit les résultats dans un render target ("texture" dans laquelle on peut écrire des données) que les vertex shaders interprètent par la suite comme le flot de vertices ou comme une partie de celui-ci afin de poursuivre le rendu normal. C´est un peu compliqué et globalement assez proche d´un vertex texturing plus simple à mettre en place mais plus limité puisqu´il parait évident qu´il est plus facile avec le R2VB de faire de la tesselation dynamique, c´est-à-dire de créer des vertices pour augmenter les détails géométriques même sur des objets qui peuvent être déformés. Il "suffit" en effet d´augmenter la taille du render target pour qu´il contienne plus de pixels. Etant donné que ceux-ci peuvent être interprétés par la suite comme des vertices, on augmente effectivement la géométrie.


Le render to texture est utilisé depuis longtemps et permet de calculer une texture qui va être utilisée par la suite en étant réinjectée dans les pixel shaders lors d´une autre passe (par exemple une texture qui contient l´image d´un miroir). Le render to vertex buffer (R2VB) est similaire à ceci près qu´il permet d´être réinjecté directement à la base.

Au niveau des performances sur un effet similaire, le R2VB implique des opérations supplémentaires mais d´un autre côté déplace une partie des calculs des vertex shaders vers les pixels shaders ce qui peut être intéressant quand une Radeon X1900 dispose de 48 unités de traitement des pixel shaders contre 8 pour les vertex shaders. Il est d´ailleurs recommandé d´en faire de même avec le vertex texturing et de calculer les opérations sur les textures dans un pixel shader et seulement ensuite d´utiliser une texture finalisée et préfiltrée avec un seul accès dans les vertex shader. En effet, ces accès peuvent prendre de très nombreux cycles dans les vertex shaders qui ne sont pas optimisés pour masquer leur latence. Mais ce n´est pas tout puisque vu l´absence de filtrage à ce niveau, il doit être émulé via plusieurs accès à la texture (un seul étant déjà coûteux et il en faut 4 pour un filtrage bilinéaire) et un filtrage dans le vertex shader. Pour être complet, précisons tout de même qu´il est en général possible d´éviter le premier problème sur les textures à une dimension (comme les displacement maps) en utilisant une texture à 4 dimensions qui reproduit les mêmes données dans chacune, avec un léger décalage (1 texel dans chaque direction). Pour faire simple cela permet de ne faire qu´un accès à la texture au lieu de 4 mais requiert l´utilisation d´une texture 4 fois plus grosse (bien que pas plus détaillée).
Sommaire
1 - Vertex texturing chez Nvidia
2 - Démos Nvidia, R2VB chez ATI
Vos réactions

Top articles