2013-08-06 12 views
5

Sono nuovo di Renderscript e ho problemi con il mio primo script. Per quanto posso vedere (dalle dichiarazioni di debug che ho inserito) il mio codice funziona bene, ma i valori calcolati vengono manomessi quando vengono copiati nuovamente in Bitmap dal metodo Allocation.copyTo (Bitmap).Allocation.copyTo (Bitmap) valori di pixel corrompenti

mi è stato sempre i colori strani fuori, così alla fine ridotta mio script per questo campione che mostra il problema:

void root(const uchar4 *v_in, uchar4 *v_out, const void *usrData, uint32_t x, uint32_t y) 
{ 
    *v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 1.f); 

    if (x==0 && y==0) { 
     rsDebug("v_out ", v_out->x, v_out->y, v_out->z, v_out->w); 
    } 
} 

Qui stiamo solo scrivendo un pixel rosso opaco. La riga di debug sembra stampare il valore corretto (255 0 0 255) e infatti ottengo un pixel rosso nella bitmap.

Tuttavia se cambio l'alfa sul pixel rosso leggermente:

*v_out = rsPackColorTo8888(1.f, 0.f, 0.f, 0.998f); 

Le stampe di debug (255 0 0 254) che sembra ancora corretta, ma il valore di pixel finale finisce per essere (0 0 0 254) cioè. nero.

Ovviamente ho il sospetto che si trattasse di un problema alfa di tipo premullato, ma la mia comprensione è che le routine di allocazione da copiare da e verso Bitmap dovrebbero gestirla per voi. Almeno questo è quello che Chet Haase suggerisce in questo post del blog: https://plus.google.com/u/0/+ChetHaase/posts/ef6Deey6xKA.

Inoltre, nessuno degli script di calcolo di esempio disponibili sembra menzionare alcun problema con l'alfa moltiplicato. Il mio script era basato sull'esempio HelloComputer dell'SDK.

Se sto commettendo un errore, mi piacerebbe un guru della RS segnalarlo per me.

È un peccato che dopo 2 anni la documentazione di Renderscript sia ancora così scarsa.

PS. Le bitmap che sto usando sono ARGB_888 e sto costruendo e puntando su SDK18 (Android 4.3)

+0

che dire se modifichi solo i valori rgb e non l'alfa? –

+0

Sta cambiando l'alfa che è il problema. Probabilmente non l'ho chiarito. Finché alpha si converte in 255, tutto va bene. Se è qualcos'altro, i pixel vengono storpiati. –

+0

Poiché altri esempi sembrano funzionare bene per altre persone, mi chiedo se si tratta di un problema di Android 4.3 o forse di ADT 20.0.5. –

risposta

3

L'esempio funziona bene perché l'esempio non modifica alfa.

Se si intende modificare alpha e quindi utilizzare l'allocazione come bitmap normale, è necessario restituire (r * a, g * a, b * a, a).

Tuttavia, se si invia l'allocazione a una superficie GL che non è pre-moltiplicata, il codice funzionerà così com'è.