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.
there's the correct complexity equation
Vrai. 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 concise
Personnellement, je ne pense pas que ce soit bien. Plus une réponse a de détails utiles, mieux elle est, n'est-ce pas?