Exemples d'utilisation des pixels shaders 2.0 avec directx 9.0

Description

Voici quelques exemples d'utilisation des pixel shaders.
Ce programme initialise succintement direct3D et ses objets, et montre comment créer et charger dans la mémoire vidéo des pixels shaders.
Neuf (F1 -> F9) effets graphiques montrent la puissance des shaders.

Un pixel shader est un programme executable par la carte graphique. Après avoir déterminé les pixels à modifier sur le backbuffer suite au rendu d'une face ou d'un sprite, la carte graphique appelle pour CHAQUE pixel le pixel shader. Celui-ci contrôle donc intégralement la couleur de ces pixels !

Je vous laisse analyser les codes en assembleur et leurs commentaires. Sachez juste qu'un registre assembleur est un vecteur de 4 floats, chacune des composantes est accessible dans l'ordre par .x .y .z et .w ou .r .g .b .a (respectivement équivalents). Les ri sont les registres utilisables dans le code, les ti sont les registres envoyés aux pixels shaders par les vertex shaders ou par les fonctions comme le draw du sprite, les si correspondent aux slots pour les textures (SetTexture(3, pTexture) dans le code en C++. La texture sera accessible par le pixel shader via le slot s3).

F1: texture, pixel = pixel aux coordonnées uv du backbuffer à la couleur de celui de la texture aux mêmes coordonnées texture uv
F2: blur, pixel = moyenne de 4 pixels qui l'entourent (pas forcement les voisins immédiats, la coordonnées x de la souris modifie la distance du pixel aux 4 autres)
F3: texture coordinates, pixels = couleur équivalente aux coordonnées de la souris ('rg'ba == 'xy'zw)
F4: niveaux de gris, pixel = 0.299 * R + 0.587 * G + 0.114 * B sur chacune de ses composantes rgb du pixel (de la texture aux même coord uv)
F5: idem, mais dépend de la distance du pixel au curseur
F6: mix de textures, la position x du curseur modifie l'importance d'une texture par rapport à l'autre
F7: saturation de couleur : interpolation linéaire saturée (coef pas dans 0-1) entre couleur du pixel et son gris
F8: saturation de lumière, plus la souris est proche du pixel, plus celui-ci est eclairé
F9: noir et blanc, la position x du curseur modifie le niveau de comparaison de la couleur pour determiner noir ou blanc

Conclusion :


Ce programme ne fonctionne que sur les ordinateurs possédant directX 9 et une carte vidéo à shader programmable 2.0 (exemple ati radeon 9600 ou sup).
Si la compilation échoue malgré la compatibilité de votre carte vidéo, c'est à cause de la version du SDK de DirectX, je n'ai pas la dernière. Aidez-vous du debugger pour connaître les modifications (très légères généralement par exemple nombre de paramètres d'une fonction directX) à apporter pour pouvoir compiler correctement.

Merci de laisser des commentaires !
N'hésiter pas non plus à proposer des effets graphiques que je posterai aussi vite que possible.
Les effets ne se font qu'en une passe (1 seul appel de pixel shader). Je fais une version à plusieurs passes et je mets à jour le source si ça ne le fait pas trop gonfler.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.