Sto utilizzando WebGL per ridimensionare le immagini del client molto velocemente all'interno di un'app su cui sto lavorando. Ho scritto uno shader GLSL che esegue un semplice filtro bilineare sulle immagini che sto ridimensionando.Come migliorare questo shader di downsampling di immagini WebGL/GLSL
Funziona bene per la maggior parte, ma ci sono molte occasioni in cui il ridimensionamento è enorme per es. da un'immagine 2048x2048 fino a 110x110 per generare una miniatura. In questi casi la qualità è scarsa e troppo sfocata.
mio attuale Shader GLSL è la seguente:
uniform float textureSizeWidth;\
uniform float textureSizeHeight;\
uniform float texelSizeX;\
uniform float texelSizeY;\
varying mediump vec2 texCoord;\
uniform sampler2D texture;\
\
vec4 tex2DBiLinear(sampler2D textureSampler_i, vec2 texCoord_i)\
{\
vec4 p0q0 = texture2D(textureSampler_i, texCoord_i);\
vec4 p1q0 = texture2D(textureSampler_i, texCoord_i + vec2(texelSizeX, 0));\
\
vec4 p0q1 = texture2D(textureSampler_i, texCoord_i + vec2(0, texelSizeY));\
vec4 p1q1 = texture2D(textureSampler_i, texCoord_i + vec2(texelSizeX , texelSizeY));\
\
float a = fract(texCoord_i.x * textureSizeWidth);\
\
vec4 pInterp_q0 = mix(p0q0, p1q0, a);\
vec4 pInterp_q1 = mix(p0q1, p1q1, a);\
\
float b = fract(texCoord_i.y * textureSizeHeight);\
return mix(pInterp_q0, pInterp_q1, b);\
}\
void main() { \
\
gl_FragColor = tex2DBiLinear(texture,texCoord);\
}');
TexelsizeX e TexelsizeY sono semplicemente (1.0/larghezza texture) e l'altezza rispettivamente ...
Vorrei implementare una tecnica di filtraggio qualità superiore , idealmente un filtro [Lancosz] [1] che dovrebbe produrre risultati molto migliori ma non riesco a capire come implementare l'algoritmo con GLSL poiché sono molto nuovo a WebGL e GLSL in generale.
Qualcuno potrebbe indicarmi la giusta direzione?
Grazie in anticipo.
A risposta splendidamente costruita. Grazie. Dovrei essere in grado di arrivarci dal codice che hai postato. Saluti! – gordyr
Solo per farti sapere, so che questo funziona perfettamente ed i risultati sono belli. Stranamente ho dovuto impostare gli offset di Texel su (1.0/(destinationwidth * 3)) e (1.0/(destinationheight * 3)) per i migliori risultati. Non sono sicuro di aver capito perché, ma utilizzando la larghezza/altezza standard abbiamo prodotto un'immagine molto sfocata. Indipendentemente da ciò è favoloso ora. Enorme grazie! – gordyr
@gordyr - Buono a sapersi. Vuoi dire che dovevi usare texelWidthOffset = 3.0/(larghezza dell'immagine in pixel) o texelWidthOffset = 1.0/(3.0 * (larghezza dell'immagine in pixel))?Ho generato le immagini di cui sopra con texelWidthOffset = 1.0/(larghezza dell'immagine in pixel) e texelHeightOffset = 1.0/(altezza dell'immagine in pixel), ma se un fattore tre funziona per te, vai con esso. –