Web üzerinde çalıştığım bir uygulamada görüntüleri hızlı bir şekilde yeniden boyutlandırmak için WebGL kullanıyorum. Ben küçültüyorum görüntüleri üzerinde basit bilineer filtreleme gerçekleştiren bir GLSL shader yazdım.Bu WebGL/GLSL görüntüsünü downsampling gölgelendiricisini nasıl geliştirebilirim
Çoğu bölüm için iyi çalışıyor ancak yeniden boyutlandırmanın çok büyük olduğu birçok durum var. Bir küçük resim oluşturmak için 2048x2048 görüntüden 110x110 değerine kadar. Bu durumlarda, kalite zayıf ve çok bulanık. aşağıdaki gibi
geçerli benim GLSL Shader:
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 ve TexelsizeY
daha yüksek kalitede bir filtreleme tekniği uygulamak istiyorum ... sadece (1.0/doku genişlik) ve sırasıyla, yükseklik İdeal olarak [Lancosz] [1] filtresi çok daha iyi sonuçlar vermelidir ancak genel olarak WebGL ve GLSL için çok yeni olduğumdan GLSL ile algoritmayı nasıl uygulayacağım konusunda kafamı alamıyorum.Herkes bana doğru yönde işaret edebilir mi?
Şimdiden teşekkürler.
A güzel inşa edilmiş bir cevap. Teşekkür ederim. Göndermiş olduğunuz koddan oraya ulaşabilmem gerekir. Şerefe! – gordyr
Sadece bildiğimi bildirmek için bu mükemmel çalışıyor ve sonuçlar güzel. Garip bir şekilde Texeloffsets'i en iyi sonuç için (1.0/(destinationwidth * 3)) ve (1.0/(destinationheight * 3)) olarak ayarladım. Nedenini anladığımdan emin değilim ama standart genişlik/yükseklik kullanmak çok bulanık bir görüntü üretti. Her şeye rağmen şimdi muhteşem. Kocaman teşekkürler! – gordyr
@gordyr - Duymak güzel. Yani, texelWidthOffset = 3.0/(piksel cinsinden görüntü genişliği) veya texelWidthOffset = 1.0/(3.0 * (piksel cinsinden görüntü genişliği)) kullanmanız gerektiği anlamına mı geliyor?Yukarıdaki görüntüleri texelWidthOffset = 1.0/(piksel cinsinden görüntü genişliği) ve texelHeightOffset = 1.0/(piksel cinsinden görüntü yüksekliği) ile oluşturdum, ancak üçlü bir faktör sizin için işe yararsa, onunla birlikte ilerleyin. –