Bonjour,

J'ai une application qui utilise ID3DXSPRITE pour rendre tous les éléments graphiques.

Ca fait schématiquement:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
lpDirect3DDevice9->BeginScene();
 
lpSprite->Begin(D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE | D3DXSPRITE_SORT_DEPTH_FRONTTOBACK);
 
for (int i = 0; i < mySprites.size(); i++)
    lpSprite->Draw(mySprites[i]->...);
 
lpSprite->End();
 
lpDirect3DDevice9->EndScene();
Tout marche bien.

Maintenant, je voudrais améliorer un peu le rendu final en utilisant quelques pixel shaders pour faire des effets de lumières et de distorsion sur la scène rendue, en utilisant comme base d'autres sprites (leur texture) et en mixant le tout.

J'ai donc rajouté une seconde passe de dessin de sprites après la première et avant le EndScene(), en ayant activé mon shader.

Le problème, qui traduit le fait que je ne comprends pas grand chose aux pixel shaders, est que je n'ai en entrée de ma fonction ps_main que les pixels de les texture des sprites de la seconde passe, autrement dit:
je n'arrive pas à accéder les pixels de la scène déjà rendue pour y appliquer mon effet.

D'après ce que j'ai lu, c'est impossible à faire tel quel.
Il semblerait qu'il soit préconisé de rendre toute la scène dans une texture (grande comme l'écran ! ce qui me semble gourmand en mémoire vidéo), pour pouvoir y appliquer le shader.

D'où mes questions (enfin): est-la bonne approche ?
Si oui, comment faire ça ? En utilisant le SetRenderTarget ? Le fait de passer par une surface n'est-il pas long ?
Et question subsidiaire: une fois cela fait, comment accéder aux pixels de cette fameuse texture en même temps que ceux du sprite (de la seconde passe) que je suis en train de rendre, le pixel shader ne semble prendre qu'une seule texture en entrée ...

Voilà, désolé pour le long post mais je ne trouve vraiment pas grand chose sur le net comme info, et vue que ça me semble assez "basique" comme requête, je dois passer à côté de quelque chose.

Merci de votre aide,
K.