1

Bonjour

Une question pour ceux qui maitrise la SDL mieux que moi....
Peux t'on avoir une valeur alpha pour caque pixel différent ?
genre si je fais un
putpixel(surface,x,y,SDL_MapRGBA(fire->format,255,255,255,i));
ou 'i' est la valeur de l'apha...ça ne marche pas... sad
Quelqu'un aurait il une idée ?
Merci
Thy

2

Oui on peux. Mais il me semble que SDL ne sait gérer ça qu'à niveau surface et non pixel.

1. Créer une surface en indiquant un masque pour l'alpha.
2. Préparer la surface avec la couleur et la valeur alpha pour chaque pixel. Ça peux se faire manuellement. On peux aussi utiliser SDL_image pour charger un PNG avec toutes les composantes.
3. Tu blitte ta surface sur l'écran ou une autre surface.

3

Au fait, c'est pourquoi que tu veux de l'antialiasing? c'est pour du texte?
Si c'est le cas, j'ai qq chose qui pourrait t'intéresser.

4

Merci Oankali ! VOilà comment je procède


fire=SDL_CreateRGBSurface(SDL_HWSURFACE|SDL_SRCALPHA, 640, 480, 32, 0, 0, 0, 0);
ensuite je trace mon dessin en utilisant
putpixel(fire,x,y,SDL_MapRGBA(fire->format,255,255,255,i));
et je finis par afficher
SDL_BlitSurface(fire, NULL, screen, NULL);

mais helas ça ne fonctionne pas... C'est bien comme ça que tu m'as dit de faire non ?

5

Oankali :
Au fait, c'est pourquoi que tu veux de l'antialiasing? c'est pour du texte?
Si c'est le cas, j'ai qq chose qui pourrait t'intéresser.

non, non c'est pas pour le text mais ton truc peut peut ête m'interesser grin

6

le hardware le fait deja si tu avais lu la doc technique si tu le fait en software tu vas ralentir ton jeux sad

7

progfr :
le hardware le fait deja si tu avais lu la doc technique si tu le fait en software tu vas ralentir ton jeux sad

de quoi tu parle là ?


moi je me demande si la fonction putpixel gère l'alpha....
voici le code... si quelqu'un sait comment l'implémenté
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
{
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;

switch(bpp) {
case 1:
*p = pixel;
break;

case 2:
*(Uint16 *)p = pixel;
break;

case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;

case 4:
*(Uint32 *)p = pixel;
break;
} }

8

Il y a plussieurs chose, coment initialyse tu ton screen ?

screen = SDL_SetVideoMode(640, 640, 32, SDL_SWSURFACE);
de cette manière tu es sûr d'avoir du 32 bit .

Pour fire, n'oublie pas tes mask !!

fire=SDL_CreateRGBSurface(SDL_SRCALPHA, 255, 255, 32, rmask, gmask, bmask, amask);
avec au préalable tes définitions:

Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000;
gmask = 0x00ff0000;
bmask = 0x0000ff00;
amask = 0x000000ff;
#else
rmask = 0x000000ff;
gmask = 0x0000ff00;
bmask = 0x00ff0000;
amask = 0xff000000;
#endif

Voici donc une mini démo ou le fil rouge disparait progressivement, le bleu apparait progressivement :

int main(int argc, char *argv[]) {
SDL_Surface *screen,*Rect,*fire;
SDL_Rect dest;
unsigned i;
Uint32 rmask, gmask, bmask, amask;
#if SDL_BYTEORDER == SDL_BIG_ENDIAN
rmask = 0xff000000; gmask = 0x00ff0000; bmask = 0x0000ff00; amask = 0x000000ff;
#else
rmask = 0x000000ff; gmask = 0x0000ff00; bmask = 0x00ff0000; amask = 0xff000000;
#endif
screen = SDL_SetVideoMode(640, 640, 32, SDL_SWSURFACE);
fire=SDL_CreateRGBSurface(SDL_SRCALPHA, 255, 255, 32, rmask, gmask, bmask, amask);
for (i=0;i<255;i++)
{
putpixel(fire,i+1,i+1,SDL_MapRGBA(fire->format,0,0,255,i));
putpixel(fire,i+1,100,SDL_MapRGBA(fire->format,255,0,0,255-i));
}
//et je finis par afficher
SDL_BlitSurface(fire, NULL, screen, NULL);
SDL_UpdateRect(screen, 0, 0,0,0);
sleep(9);
}
avatar :*)

9

Merci beaucoup Bille2

Je pensais au depart que le masque lors de la creation d'une surface était pour donner une couleur de remplissage....mais apparement c'est pas le cas. ça fonctionne super. Merci beaucoup ! Il me reste encore beaucoup a apprendre en C et surtout avec la SDL !
Histoire de comprendre ce que je fais , l'histoire de BigEndian si j'ai bien compris c'est là façon dont est stocké l'information dans la mémoire...et en fonction de si le poinf faible est devant ou a la afin ...c'est ça ? Et le mask qu'on envoie il dit quoi lui ? il sert juste a informer ou se trouve la valeur de R, G,B c'est ça ?
Merci beaucoup en tout cas ...

10

Quel kador ce Bille2 smile Dorénavant je l'appellerai maître wink

11

thyphoon :
Merci beaucoup Bille2


Histoire de comprendre ce que je fais , l'histoire de BigEndian si j'ai bien compris c'est là façon dont est stocké l'information dans la mémoire...

C'est cela. Quand les gens on commencé à fabrique des processeurs, cerainn voulait que cela sois plus facilement lisible par l'homme, d'autre plus facilement lisible par le process.
Savoir si c'est Big ou Little qu'il faut choisir cela dépend de la famille de ton process.
Du coup x86 et PowerPC sont exemple d'usage de Big et Little.

Et le mask qu'on envoie il dit quoi lui ? il sert juste a informer ou se trouve la valeur de R, G,B c'est ça ?

Oui c'est pour réparit les plages rouge, vert, bleu et alpha. Ces masques répartissent les 255 elements de chaque type pour chaque plage.
avatar :*)

12

Pékélé :
Quel kador ce Bille2 smile Dorénavant je l'appellerai maître wink



Désolé Pékélé ... la modestie me l'inderdit depuis que je suis né. hehe tripaf
avatar :*)

13

Si je ne m'abuse, le problème de ta solution, c'est que tu ne tiens pas compte des capacités du hardware, ce qui fera qu'à la fin, SDL aura à convertir la surface à chaque fois que tu appelle SDL_UpdateRect().
Mois j'utilise une autre solution, mais je ne sait pas laquelle est la plus rapide. Il faudra que je fasse des essais.