J'écris un très bibliothèque graphique simple, et j'essaie de comprendre comment faire alpha blending. Je l'ai essayé plusieurs fois, mais mes résultats étaient moins que satisfaisants. Selon Wikipedia, je dois faire:Quelle est la bonne façon d'effectuer l'alpha-blending? (C)
Valeur = (1-alpha) value0 + alpha valeur1
Mais cela ne fonctionne pas du tout. Peut-être que je fais quelque chose de mal?
Le code que j'ai inclus dessine une image colorée (c'est la fonction 'proximité'), puis tente de dessiner une boîte partiellement transparente à (100,100). Cependant, au lieu d'une boîte translucide blanche, je reçois une distorsion bizarre à l'image (je vais essayer de les avoir au bas de mon post). Aucune suggestion? Voici mon code:
#include "hgl.h"
void proximity()
{
int x = 0, y = 0, d1, d2, d3, dcenter;
while(x < WIDTH){
while(y < HEIGHT){
d1 = distance(x, y, (WIDTH/2) - 200, (HEIGHT/2) + 200);
d2 = distance(x, y, (WIDTH/2) + 200, (HEIGHT/2) + 200);
d3 = distance(x, y, (WIDTH/2), (HEIGHT/2) - 150);
dcenter = distance(x, y, WIDTH/2, HEIGHT/2);
putpixel(x, y, d1, d2, d3);
y++;
}
y = 0;
x++;
}
}
int alpha_transparency(float alpha, float value1, float value2)
{
return (1-alpha) * value1 + alpha * value2;
}
void transparent_box(int pos_x, int pos_y, int width, int height, float alpha, char r, char g, char b)
{
int x = 0, y = 0;
while(x < width)
{
while(y < height)
{
int rr, rg, rb;
rr = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].r, r);
rg = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].g, g);
rb = alpha_transparency(alpha, p.bitmap[x+pos_x][y+pos_y].b, b);
putpixel(pos_x + x, pos_y + y, rr, rg, rb);
y++;
}
x++;
y = 0;
}
}
int main()
{
fp = fopen("out.bmp","wb");
set_dimensions(1440, 900);
insert_header();
white_screen();
proximity();
transparent_box(100, 100, 500, 500, .9, 255, 255, 255);
insert_image();
fclose(fp);
return 0;
}
Désolé, je n'ai pas pu inclure la sortie parce que je suis un nouvel utilisateur. Cependant, voici les liens:
Picture with "transparent" box
Pour commencer, vous mélangez flotteurs et ints sans coulée explicite. En particulier votre fonction alpha_transparency est déclarée comme retournant un int mais retourne un float. Est-ce que C sait convertir automatiquement la valeur de retour? – phkahler
C sait convertir automatiquement la valeur de retour. Cela peut vous causer des problèmes si elle tronque automatiquement une fraction à 0. –
Voir cette question précédente: http://stackoverflow.com/questions/1944095/how-to-mix-two-argb-pixels –