« Programmation avec la SDL/Les textures » : différence entre les versions

Contenu supprimé Contenu ajouté
Page créée avec « {{En travaux}} {{Programmation avec la SDL}} À présent que vous savez manier le renderer (si vous avez réussi les deux TPs, vous devez même être devenu expert en la... »
 
Ajout du paragraphe Dessiner sur une texture
Ligne 6 :
==Qu'est-ce qu'une texture?==
Une texture est en quelque sorte un rectangle de pixels indépendant du renderer. Si l'on dispose déjà de toutes les fonctions de dessin dont on a besoin pour le renderer, les textures restent d'un importance fondamentale car elles permettent de tracer un dessin ou de charger une image une bonne fois pour toute puis de l'utiliser à notre guise sans avoir à tout recommencer, comme ce serait le cas pour le renderer.
 
==Créer une texture==
Pour créer une nouvelle texture de taille 200x100 pixels, il suffit d'écrire
<source lang="c">
SDL_Texture *maTexture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888, SDL_TEXTUREACCESS_TARGET,200,100);
</source>
 
Détaillons rapidement les arguments de cette fonction :
*On nous demande le renderer correspondant, jusqu'ici rien d'inquiétant.
*Le format de pixel : il en existe des dizaines mais il ne sert à rien de les énumérer ici. Nous nous contenterons de dire que ce format permet de coder la couleur avec quatre nombres entre 0 et 255 (ce qui correspond à 8 octets, ce qui explique le "8888") dans l'ordre suivant : rouge (Red), vert (Green), bleu (Blue), transparence (Alpha) d'où le "RGBA".
*Les restrictions d'accès : si vous remplacez SDL_TEXTUREACCESS_TARGET par autre chose, vous ne pourrez presque rien faire avec votre texture. Cet argument permet à la texture de se comporter comme un renderer.
*Les dimensions de la texture : ici 200 de largeur et 100 de hauteur.
 
==Dessiner sur une texture==
Voilà une nouvelle qui devrait vous rendre euphorique : les fonctions de dessin sur les textures sont strictement les mêmes que celles du renderer. Seulement, si vous êtes observateur, vous aurez remarqué que les fonctions de dessin que nous avons vues dans le chapitre précédent font appel au type ''SDL_Renderer*'' et non au type ''SDL_Texture*''. En fait, la fonction '''SDL_SetRenderTarget''' va nous permettre de changer temporairement ce qui va être affecté par les modifications. Voici le prototype de '''SDL_SetRenderTarget''' :
<source lang = "c">
int SDL_SetRenderTarget(SDL_Renderer* renderer, SDL_Texture* texture);
</source>
 
La fonction renvoie 0 si tout s'est bien passé et une valeur négative sinon (par exemple si SDL_TEXTUREACCESS_TARGET n'a pas été donné en argument lors de la création de la texture). La texture donnée en argument recevra alors toutes les modifications qui aurait du être reçues par ''renderer''. Pour que les modifications affectent de nouveau le renderer et plus la texture, on envoie l'argument NULL à la place de la texture. Attention, il est impératif, une fois que l'on a fini de modifier la texture, de rappliquer les modifications au renderer.
 
Ainsi, si l'on veut dessiner un trait oblique de couleur rouge dans la texture de taille 200x100, on procède ainsi :
<source lang = "c">
SDL_Texture *texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_RGBA8888,SDL_TEXTUREACCES_TARGET,200,100);
SDL_RenderDrawColor(renderer,255,0,0,255);
SDL_SetRenderTarget(renderer, texture); //on modifie la texture
SDL_RenderDrawLine(0,0,200,100);
SDL_RendererTarget(renderer, NULL);// Dorénavent, on modifie à nouveau le renderer
</source>
 
Bien que ce ne soit que rarement utile, sachez que vous pouvez récupérer la texture subissant les modifications de ''renderer'' en utilisant
<source lang= "c">
SDL_Texture *texture_modifiee = SDL_GetRenderTarget(renderer);
</source>