Tôi đang sử dụng WebGL để định lại kích thước hình ảnh của khách hàng rất nhanh chóng trong ứng dụng tôi đang thực hiện. Tôi đã viết một bóng đổ GLSL thực hiện lọc song tuyến đơn giản trên các hình ảnh mà tôi đang giảm kích thước.Tôi làm cách nào để cải thiện trình đổ bóng ảnh xuống WebGL/GLSL này
Nó hoạt động tốt cho hầu hết các phần nhưng có nhiều trường hợp thay đổi kích thước rất lớn, ví dụ: từ hình ảnh 2048x2048 xuống 110x110 để tạo hình thu nhỏ. Trong những trường hợp này chất lượng kém và quá mờ.
GLSL đổ bóng hiện tại của tôi là như sau:
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 và TexelsizeY chỉ đơn giản là (1.0/texture width) và chiều cao tương ứng ...
Tôi muốn thực hiện một kỹ thuật lọc chất lượng cao , lý tưởng là một bộ lọc [Lancosz] [1] sẽ tạo ra kết quả tốt hơn nhiều nhưng tôi dường như không thể hiểu được cách triển khai thuật toán với GLSL vì tôi rất mới đối với WebGL và GLSL nói chung.
Ai có thể chỉ cho tôi đúng hướng không?
Xin cảm ơn trước.
Một câu trả lời được xây dựng đẹp mắt. Cảm ơn bạn. Tôi sẽ có thể đạt được điều đó từ mã bạn đã đăng. Chúc mừng! – gordyr
Chỉ để cho bạn biết tôi biết điều này làm việc một cách hoàn hảo và kết quả thật đẹp. Kỳ lạ là tôi phải đặt Texeloffsets (1.0/(destinationwidth * 3)) và (1.0/(destinationheight * 3)) để có kết quả tốt nhất. Tôi không chắc tôi hiểu tại sao nhưng sử dụng chiều rộng/chiều cao tiêu chuẩn tạo ra một hình ảnh rất mờ. Bất kể nó là tuyệt vời bây giờ. Lời cảm ơn to lớn! – gordyr
@gordyr - Tốt để nghe. Bạn có nghĩa là bạn cần sử dụng texelWidthOffset = 3.0/(chiều rộng hình ảnh tính bằng pixel) hoặc texelWidthOffset = 1.0/(3.0 * (chiều rộng hình ảnh bằng pixel))?Tôi tạo ra những hình ảnh trên với texelWidthOffset = 1.0/(chiều rộng hình ảnh bằng pixel) và texelHeightOffset = 1.0/(chiều cao hình ảnh tính bằng pixel), nhưng nếu nhân tố của ba công trình cho bạn, hãy đi với nó. –