WebGLを使用して、作業中のアプリケーション内で非常に迅速に画像クライアントのサイズを変更しています。私は、縮小している画像に対して簡単な双線形フィルタリングを実行するGLSLシェーダを作成しました。このWebGL/GLSL画像のダウンサンプリングシェーダを改善するには
大部分はうまく動作しますが、サイズ変更が大規模な場合など、多くの場合があります。サムネイルを生成するために、2048x2048の画像から110x110に縮小します。これらの例では、品質は貧弱で、ぼやけています。私は、高品質のフィルタリング技術を実装したいと思います
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 /テクスチャ幅)だけであり、それぞれ高さ...
:
次のように私の現在のGLSLシェーダがある 理想的にははるかに良い結果を生むはずの[Lancosz] [1]フィルタですが、WebGLとGLSLの一般的な新機能として、GLSLを使ってアルゴリズムを実装する方法について頭を下げているようです。
誰かが正しい方向に向いていますか?
ありがとうございます。
A美しく建設された答え。ありがとうございました。あなたが投稿したコードからそこにアクセスできるはずです。乾杯! – gordyr
私は知っているだけ知っているこれは完全に動作していると結果は美しいです。不思議なことに、最良の結果を得るためにTexeloffsetを(1.0 /(destinationwidth * 3))と(1.0 /(destinationheight * 3))に設定しなければなりませんでした。私はなぜ、標準の幅/高さを使用するのが非常にぼやけた画像を作り出したのか分かりません。それにもかかわらず、今は素晴らしいです。巨大な感謝! – gordyr
@ gordyr - 聞いてよかったです。あなたは、texelWidthOffset = 3.0 /(イメージのピクセル単位のピクセル)またはtexelWidthOffset = 1.0 /(3.0 *(ピクセル単位のイメージの幅))を使用する必要があることを意味しますか?私は上記の画像をtexelWidthOffset = 1.0 /(画像の幅はピクセル)、texelHeightOffset = 1.0 /(画像の高さはピクセル)で生成しましたが、3倍の要素があればそれに合わせてください。 –