현실감있는 텍스처에서 4 텍셀 이웃을 샘플링하는 동안 "2x nearest-neighbor upscaling 및 선형 샘플링"효과를 얻을 수 있습니다. 그런 다음 수동으로 쌍 선형 보간을 구현해야합니다. OpenGL 4+를 타겟팅하는 경우 this issue을 염두에두고 textureGather()
이 유용 할 것입니다. 아래 제안 된 솔루션에서 textureGather()
이 아닌 4 texelFetch()
호출을 사용합니다. textureGather()
은 상당히 복잡합니다.
이미 존재하는 글리프 주위에 검정 테두리가있는 비 눈금 텍스처가 있다고 가정합니다.
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 = ...
의 좌표가 있다고 가정하자