Quel est le compromis de performance entre le rendu direct et le rendu différé?

9

Le rendu direct est le processus de calcul d'une valeur d'éclat pour un fragment de surface directement à partir de la géométrie d'entrée et des informations d'éclairage. Le rendu différé divise ce processus en deux étapes: tout d'abord, produire un tampon d'espace d'écran contenant les propriétés des matériaux (un tampon de géométrie ou un tampon G) construit en pixellisant la géométrie d'entrée, puis produire une valeur d'éclat pour chaque pixel en combinant le G- tampon avec informations d'éclairage.

Le rendu différé est souvent présenté comme une optimisation du rendu direct. Une explication est que l'éclairage est assez cher et si vous avez un surplomb, vous allumez des pixels qui ne seront jamais vus à l'écran, alors que si vous stockez les propriétés des matériaux dans un tampon G et que vous allumez ensuite, vous n'éclairez qu'un pixel qui apparaissent réellement à l'écran. Est-ce en fait un avantage de différé, étant donné que vous pouvez également effectuer une pré-passe en profondeur, puis effectuer une passe de rendu avant avec un test de profondeur défini sur D3D11_COMPARISON_EQUALou GL_EQUALou l'équivalent?

Le rendu différé a également le potentiel de mieux planifier sur le GPU. La division d'un grand warp / front d'onde en un front d'onde géométrique plus petit, puis des fronts d'onde d'éclairage plus petits améliorent plus tard l'occupation (plus de fronts d'onde en vol simultanément). Mais vous vous retrouvez également avec beaucoup plus de bande passante (en écrivant un grand nombre de canaux dans le G-buffer, puis en les relisant pendant l'éclairage). Évidemment, les détails ici dépendent beaucoup de votre GPU, mais quels sont les principes généraux?

Y a-t-il d'autres considérations pratiques sur les performances lors du choix entre le rendu direct et le rendu différé? (Supposons que nous pouvons utiliser des variations de chaque technique si nécessaire: c'est-à-dire que nous pouvons également comparer le carrelage en avant au carrelage différé.)

John Calsbeek
la source

Réponses:

11

Il est possible d'éviter le dépassement d'objets opaques même avec un rendu direct en effectuant un pré-passage en profondeur et en utilisant ces informations pour rejeter tout pixel qui n'est pas réellement visible. Cependant, selon le coût du sommet de votre scène, un pré-passage en profondeur peut ajouter une quantité inacceptable de surcharge de performances. De plus, le rendu à l'aide du pipeline de pixel shading du GPU signifie que vous ne payez pas un coût par pixel rendu, vous payez un coût par quadruple pixel de 2x2 qui est rendu. Ainsi, même en effectuant un pré-passage en profondeur, les bords du triangle gaspillent toujours les pixels d'ombrage de travail qui seront supprimés.

La planification des GPU est un sujet complexe, et le compromis entre le transfert avant et différé ne se résume pas simplement à "s'exécute plus rapidement mais utilise plus de bande passante". Si vous avez deux opérations tout aussi bon marché qui s'exécutent en séquence et utilisent chacune le même nombre de ressources, il n'y a aucune raison de les diviser en shaders séparés: deux petits fronts d'onde qui utilisent chacun des ressources X ne fonctionnent pas fondamentalement mieux qu'un front d'onde plus long qui utilise également les ressources X. Si vous avez une opération bon marché et une opération coûteuse à exécuter en séquence, cependant, il peut être avantageux de la scinder en shaders séparés: le shader en général réservera la quantité maximale de ressources qu'il pourrait utiliser à tout moment. Il' Il est concevable que le rendu direct ne puisse pas utiliser toute la bande passante de votre GPU car il y a si peu de fronts d'onde en vol qu'il ne peut pas émettre suffisamment d'opérations pour saturer la bande passante. Mais si tula bande passante étant limitée, le rendu différé peut ne présenter aucun avantage (car il utilisera probablement plus de bande passante).

Un autre problème de performances est que le rendu direct prend en charge différents types de matériaux (différents BRDF, par exemple) simplement en utilisant un shader différent pour cet objet. Un rendu différé simple doit gérer différents types de matériaux de manière différente (potentiellement une branche dans le shader), car le travail n'est plus regroupé en déformations / fronts d'onde de manière cohérente selon l'objet rendu. Cela peut être atténué avec un rendu en mosaïque - si seules des zones spécifiques de l'écran utilisent un autre type de matériau (par exemple, pour les cheveux), vous pouvez utiliser la variation du shader avec une branche de type de matériau uniquement pour les tuiles contenant des pixels avec ce matériau .

John Calsbeek
la source