Dx9 & vb.net : exemple hlsl (shaders)


Description

Bonjour tout le monde, voici un petit code source qui n'a pour but que de montrer comment utiliser les Vertex et PixelShaders avec VB.Net, et DirectX9.

ATTENTION ! Ce code n'a pas pour but de vous montrer tout HLSL, il ne s'agit que d'un petit exemple pour vous montrer comment mettre en place des Shaders et comment programmer ces Shaders. Pour avoir plus d'informations sur la programmation des Shaders, vous avez ce liens ci qui est en français :
http://www.microsoft.com/france/msdn/technologies/technos/directx/info/info.asp?mar=/france/msdn/technologies/technos/directx/info/20031009-intro-shaderx-1.html

Ce que fait exactement le programme :
- Il créé un VertexBuffer composé de 2 Triangles
- Il charge une Texture au format JPG
- Il charge et compile un VertexShader et un PixelShader
- Il dessine les Triangles texturés en appliquant des déformations sur la texture

Les triangles sont créés de manière à ne pas avoir à les transformer, les coordonnées des Vertex sont donc données comme "coordonnées d'écran" (le coin suppérieur gauche = [-1 ; 1] et le coin inférieur droit = [1 ; -1])

Ce que fait le VertexShader exactement :
- Il reçoit des coordonnées 3D qu'il retourne sans appliquer la moindre transformation.
- Il reçoit également des coordonnées de texture qu'il retourne sans effectuer le moindre calcul.

Ce que fait le PixelShader exactement :
- Il dispose d'un jeu de coordonnées de texture
- Il calcule un vecteur de modification de ces coordonnées pour effectuer des déformations tel que :
Modificateur.x = 0
Modificateur.y = sin( CoordonneeTexture.y * 8 ) * Coef
(Le coefficient est une variable globale définie par l'application qui permet de faire varier dynamiquement l'ampleur de la déformation, et le 8 est là pour augmenter le nombre de vagues sur l'image)
- Il retourne comme couleur de pixel, la couleur du texel dont les coordonnées correspondent à :
CoordonneeTexture.x + Modificateur.x
CoordonneeTexture.y + Modificateur.y

Le résultat vous pouvez le voir dans la capture d'écran où vous avez l'effet appliqué à 3 moments différents (ça rend quand meme mieux quand c'est animé).

Voilà a peu près tout est expliqué, j'ai essayé de commenter au mieux mais si vous avez des questions ou quoi que ce soit n'hesitez pas a me demander.

Je profite de ce code source pour passer un petit message à tous ceux qui désirent faire de la 2D avec DirectX 9. Vous pouvez créer des Shaders tel que celui présenté ici pour créer des effets spéciaux en tout genre. Pour faire de la 2D, vous avez besoin de textures, ces textures devront être appliquées sur des triangles (2 triangles suffisent pour dessiner un rectangle). L'exemple de code ici présent vous montre comment charger une texture, et comment créer vos triangles.

Pour ce qui est de déplacer facilement vos objets sans avoir à bloquer tous vos VertexBuffers à chaque image, vous avez la possibilité de définir, au seing du code des Shaders, une variable globale qui correspond à la position de l'objet sur l'écran, ainsi qu'une autre permettant de changer les coordonnées de texture (ceci vous permettant d'utiliser des "sprites"). Ainsi vous n'avez a chaque image qu'à définir la valeur de ces variables globale et le tour est joué.

Petite remarque relative aux Textures : on peut ne pas créer de texture carrée, mais les dimensions des textures doivent être en puissance de 2 : ... 64, 128, 256, 512 ...
Donc on peut très bien créer une texture de dimension 128x256, mais créer une texture de dimensions 100x100 ou 100x256 par exemples générera une erreur.

Conclusion :


Voilà enfin je précise que si j'ai mis 3 comme niveau c'est parce que niveau code VB, il y a vraiment rien de vraiment nouveau, la seule chose un peu compliquée est de rédiger un Shaders dans un langage proche du C qui est pas forcément toujours connu des développeurs VB.

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.