76 lines
2.1 KiB
GLSL
76 lines
2.1 KiB
GLSL
// -------------------------------------------------------
|
|
// CHEditor WebGL Fragment Shader
|
|
// -------------------------------------------------------
|
|
precision highp float;
|
|
|
|
uniform sampler2D u_image;
|
|
uniform vec2 u_resolution;
|
|
uniform vec2 u_srcResolution;
|
|
|
|
vec4 getTextureColor(vec2 loc) {
|
|
return texture2D(u_image, loc / u_srcResolution);
|
|
}
|
|
|
|
void main() {
|
|
vec2 ratio = u_srcResolution / u_resolution;
|
|
vec2 ratioHalf = ceil(ratio / 1.0);
|
|
vec2 loc = gl_FragCoord.xy;
|
|
|
|
loc.y = u_resolution.y - loc.y;
|
|
|
|
float weight = 0.0;
|
|
float weights = 0.0;
|
|
float weights_alpha = 0.0;
|
|
vec3 gx_rgb = vec3(0.0);
|
|
float gx_a = 0.0;
|
|
float center_y = (loc.y + 0.5) * ratio.y;
|
|
|
|
float y = floor(loc.y * ratio.y);
|
|
float y_length = (loc.y + 1.0) * ratio.y;
|
|
|
|
for (int i = 0; i < 5000; i++) {
|
|
if (y >= y_length) {
|
|
break;
|
|
}
|
|
float dy = abs(center_y - (y + 0.5)) / ratioHalf.y;
|
|
float center_x = (loc.x + 0.5) * ratio.x;
|
|
float part_w = dy * dy;
|
|
float x = floor(loc.x * ratio.x);
|
|
float x_length = (loc.x + 1.0) * ratio.x;
|
|
|
|
for (int j = 0; j < 5000; j++) {
|
|
if (x >= x_length) {
|
|
break;
|
|
}
|
|
|
|
float dx = abs(center_x - (x + 0.5)) / ratioHalf.x;
|
|
float w = sqrt(part_w + dx * dx);
|
|
|
|
if (w >= -1.0 && w <= 1.0) {
|
|
// Hermite 필터
|
|
weight = 2.0 * w * w * w - 3.0 * w * w + 1.0;
|
|
if (weight > 0.0) {
|
|
vec4 pixel = getTextureColor(vec2(x, y)) * 255.0;
|
|
|
|
// 알파 채널
|
|
gx_a += weight * pixel.a;
|
|
weights_alpha += weight;
|
|
|
|
if (pixel.a < 255.0) {
|
|
weight = weight * pixel.a / 250.0;
|
|
}
|
|
gx_rgb += weight * pixel.rgb;
|
|
weights += weight;
|
|
}
|
|
}
|
|
x++;
|
|
}
|
|
y++;
|
|
}
|
|
|
|
gx_rgb = (gx_rgb / weights) / 255.0;
|
|
gx_a = (gx_a / weights_alpha) / 255.0;
|
|
|
|
gl_FragColor = vec4(gx_rgb, gx_a);
|
|
}
|