Qu'est-ce que le rendu différé?

54

J'ai entendu parler du rendu différé et de la façon dont son utilisation peut permettre de créer «beaucoup» de lumières dans une scène sans que cela ne génère un énorme impact sur les performances, mais de quoi s'agit-il et (à partir d'un niveau élevé) comment est-il implémenté?

Tetrade
la source

Réponses:

55

La caractéristique déterminante du rendu différé est qu’il modifie essentiellement la complexité du rendu de la scène de O (géométrie * lumières) à O (géométrie + lumières).

Pour ce faire, vous devez d'abord rendre la scène à l'aide de shaders conçus pour générer des attributs de base tels que (au minimum) la position *, la couleur normale et la couleur diffuse. D'autres attributs peuvent inclure des valeurs spéculaires par pixel et d'autres propriétés matérielles. Celles-ci sont stockées dans des cibles de rendu plein écran, appelées collectivement G-buffer.

(*: Il convient de noter que les développeurs choisiront plus généralement de stocker la profondeur et de l'utiliser pour reconstruire la position, car disposer de la profondeur est utile pour de nombreux autres effets. )

Une fois que le tampon G a été généré, il est possible de calculer un résultat pleinement éclairé pour n'importe quel pixel de l'écran en résolvant le BRDF exactement une fois par pixel par lumière. En d’autres termes, si vous avez 20 maillages affectés chacun par 20 lumières, le rendu traditionnel ("en avant") vous obligera à refaire le rendu de chaque maille plusieurs fois afin d’accumuler le résultat de chaque lumière qui l’affecte. Dans le pire des cas, il s'agirait d'un appel de tirage par maille par feu ou de 400 appels de tirage au total! Pour chacun de ces appels de tirage, vous retransforme de manière redondante les sommets du maillage. Vous risquez également d'ombrer des pixels qui ne sont pas réellement affectés par la lumière ou qui ne seront pas visibles dans le résultat final (car ils seront masqués par une autre géométrie de la scène). Chacune de ces conséquences entraîne un gaspillage de ressources GPU.

Comparez au rendu différé: il suffit de restituer les maillages une seule fois pour remplir le G-buffer. Après cela, pour chaque lumière, vous restiturez une forme englobante qui représente l'étendue de l'influence de la lumière. Pour une lumière ponctuelle, il peut s'agir d'une petite sphère ou d'une lumière directionnelle, ce serait un quadrant en plein écran, car toute la scène est affectée.

Ensuite, lorsque vous exécutez le shader pixel / fragment pour le volume limite de cette lumière, lisez les attributs de géométrie à partir de la position appropriée dans les textures du tampon G et utilisez ces valeurs pour déterminer le résultat de l'éclairage. Seuls les pixels de la scène visibles dans le résultat final sont ombrés, et ils le sont exactement une fois par lumière. Cela représente une économie potentiellement énorme.

Cependant, ce n'est pas sans inconvénients. C'est un paradigme qu'il est très difficile d'étendre pour gérer une géométrie transparente (voir: peeling en profondeur). Tellement difficile, en fait, que pratiquement toutes les implémentations de rendu différé retombent en avant pour les parties transparentes de la scène. Le rendu différé consomme également une grande quantité de VRAM et de bande passante de tampon de trame, ce qui amène les développeurs à se donner beaucoup de mal pour intégrer et compresser intelligemment les attributs du tampon G dans les composants les plus petits ou les plus petits possibles.

Neverender
la source
8

Également appelé «ombrage différé», le rendu différé fait référence à un large éventail de chemins de rendu possibles qui stockent des résultats intermédiaires dans des textures, puis complète l'équation de rendu ultérieurement en échantillonnant les données intermédiaires.

Les tampons de géométrie sont un exemple récent, où la scène est rendue dans une série de tampons contenant par exemple la texture de position, normale et de base d'une géométrie opaque. L'éclairage n'a pas été appliqué et la couleur finale n'est pas connue. Lors des passes suivantes, les lumières sont rendues et les tampons de géométrie sont échantillonnés. Cela signifie qu'un grand nombre de lumières peuvent être restituées avec un coût fixe en nombre de lumières éventuellement visibles sur un pixel de l'écran. Le rendu traditionnel aurait évalué toutes les sources de lumière pour des surfaces occluses et jamais vues à l'écran.

De nombreuses variantes existent, notamment le rendu des informations claires par exemple.

Voir pour plus d'informations: http://en.wikipedia.org/wiki/Deferred_shading http://delicious.com/aancsiid/deferred-shading

Vincent Scheib
la source
-3

Le rendu différé est le traitement où se trouve le geomtry avant de faire un second passage pour tout ombrer. C'est utile car cela change la coplexité en O (pixels * sources lumineuses), ce qui vous permet d'utiliser des scènes complexes avec un impact limité sur les performances.

La mise en œuvre est plutôt simple. La première passe nécessite de restituer, au minimum, la distance, la normale et la couleur. Vous pouvez ajouter plus de textures à rendre comme spéculaire, et position, au détriment de la mémoire.

Une fois que vous avez rendu ceux-ci, vous effectuez le rendu de certaines sphères, où une source de lumière unique est au centre de chacune d'elles, ajoutez la lumière, recadrez le tout dans la géométrie de votre scène et appliquez enfin l'atténuation.

hellol11
la source
Je ne pense pas que cela ajoute quelque chose de nouveau aux réponses. Cela ressemble simplement à des parties reformulées de la réponse de Neverender.
HolyBlackCat
@HolyBlackCat Il y a quelques différences importantes. Premièrement, il y a l'équation correcte de la complexité et, deuxièmement, elle est beaucoup plus concise, tout en expliquant comment la mettre en œuvre.
hellol11
there's the correct complexity equationVrai. Mais je dirais que c'est un détail mineur. Vous pouvez suggérer cela comme modification à l'autre réponse ou laisser un commentaire à ce sujet une fois que votre réputation est suffisante. Faire une nouvelle réponse à cause de cela est un peu exagéré. it's much more concisePersonnellement, je ne pense pas que ce soit bien. Plus une réponse a de détails utiles, mieux elle est, n'est-ce pas?
HolyBlackCat
1
@HolyBlackCat À un point, oui. Personnellement, je n'aime pas avoir à parcourir un mur de texte pour avoir une simple question.
hellol11