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.