アップスケーリングされたテクスチャから4テクセル近傍をサンプリングするよう実際には元のものからサンプリングしている間に "2x最近傍アップスケーリングとその後の線形サンプリング"の効果を達成することができます。次に、双一次補間を手動で実装する必要があります。 OpenGL 4+をターゲットにしていた場合はを念頭に置きながら、textureGather()
が便利です。私の提案する解決策では、textureGather()
ではなく、のように4 texelFetch()
コールを使用しています。かなり複雑になります。
すでに存在するグリフの周りに黒い枠線を持つスケーリングされていないテクスチャがあるとします。
ivec2 origTexSize = textureSize(sampler, 0);
int upscaleFactor = 2;
// Floating point texel coordinate into the upscaled texture.
vec2 ptu = pn * vec2(origTexSize * upscaleFactor);
// Decompose "ptu - 0.5" into the integer and fractional parts.
vec2 ptuf;
vec2 ptui = modf(ptu - 0.5, ptuf);
// Integer texel coordinates into the upscaled texture.
ivec2 ptu00 = ivec2(ptui);
ivec2 ptu01 = ptu00 + ivec2(0, 1);
ivec2 ptu10 = ptu00 + ivec2(1, 0);
ivec2 ptu11 = ptu00 + ivec2(1, 1);
// Integer texel coordinates into the original texture.
ivec2 pt00 = clamp(ptu00/upscaleFactor, ivec2(0), origTexSize - 1);
ivec2 pt01 = clamp(ptu01/upscaleFactor, ivec2(0), origTexSize - 1);
ivec2 pt10 = clamp(ptu10/upscaleFactor, ivec2(0), origTexSize - 1);
ivec2 pt11 = clamp(ptu11/upscaleFactor, ivec2(0), origTexSize - 1);
// Sampled colours.
vec4 clr00 = texelFetch(sampler, pt00, 0);
vec4 clr01 = texelFetch(sampler, pt01, 0);
vec4 clr10 = texelFetch(sampler, pt10, 0);
vec4 clr11 = texelFetch(sampler, pt11, 0);
// Bilinear interpolation.
vec4 clr0x = mix(clr00, clr01, ptuf.y);
vec4 clr1x = mix(clr10, clr11, ptuf.y);
vec4 clrFinal = mix(clr0x, clr1x, ptuf.x);
:あなたは、私はそれをテストしていないのに、正規化テクスチャは、次のコードは、所望の効果を達成しなければならない0と1の間にある
pn.x
と
pn.y
そのテクスチャへ
vec2 pn = ...
の座標持っていると仮定しましょう