git.y1.nz

SameBoy

Accurate GB/GBC emulator
download: https://git.y1.nz/archives/sameboy.tar.gz
README | Files | Log | Refs | LICENSE

Shaders/AAScale4x.fsh

      1 STATIC vec4 scale2x(sampler2D image, vec2 position, vec2 input_resolution, vec2 output_resolution)
      2 {
      3     // texel arrangement
      4     // A B C
      5     // D E F
      6     // G H I
      7     
      8     vec4 B = texture_relative(image, position, vec2(  0,  1));
      9     vec4 D = texture_relative(image, position, vec2( -1,  0));
     10     vec4 E = texture_relative(image, position, vec2(  0,  0));
     11     vec4 F = texture_relative(image, position, vec2(  1,  0));
     12     vec4 H = texture_relative(image, position, vec2(  0, -1));
     13     vec2 p = position * input_resolution;
     14     // p = the position within a pixel [0...1]
     15     p = fract(p);
     16     if (p.x > .5) {
     17         if (p.y > .5) {
     18             // Top Right
     19             return equal(B, F) && inequal(B, D) && inequal(F, H) ? F : E;
     20         } else {
     21             // Bottom Right
     22             return equal(H, F) && inequal(D, H) && inequal(B, F) ? F : E;
     23         }
     24     } else {
     25         if (p.y > .5) {
     26             // Top Left
     27             return equal(D, B) && inequal(B, F) && inequal(D, H) ? D : E;
     28         } else {
     29             // Bottom Left
     30             return equal(D, H) && inequal(D, B) && inequal(H, F) ? D : E;
     31         }
     32     }
     33 }
     34 STATIC vec4 scale2x_wrapper(sampler2D t, vec2 pos, vec2 offset, vec2 input_resolution, vec2 output_resolution)
     35 {
     36     vec2 origin = (floor(pos * input_resolution * 2.0)) + vec2(0.5, 0.5);
     37     return scale2x(t, (origin + offset) / input_resolution / 2.0, input_resolution, output_resolution);
     38 }
     39 
     40 STATIC vec4 scale(sampler2D image, vec2 position, vec2 input_resolution, vec2 output_resolution)
     41 {
     42     // texel arrangement
     43     // A B C
     44     // D E F
     45     // G H I
     46     vec4 B = scale2x_wrapper(image, position, vec2(  0,  1), input_resolution, output_resolution);
     47     vec4 D = scale2x_wrapper(image, position, vec2( -1,  0), input_resolution, output_resolution);
     48     vec4 E = scale2x_wrapper(image, position, vec2(  0,  0), input_resolution, output_resolution);
     49     vec4 F = scale2x_wrapper(image, position, vec2(  1,  0), input_resolution, output_resolution);
     50     vec4 H = scale2x_wrapper(image, position, vec2(  0, -1), input_resolution, output_resolution);
     51 
     52     vec4 R;
     53     vec2 p = position * input_resolution * 2.;
     54     // p = the position within a pixel [0...1]
     55     p = fract(p);
     56     if (p.x > .5) {
     57         if (p.y > .5) {
     58             // Top Right
     59             R = equal(B, F) && inequal(B, D) && inequal(F, H) ? F : E;
     60         } else {
     61             // Bottom Right
     62             R = equal(H, F) && inequal(D, H) && inequal(B, F) ? F : E;
     63         }
     64     } else {
     65         if (p.y > .5) {
     66             // Top Left
     67             R = equal(D, B) && inequal(B, F) && inequal(D, H) ? D : E;
     68         } else {
     69             // Bottom Left
     70             R = equal(D, H) && inequal(D, B) && inequal(H, F) ? D : E;
     71         }
     72     }
     73 
     74     return mix(R, E, 0.5);
     75 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.