[DirectX] faire un blur d'une scéne

Hello,

J’ai programmé un petit moteur 3D et j’ai une question: j’aimerai passer un filtre sur une scéne (genre blurrer l’image.), pour faire ça j’ai essayé la méthode suivante:

  • rendre la scéne dans une texture.
  • Locker la texture.
  • Blurrer
  • Délocker la texture.
  • L’afficher.

Malheureusement j’ai un soucis: avec DirectX on ne peut pas locker une texture qui est utilisée comme cible pour le rendu en texture.

Quelqu’un a deja rencontré ce probleme?

ouais mais bon mon moteur 3D fait encore un peu pitié en ce moment: il se traine et offre pas beaucoup plus qu’un wrapper D3D, donc rien de révolutionnaire… Mais il est bien structuré donc je l’ameliore petit a petit, et petit a petit il deviendra moins petit comme on dit.

Y’a des screenshots sur ma home page, mais rien de bluffant. j’ai aussi une vie a coté de l’informatique :frowning:

et si tu as des petites demos sympa hesite pas a faire partager :frowning:

ok j’y vois un peu plus clair. merci pour ces infos et ces liens. Je vais faire ça en hard quand même, je pense. De plus hier soir j’ai découvert le stencil buffer, et je pense qu’on peut faire pleins d’effets rigolos avec ce truc la.

merci.

apres relecture de l’article (
http://www.gamasutra.com/features/20010209/evans_01.htm), et consultations de mon brainteam d3d8 :slight_smile: :

oui effectivement, il parle de locker la texture et de faire le blur a la mains, mais :
a) c pas supporter par la moitier des cartes sur le marcher
B) le transfert est vraiment tresssss lent
c) le blur en lui meme, meme si l’algo est simple, est lui aussi tresssss lent
d) c quand meme un peu idiot de faire du blur et du blending a la main alors que toutes les cartes le font en hardware.

mais c vrais, ca devrait etre faisable :slight_smile:

(et y a que les imbeciles qui ne changent pas d’avis :slight_smile: )

Il faut chercher un article d’Alex Evans (un des gars de Lionhead) sur les effets de flou, publié sur Gamasutra.com. Et ce qui me surprend, c’est que sa méthode ressemble à la tienne, et qu’il bosse bien sous DirectX.

Une des alternatives qu’il propose est de créer des copies de la texture dans des résolutions inférieures (comme des mipmaps) et de les recoller en semi-transparent sur l’écran. Quand t’en empiles assez, ça ressemble à un flou gaussien, et en bidouillant un peu, on peut faire un flou dépendant de la profondeur de champ…

bon alors si c’est mal, on va pas le faire :slight_smile:

Sinon bon je pensais que il y avait quand meme une solution… mais tu as l’air de bien connaitre ton affaire donc je vais te faire confiance :wink:

merci pour tes précieuses réponses.

nan y a pas vraiment d’autre moyens, mais meme sans vertex shader, si tu melange avec creativite les blending modes, les changement de tailles (genre je rends dans plus petit, ou je rends dans plus grands), les colors/alphas values de tes polys, et la facons de les rendres (tu es pas obliger de faire deux grands polys, tu peux faire plein de petit avec du « bruit » dans les uv, ou des sinus ou des trucs quoi ), tu peux deja faire enaurmement d’effets dont le blur progressif, les effets « lens », le motion blur et autres effets fullscreen bizarre :slight_smile:

et de toute facons, globalement, faire redescendre une texture de la vram pour la retaper : c MAL :wink:

mmh mouais, disons que le blur est un exemple j’aimerai pouvoir faire pleins de trucs differents… deja rien qu’un blur progressif: au debut c’est net et ça devient de plus en plus flou… etc … ou alors changer des pixels… Je sais que je peux faire ça avec des pixels shaders, mais ma carte le supporte pas, alors bof.

Genre dans les demos ils font comment? il n’y a pas de moyen?

Ton truc de rendre dans une texture 320x200 etc… ça marche dans un cas précis, mais ya pas un autre moyen? meme si c’est lent?

bah oui : le problem c que ta texture de destination, comme tu t’en sers comme « cible », elle est dans la carte video, et sur la plus part des hardwares, faire « redescendre » la texture, c mal, voir pas possible, donc solutions :
plutot que de faire ton blur « a la mains », tu reutilise ton rendu pour refaire un rendu :
step 1 : rendre ta scene dans une texture 320200 (c un example :wink: )
step 2: la mapper sur dexu gros poly foulle screen (donc en 800
600, par ex.) en utilsant le bilinear filtering, et la, hop, magie, blur :stuck_out_tongue:
(et sinon tu peux aussi fair ton post-proc en utilisant un pixel shader :smiley: )