Ombres dans le rendu différé

12

J'ai lu des informations sur le rendu différé, et je pense que je comprends l'essentiel. Mais ce que je ne comprends pas, c'est comment cela accomplit les ombres. Pour autant que je sache, le G-buffer n'implique pas de créer un shadowmap pour chaque lumière, donc je suis confus quant à la façon dont le passage d'éclairage sait si chaque pixel est occlus ou non. Après tout, un pixel donné qui est visible du point de vue de la caméra peut ne pas être réellement visible du point de vue d'une lumière donnée et cette géométrie d'occlusion peut ne pas être visible du point de vue de la caméra et donc ne rien écrire à ce sujet dans le tampon G .

Si vous commencez à rendre des shadowmaps, cela semble à peu près la même chose que le rendu direct - vous rendez toute la géométrie de la scène pour chaque lumière pour rendre les shadowmaps.

Alors, comment le rendu différé accomplit-il des ombres équivalentes au rendu direct?

DeadMG
la source

Réponses:

14

L'ombrage différé ne fait rien de spécial pour les ombres. Vous devez toujours rendre les textures d'ombre normalement, puis rendre chaque lumière avec la texture d'ombre appropriée liée en tant que texture.

C'est toujours mieux que le rendu avant car vous n'avez pas besoin de redessiner la scène dans la vue principale pour appliquer l'éclairage. Dessiner la carte des ombres est souvent beaucoup moins cher que dessiner plus de passes dans la vue principale car vous n'avez pas besoin de faire de dégradé de pixels, et les cartes d'ombres contiennent souvent moins de la scène (vous pouvez éliminer beaucoup plus de choses).

Les gens font parfois des "ombres différées" pour une lumière, généralement la lumière directionnelle principale. La principale raison pour cela est d'utiliser des cartes d'ombre en cascade ou une autre approche qui utilise plusieurs cartes d'ombre pour la même lumière. Vous pouvez réserver un canal dans le tampon G pour un masque d'ombre (blanc lorsqu'il est éclairé, sombre lorsqu'il est ombré) et appliquer toutes les textures d'ombre en cascade dans ce canal G; le shader pour la lumière lit simplement le masque d'ombre et le multiplie dans la couleur de la lumière. C'est bien car il dissocie les ombres de l'ombrage, mais vous dessinez toujours les mêmes cartes d'ombre.

Nathan Reed
la source
1
Si vous êtes extrêmement intelligent, vous pouvez essayer d'utiliser un ombrage de géométrie lors de la création du GBuffer pour `` aligner '' la création de l'ombre map (comme le fait l'exemple de la carte cube DX10). Je ne sais pas si cela a été fait, si elle est la mesure du possible ou si elle serait plus lente à la fin - mais il apporterait la création d'ombre cartes plus d'ombrage différé, ou dans la définition en fonction de votre religion.
Jonathan Dickinson
6

Eh bien, qu'est-ce qu'une carte fantôme? Une carte d'ombre est une texture à laquelle les texels répondent à une question simple: à quelle distance de la lumière, dans la direction représentée par le texel, la lumière est-elle occluse? Les coordonnées de texture sont générées à l'aide de divers moyens de texturation projective, en fonction de l'algorithme de mappage d'ombres particulier.

La texturation projective est simplement un moyen de transformer un objet dans l'espace de la texture (et oui, je sais que ça sonne à l'envers. Mais c'est comme ça que ça fonctionne). Les algorithmes de mappage d'ombres utilisent plusieurs types de transformations. Mais finalement, ce ne sont que des transformations d'un espace à un autre.

Lors du rendu de la carte d'ombre, vous prenez les sommets de votre géométrie et les transformez via un pipeline de rendu standard. Mais la caméra et les matrices de projection sont conçues pour la position et la direction de la lumière, pas pour la position et l'orientation de la vue.

Lorsque vous effectuez un rendu vers l'avant avec une carte d'ombres, vous rendez l'objet comme normal, transformant les sommets dans l'espace de la caméra de visualisation et à travers la matrice de projection de visualisation. Cependant, vous transformez également les sommets via votre caméra lumineuse et vos matrices de projection, en les transmettant sous forme de données par sommet au fragment shader. Il les utilise via la texturation projective pour accéder à la texture de l'ombre.

Voici le point important. L'accès à la texture projective est conçu de telle sorte que l'emplacement auquel il accède sur la texture représente la direction entre ce point de la surface (le point que vous effectuez dans le fragment shader) et la lumière. Par conséquent, il récupère le texel qui représente la profondeur à laquelle l'occlusion se produit pour le fragment en cours de rendu.

Mais ce pipeline n'a rien de spécial . Vous n'avez pas besoin de transformer les positions des sommets en texture d'ombre et de les transmettre au shader de fragment. Vous pouvez transmettre les positions des sommets de l'espace-monde au shader de fragment, puis le transformer en l'espace projectif de la texture d'ombre. Certes, vous perdriez beaucoup de performances, car vous obtiendrez exactement les mêmes coordonnées de texture. Mais c'est mathématiquement viable.

En effet, vous pouvez passer les positions des sommets de la caméra dans l'espace au shader de fragment. Il pourrait ensuite les transformer en monde, puis en espace de caméra lumineux, puis en espace de texture d'ombre projective. Vous pouvez mettre toute cette transformation dans une matrice (en fonction de votre algorithme de projection d'ombres). Encore une fois, cela vous donne exactement ce que vous aviez auparavant, donc lors du rendu direct, il n'y a aucune raison de le faire.

Mais dans le rendu différé , vous avez déjà la position des sommets caméra-espace de vue. Vous devez, sinon vous ne pouvez pas faire d'éclairage. Soit vous avez gaspillé beaucoup de mémoire et de bande passante en les écrivant dans un tampon, soit vous avez été intelligent et vous les avez recalculés en utilisant le tampon de profondeur et diverses mathématiques (que je n'entrerai pas ici, mais qui sont couvertes en ligne).

Dans les deux cas, vous avez une vue des positions de l'espace de la caméra. Et, comme indiqué ci-dessus, nous pouvons appliquer une matrice pour les transformer de l'espace de caméra de vue en espace de texture projective d'ombre. Alors ... fais ça. Accédez ensuite à votre carte fantôme.

Problème résolu.

Nicol Bolas
la source
Est-il possible d'exclure la géométrie par lumière dans le rendu différé (dans un souci d'optimisation)?
Samaursa
@Samaursa: "Exclure la géométrie par lumière" de quoi? D'entrer dans la carte des ombres? D'être allumé?
Nicol Bolas
Je vois que vous avez répondu à la question à ce sujet, merci. Pour les autres, s'ils veulent suivre la question / réponse: gamedev.stackexchange.com/q/178755/2287
Samaursa