Quelques liens intéressants à ce propos :
http://http.developer.nvidia.com/GPU...gems_ch11.html
http://http.developer.nvidia.com/GPU...gems_ch14.html
http://http.developer.nvidia.com/GPU...ems3_ch10.html
Version imprimable
Quelques liens intéressants à ce propos :
http://http.developer.nvidia.com/GPU...gems_ch11.html
http://http.developer.nvidia.com/GPU...gems_ch14.html
http://http.developer.nvidia.com/GPU...ems3_ch10.html
C'est ce que j'avais commencé à faire mais il y avait trop d'aliasing.
Cette technique semble etre du cascaded shadow mapping:
http://developer.download.nvidia.com...hadow_maps.pdf
Je n'ai pas trouvé grand chose d'intéressant là dessus. Juste les explications théorique de nvidia lol.
Cette technique m'intéresse, par contre ça risque d'être assez compliqué pour plaquer toutes shadow map aux bons endroits.
Bon enfin une bonne nouvelle. A défaut de pouvoir régler le problème de plusieurs objets dans une shadow map, j'ai résolu le problème sur les coordonnées de texture du perso qui n'étaient pas bonne. En fait, lorsqu'on utilise la génération automatique des coordonnées de texture, j'ai l'impression que le résultat de cette génération s'applique à tous les objets qui sont entre leset lesCode:
1
2
3
4 glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_Q);
Donc si il y a des objets avec des glTexCoord2f ou équivalent entre ces lignes, les coordonnées de texture seront fossé (texture étirée et mal positionné dans mon cas). Pour "immuniser" les objets 3D de ces transformations, il faut faire:Code:
1
2
3
4 glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_Q);
J'ai juste une crainte avec cette technique, c'est que si il objet fait de l'ombre à un autre, l'ombre ne sera pas répercuté sur l'objet qui se prend l'ombre. Mais ce n'est qu'une supposition. Je vais faire plus de tests de ce coté là.Code:
1
2
3
4
5
6
7
8
9
10
11
12 glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); glDisable(GL_TEXTURE_GEN_Q); Model->Draw(); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glEnable(GL_TEXTURE_GEN_R); glEnable(GL_TEXTURE_GEN_Q);
Hé si je suis sûr de ce que je dis :)
Si tu met GL_LINEAR comme filtrage, tu n'auras pas un filtrage linéaire normal (ni un PCF, je me suis trompé dans mon poste précédent) mais un test shadow pour les quatres pixels voisins à la coordonnée du texel projeté et une intepolation trilinéaire des résultats. (la carte graphique sais que c'est une shadow map et que tu vas opéré un test shadow avec le COMPARE_TO_R)
Et je sais de quoi je parle, je fait du shadow mapping en projeté et aussi avec cubemap virtuelle pour le rendu des point light en single pass. ;)
Si tu veux t'en rendre compte, met GL_LINEAR en filtering de tes shadow map et tu verras bien ;)
PREUVE : page 5 du document sur la page http://developer.nvidia.com/object/h...map_paper.html
Bon ça y est le problème vis-à-vis de la texture de mon perso qui est mal plaqué est réglé. J'ai du utiliser glActiveTextureARB(GL_TEXTURE0_ARB) pour plaquer la texture du perso et glActiveTextureARB(GL_TEXTURE2_ARB) pour plaquer la shadow map sur toute la scene. La shadow map est aussi plaqué sur les objets texturé qui sont dans l'ombre.
Je vais tester ça ce soir. ça me parait super intéressant parce que niveau aliasing ma texture est dans le top 10 lol.
Je cherche aussi des idées pour faire des ombres à partir de plusieurs sources lumineuses. Typiquement, un objet éclairé par 2 lumières directionnelles qui ont des vecteurs direction différent.
Bon ça commence à donner quelque chose:
http://img9.imageshack.us/img9/856/t...ing4us1.th.jpg
Il me reste un truc que je trouve assez moche, ce sont les zones de noir entouré en bleu. A priori, c'est la shadow map et j'aimerai arranger ça. Je vais continuer à chercher.
Comme d'habitude si vous avez des pistes je suis preneur :p
Merci sebh pour l'histoire du GL_LINEAR ca m'a bien réduit l'aliasing même si c'est toujours pas parfait.
Voila un screenshot qui me fait penser que l'effet noir bizarre c'est la shadow map:
http://img23.imageshack.us/img23/445...ing5or4.th.jpg
Sur l'image du haut, le rendu avec 2 perso. Le cercle bleu montre, d'après moi, l'ombre d'une des corne de la tête du perso de droite sur la jambe du perso de gauche.
Sur l'image en bas, le rendu avec un seul perso. Il n'y a pas l'effet noir au même endroit. L'effet noir qui est au dessus est selon moi le bras gauche du perso.
Qu'en pensez vous?
Salut,
Me revoilà de vacance et j'ai réglé la plupart de mes problèmes sur le shadow mapping. Le sourire jusqu'aux oreilles donc :D. Il me reste toujours celui du post du dessus mais bon celui la je verrai plus tard. En ce moment je m'intéresse au shadow mapping avec plusieurs sources de lumière. La technique à laquelle j'ai pensé, c'est de créer une shadow map par lumière et de faire du multitexturing sur chacune des shadiow map. Mais ça ne me plait pas trop comme façon de faire. Donc j'aimerais savoir quelles sont les techniques utilisées pour faire cela?
Merci
en fait, ça dépend de comment tu gère tes lumières.
si tu fait de l'additif, alors, c'est un rendu par lumière, donc il n'y a pas trop de problèmes pour mettre ça en place.
pour les autre solution, il faut vraiment adapter en fonction de ce que tu a fait, et la, il nous faut plus de détails ;)
Je fais de l'additif effectivement. Mais en fait, je ne sais pas si je dois faire une shadow map par lumiere (ce qui veut dire que je dois attribuer une unité de texture à chaque shadow map) ou si je dois stocker tous les points de vue de toutes les lumieres dans une seule shadow map (et la je me demande comment je vais calculer la matrice de la texture pour la projeter sur le sol).
Sinon pour l'histoire de la shadow map qui est trop noire lorsqu'elle est plaqué sur les perso, j'ai pensé au blending. Mais là je me demande si le blending est possible avec le multi-texturing et avec les shadow map. Et si c'est possible comment?
en gros, si tu fait de l'additif, tu a 2 choix :
- chaque lumière a sa texture, tu fait une première passe ou tu remplis chaque depth map individuellement, puis tu fait une passe par lumière ou tu projette l'ombre de cette lumière
- tu n'a qu'une seule depth map, et pour chaque lumière, tu clear la depth map, tu la remplis et tu projette l'ombre avec la lumière
la première technique a comme aventage de necessiter moins de changement d'etat openGL (l'ensemble des ombres peuvent être rendu avec les même render state) mais est plus consommatrice en memoire car tu utilise plus de textures.
sinon, pour le rendu de plusieurs lumière à la fois avec une même depth map, ce n'est pas possible, car il faut passer par la matrice de projection de l'ombre qui est propre à chaque lumière.
Jusque là ça me va. Mais il me reste un truc que je ne comprends pas bien.
Actuellement je plaque ma shadow map sur GL_TEXTURE2_ARB.
Imaginons que j'ai 5 lumières autour de mon objet 3D. Je vais donc avoir 5 shadow map. Mais est ce que je dois plaquer chacune de ces shadow map sur GL_TEXTURE2_ARB ou est ce que la première shadow map je la plaque sur GL_TEXTURE2_ARB, la 2e sur GL_TEXTURE3_ARB, la 3e sur GL_TEXTURE4_ARB etc...?
L'autre gros soucis que j'ai c'est toujours l'histoire des taches noir (cf les derniers screenshots que j'ai posté). Lorsqu'une partie d'un de mes modèles 3D se trouve dans une zone d'ombre, cette partie est noire et je ne vois plus la texture originale. Ce que j'aimerai voir c'est 50% de la texture originale et 50% d'ombre. Comment puis-je faire cela?
Alala, je suis à 2 doigts d'y arriver. J'ai mis de coté pour le moment le shadow mapping avec plusieurs lumières car je pense que ça ne posera pas trop de problèmes. J'ai un peu du mal avec glTexEnvi et toutes les possibilités de paramétrage. Donc j'ai pas mal cherché sur le net et je suis tombé là dessus:
http://irrlicht.sourceforge.net/phpB...729737589d32cf
J'ai donc mit juste avant mon rendu final:
J'ai ensuite appliqué le code suivant pour mon unité de texture 0 (celle de la texture de mon modèle 3D):Code:
1
2
3 glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ZERO);
et pour l'unité de texture 2 (celle de la shadow map):Code:
1
2
3
4
5
6
7
8
9 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE0_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_ONE_MINUS_SRC_COLOR);
Et je me retrouve avec ça:Code:
1
2
3
4
5
6
7
8
9
10
11
12 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE1_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_PREVIOUS_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR ); glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
http://img23.imageshack.us/img23/543...apping6.th.jpg
Je trouve cette couleur rosé très jolie mais ce n'est pas tout à fait ce que je veux (mais je garde cet effet sous le coude au cas ou je voudrai faire un jeu sur barbie lol). Enfin bref, avec ce bout de code le point positif c'est que la texture du modèle se mélange bien avec celle de la shadow map (il n'y a plus ces zones noir horrible). En revanche, j'ai récupéré un autre problème qui visuellement est tout aussi horrible à savoir la couleur rosé du modèle.
J'ai essayé de faire joujou avec les valeurs des différents paramètres mais sans succès. Parfois je ne vois pas différence et d'autres fois j'ai de gros changement de rendu lorsque je fais mumuse avec glTexEnvi.
Est ce que quelqu'un a une idée d'ou ca peut venir?
Bon alors j'ai viré les 2 dernières lignes à savoir:
et voici le rendu:Code:
1
2
3 glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB); glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);
http://img530.imageshack.us/img530/6...apping7.th.jpg
Sur ce rendu j'ai 2 soucis. Le premier c'est que l'ombre est remplacé par la texture du perso (voir screenshot la zone encerclé en bleu). Le second problème c'est que tout le reste de la texture du perso (là ou il n'y pas d'ombre) semble recouverte d'une couche verte un peu comme si j'avais mit une lumière verte, ce qui n'est pas le cas.
Me revoila et apparement le shadow mapping fonctione:
http://img25.imageshack.us/img25/267...mapping.th.jpg
Mais je ne suis pas satisfait de la precision. Il y a trop d'aliasing et j'aimerais implémenter le cascaded shadow mapping pour pouvoir couvrir de grandes etendues. Donc si vous avez de la doc à ce sujet en dehors de ce qu'on peut trouver sur le site de nvidia je suis preneur.
Merci à tous.
sympa la capture, je pense bien reconnaitre le palais du tout puissant :mrgreen:
par contre il ne me semble pas être ombré par shadow mapping ?
sinon tu utilises quelle résolution de shadowmap pour générer tes ombres ?
si ça t'intéresse de faire partager ton expérience, tu pourrais créer une source assez simplifiée afin de la proposer ;)
pour le "cascaded shadowing" je pense qu'il vaudrait mieux créer un nouveau sujet et "clore" celui-ci en le mettant comme :resolu:
Et oui c'est son palais :D. Il l'est mais l'angle de vue le met pas en valeur. Si tu regarde aux extremités du screenshot tu peux voir certains objets du décor qui deviennent noir et la coupure est nette. Cette coupure correspond au frustrum de ma lumière.
C'est une shadow map de 512x512. Si je mets genre 1024x1024 ou 2048x2048, je me retrouve avec des zone de ma scene qui sont ombrés alors qu'elles ne devraient pas l'etre.
Je comptais faire partager mon code d'une manière ou d'une autre. Ca me parait etre une bonne idée ce que tu dis là. Je vais faire ca après avoir nettoyé et organisé mon code.
Oui je sais. D'ailleurs je ne me fais pas d'illusions sur la faisabilité du CSM sans shader lol. Donc ce topic est clos et résolu.
Merci à tous.
j'imagine donc qu'il doit rester un problème à résoudre dans ta procédure
je pense que c'est faisable mais le rendu sera multi-passesCitation:
Envoyé par drcd
note : tu parles de "cascaded shadow mapping" mais tu peux aussi chercher "parallel split shadow map" ou "large shadow mapping" pour trouver de la documentation intéressante sur ce vaste sujet