[surface_getpixel] Ottenere piu' pixel con una call

Tutorial, videotutorials ed esempi creati da noi
Rispondi
Avatar utente
Tizzio
GMI Honor
Messaggi: 5836
Iscritto il: 29/06/2010, 23:43
Specialità: programmazione
Contatta:

[surface_getpixel] Ottenere piu' pixel con una call

Messaggio da Tizzio »

Questa funzione, aggiunta nella versione 1.4 di GM:Studio è ancora non documentata sul manuale, così ne ho testato un po' il funzionamento per capire come usarla in glare engine per ottenere informazioni sull'illuminazione in un certo punto, ed ecco i risultati:

Con questa funzione, potrai ottenere informazioni su tutti i pixel di una surface, ad un costo nettamente inferiore che ciclare ogni pixel con surface_getpixel
ottenendo R G B A di ogni pixel

Procedimento

1) crea una surface e ci disegna sopra qualcosa

Codice: Seleziona tutto

 sur = surface_create(w, h);
surface_set_target(sur);
draw_clear_alpha(0, 0);
draw_sprite(my_awesome_sprite, 0, 0, 0);
surface_reset_target();
2) Crea un buffer di grandezza fissa (buffer_fixed) allineato a 4 byte, di dimensione surface_width * surface_height * 4bytes (argb) e utilizza buffer_get_surface per ottenere i dati sui pixel

Codice: Seleziona tutto

 buf = buffer_create(w*h*4, buffer_fixed, 4); 
buffer_get_surface(buf, sur, 0, 0, 0);
3) Utilizza le informazioni sui pixel come ti pare, in questo modo

Codice: Seleziona tutto

 
for(var yy=0; yy<h; yy++){
    for(var xx=0; xx<w; xx++){
        //ottengo il colore del pixel
        var col = buffer_read(buf, buffer_u32); 
        var a = (col >> 24) & 255;
        var r = (col >> 16) & 255;
        var g = (col >> 8) & 255;
        var b = col & 255;  
        
        //test di disegno del pixel ottenuto
        draw_set_alpha(a);
        draw_set_color(make_colour_rgb(r, g, b));
 
        draw_point(xx, yy);  
    }
}
N.B.
- I bytes dei colori sono sequenziati in questo modo ARGB
- I pixels sono ordinati verticalmente
Immagine

Rispondi

Chi c’è in linea

Visitano il forum: Nessuno e 5 ospiti