PageRenderTime 53ms CodeModel.GetById 27ms RepoModel.GetById 1ms app.codeStats 0ms

/bin/data/Shaders/dot_n_bloom.OpenGL.shader

https://github.com/GregoryBonik/OpenXcom
Unknown | 96 lines | 88 code | 8 blank | 0 comment | 0 complexity | d2e151e23af53a7ec2fcc1f521678d5a MD5 | raw file
Possible License(s): GPL-3.0
  1. #<!--
  2. # Dot 'n bloom shader
  3. # Author: Themaister
  4. # License: Public domain
  5. #-->
  6. language: GLSL
  7. vertex: |
  8. varying vec2 c00;
  9. varying vec2 c10;
  10. varying vec2 c20;
  11. varying vec2 c01;
  12. varying vec2 c11;
  13. varying vec2 c21;
  14. varying vec2 c02;
  15. varying vec2 c12;
  16. varying vec2 c22;
  17. varying vec2 pixel_no;
  18. uniform vec2 rubyTextureSize;
  19. uniform vec2 rubyOutputSize;
  20. uniform vec2 rubyInputSize;
  21. void main()
  22. {
  23. gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  24. float dx = 1.0 / rubyTextureSize.x;
  25. float dy = 1.0 / rubyTextureSize.y;
  26. vec2 tex = gl_MultiTexCoord0.xy;
  27. c00 = tex + vec2(-dx, -dy);
  28. c10 = tex + vec2( 0, -dy);
  29. c20 = tex + vec2( dx, -dy);
  30. c01 = tex + vec2(-dx, 0);
  31. c11 = tex + vec2( 0, 0);
  32. c21 = tex + vec2( dx, 0);
  33. c02 = tex + vec2(-dx, dy);
  34. c12 = tex + vec2( 0, dy);
  35. c22 = tex + vec2( dx, dy);
  36. pixel_no = tex * rubyTextureSize;
  37. }
  38. linear: false
  39. fragment: |
  40. uniform vec2 rubyTextureSize;
  41. uniform sampler2D rubyTexture;
  42. varying vec2 c00;
  43. varying vec2 c10;
  44. varying vec2 c20;
  45. varying vec2 c01;
  46. varying vec2 c11;
  47. varying vec2 c21;
  48. varying vec2 c02;
  49. varying vec2 c12;
  50. varying vec2 c22;
  51. varying vec2 pixel_no;
  52. const float gamma = 2.4;
  53. const float shine = 0.50;
  54. const float blend = 0.25;
  55. float dist(vec2 coord, vec2 source)
  56. {
  57. vec2 delta = coord - source;
  58. return sqrt(dot(delta, delta));
  59. }
  60. float color_bloom(vec3 color)
  61. {
  62. const vec3 gray_coeff = vec3(0.30, 0.59, 0.11);
  63. float bright = dot(color, gray_coeff);
  64. return mix(1.0 + shine, 1.0 - shine, bright);
  65. }
  66. vec3 lookup(float offset_x, float offset_y, vec2 coord)
  67. {
  68. vec2 offset = vec2(offset_x, offset_y);
  69. vec3 color = texture2D(rubyTexture, coord).rgb;
  70. float delta = dist(fract(pixel_no), offset + vec2(0.5));
  71. return color * exp(-gamma * delta * color_bloom(color));
  72. }
  73. void main()
  74. {
  75. vec3 mid_color = lookup(0.0, 0.0, c11);
  76. vec3 color = vec3(0.0);
  77. color += lookup(-1.0, -1.0, c00);
  78. color += lookup( 0.0, -1.0, c10);
  79. color += lookup( 1.0, -1.0, c20);
  80. color += lookup(-1.0, 0.0, c01);
  81. color += mid_color;
  82. color += lookup( 1.0, 0.0, c21);
  83. color += lookup(-1.0, 1.0, c02);
  84. color += lookup( 0.0, 1.0, c12);
  85. color += lookup( 1.0, 1.0, c22);
  86. vec3 out_color = mix(1.2 * mid_color, color, blend);
  87. gl_FragColor = vec4(out_color, 1.0);
  88. }