composite-encode.fs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #version 150
  2. uniform usampler2D source[];
  3. uniform vec4 sourceSize[];
  4. uniform int phase;
  5. in Vertex {
  6. vec2 texCoord;
  7. };
  8. out vec4 fragColor;
  9. void main() {
  10. uint n = texture(source[0], texCoord).r;
  11. uint color = n & 0xfu;
  12. uint level = color < 0xeu ? (n>>4u)&3u : 1u;
  13. uint emphasis = n >> 6u;
  14. const float levels[] = float[](0.350, 0.518, 0.962, 1.550,
  15. 1.094, 1.506, 1.962, 1.962);
  16. const float attenuation = 0.746;
  17. const float min = levels[0]*attenuation;
  18. const float max = levels[7];
  19. float lo_hi[] = float[](levels[level + 4u*uint(color == 0x0u)],
  20. levels[level + 4u*uint(color < 0xdu)]);
  21. uint x = uint(floor(texCoord.x*sourceSize[0].x*2.0));
  22. uint y = uint(floor(texCoord.y*sourceSize[0].y));
  23. float frag[4];
  24. for (uint i = 0u; i < 4u; i++) {
  25. uint p = (x*4u+i + y*4u + uint(phase*4)) % 12u;
  26. #define wave(ph,co) (((co)+(ph)+8u)%12u<6u)
  27. float spot = lo_hi[uint(wave(p,color))];
  28. if ( (((emphasis&1u)==1u) && wave(p,12u))
  29. || (((emphasis&2u)==1u) && wave(p,4u))
  30. || (((emphasis&4u)==1u) && wave(p,8u)))
  31. spot *= attenuation;
  32. frag[i] = spot;
  33. }
  34. fragColor = (vec4(frag[0], frag[1], frag[2], frag[3]) - vec4(min))/vec4(max-min);
  35. }