我正在使用WebGL來在我正在開發的應用程序中快速調整客戶端的圖像大小。我寫了一個GLSL着色器,對我縮小的圖像執行簡單的雙線性過濾。我該如何改進這個WebGL/GLSL圖像下采樣着色器
它在大多數情況下工作正常,但有很多情況下調整大小是很大的,例如,從2048x2048圖像下降到110x110,以便生成縮略圖。在這些情況下,質量很差,太模糊。
我當前GLSL着色如下:
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和TexelsizeY只是(1.0 /紋理寬度)和高度分別...
我想實現更高質量的濾波技術,理想情況下是[Lancosz] [1]濾波器,它應該會產生更好的結果,但我似乎無法理解如何使用GLSL實現算法,因爲我一般對WebGL和GLSL都很陌生。
有人能指出我正確的方向嗎?
在此先感謝。
一精美的答案。謝謝。我應該能夠從你發佈的代碼中獲得。乾杯! – gordyr
只爲讓你知道我知道這個工作完美,結果是美麗的。奇怪的是,爲了獲得最佳效果,我必須將Texeloffsets設置爲(1.0 /(目標寬度* 3))和(1.0 /(目標高度* 3))。我不確定我是否理解爲什麼,但使用標準的寬度/高度產生了非常模糊的圖像。無論現在它是神話般的。非常感謝! – gordyr
@gordyr - 很高興聽到。你的意思是你需要使用texelWidthOffset = 3.0 /(像素的圖像寬度)或texelWidthOffset = 1.0 /(3.0 *(像素的圖像寬度))?我用texelWidthOffset = 1.0 /(像素的圖像寬度)和texelHeightOffset = 1.0 /(像素的圖像高度)生成了上面的圖像,但如果三個因子適用於您,請使用它。 –