Advertisement
Guest User

crt-hyllian-variable-beam-width-v8-fix

a guest
Apr 17th, 2014
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.87 KB | None | 0 0
  1. /* COMPATIBILITY
  2. - HLSL compilers
  3. - Cg compilers
  4. */
  5.  
  6. /*
  7. Hyllian's CRT Shader
  8.  
  9. Copyright (C) 2011-2014 Hyllian/Jararaca - sergiogdb@gmail.com
  10.  
  11. This program is free software; you can redistribute it and/or
  12. modify it under the terms of the GNU General Public License
  13. as published by the Free Software Foundation; either version 2
  14. of the License, or (at your option) any later version.
  15.  
  16. This program is distributed in the hope that it will be useful,
  17. but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. GNU General Public License for more details.
  20.  
  21. You should have received a copy of the GNU General Public License
  22. along with this program; if not, write to the Free Software
  23. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  24.  
  25. */
  26.  
  27. const static float pi = 3.1415926535897932384626433832795;
  28.  
  29. const static float3x3 yuv = float3x3(0.299, 0.587, 0.114, -0.169, -0.331, 0.499, 0.499, -0.418, -0.0813);
  30.  
  31. // Uncomment to increase the sharpness of the scanlines
  32. //#define SHARPER
  33.  
  34. // Comment next line if you don't desire the phosphor effect.
  35. #define PHOSPHOR
  36.  
  37. // Control scanlines transparency by changing this param below. Use always values between 0.0 and 1.0.
  38. #define SCANLINES_STRENGTH 1.0
  39.  
  40. // Control the beam width range by changing these two params below. Use always values between 0.0 and 1.0.
  41. #define BEAM_MIN_WIDTH 0.1
  42. #define BEAM_MAX_WIDTH 0.7
  43.  
  44. // You can saturate colors using this parameter.
  45. #define COLOR_BOOST 2.0
  46.  
  47. // This param change the threshold from where the beam gets thicker.
  48. #define BEAM_WIDTH_SENSITIVITY 0.5
  49.  
  50. // Cool tint. Controls the blue level. CRT TVs from the 90's had a blue tint.
  51. // To turn OFF this effect, use 1.0 value.
  52. #define CRT_TV_BLUE_TINT 1.15
  53.  
  54.  
  55.  
  56.  
  57. #define SINC2(X)\
  58. (X<(1E-5)) ? 1.0 : sin(pi*X)*sin(pi*X)/(pi*X*pi*X);
  59.  
  60.  
  61. // Constants used with gamma correction.
  62. #define InputGamma 2.4
  63. #define OutputGamma 2.2
  64.  
  65. #define GAMMA_IN(color) pow(color, float4(InputGamma, InputGamma, InputGamma, InputGamma))
  66. #define GAMMA_OUT(color) pow(color, float4(1.0 / OutputGamma, 1.0 / OutputGamma, 1.0 / OutputGamma, 1.0 / OutputGamma))
  67.  
  68.  
  69. const static float4x4 invX = float4x4(-1.0/6.0, 0.5, -1.0/3.0, 0.0,
  70. 0.5, -1.0, -0.5, 1.0,
  71. -0.5, 0.5, 1.0, 0.0,
  72. 1.0/6.0, 0.0, -1.0/6.0, 0.0);
  73.  
  74.  
  75.  
  76. struct input
  77. {
  78. float2 video_size;
  79. float2 texture_size;
  80. float2 output_size;
  81. float frame_count;
  82. float frame_direction;
  83. float frame_rotation;
  84. };
  85.  
  86.  
  87. struct out_vertex {
  88. float2 texCoord;
  89. float4 t1;
  90. };
  91.  
  92. /* VERTEX_SHADER */
  93. out_vertex main_vertex
  94. (
  95. float4 position : POSITION,
  96. out float4 oPosition : POSITION,
  97. float2 tex1 : TEXCOORD0,
  98.  
  99. uniform float4x4 modelViewProj,
  100. uniform input IN
  101. )
  102. {
  103. #ifdef SHARPER
  104. float2 TextureSize = float2(2.0*IN.texture_size.x, IN.texture_size.y);
  105. #else
  106. float2 TextureSize = IN.texture_size;
  107. #endif
  108. float2 ps = 1.0/TextureSize;
  109. float dx = ps.x;
  110. float dy = ps.y;
  111.  
  112. float2 tex = tex1+ps*float2(-0.5, 1.0);
  113. oPosition = mul(modelViewProj, position);
  114.  
  115. out_vertex OUT = {
  116. tex,
  117. float4( dx, 0.0, 0.0, dy)
  118. };
  119. /*
  120. out_vertex OUT = {
  121. tex,
  122. float4(tex,tex) + float4(-2.0*dx, 0.0, -dx, 0.0),
  123. float4(tex,tex) + float4( dx, 0.0,-2.0*dx, dy),
  124. float4(tex,tex) + float4( -dx, dy, 0.0, dy),
  125. float4(tex,tex) + float4( dx, dy,-2.0*dx, 2.0*dy),
  126. float4(tex,tex) + float4( -dx, 2.0*dy, 0.0, 2.0*dy),
  127. float4(tex,tex) + float4( dx, 2.0*dy,-2.0*dx, 3.0*dy),
  128. float4(tex,tex) + float4( -dx, 3.0*dy, 0.0, 3.0*dy),
  129. tex + float2( dx, 3.0*dy)
  130. };
  131. */
  132. return OUT;
  133. }
  134.  
  135.  
  136. float4 main_fragment(in out_vertex VAR, uniform sampler2D s_p : TEXUNIT0, uniform input IN) : COLOR
  137. {
  138. #ifdef SHARPER
  139. float2 TextureSize = float2(2.0*IN.texture_size.x, IN.texture_size.y);
  140. #else
  141. float2 TextureSize = IN.texture_size;
  142. #endif
  143.  
  144.  
  145. float2 fp = frac(VAR.texCoord*TextureSize);
  146.  
  147. float2 dx = VAR.t1.xy;
  148. float2 dy = VAR.t1.zw;
  149.  
  150.  
  151. float3 c00 = tex2D(s_p, VAR.texCoord -dx -dy).xyz;
  152. float3 c01 = tex2D(s_p, VAR.texCoord -dy).xyz;
  153. float3 c02 = tex2D(s_p, VAR.texCoord +dx -dy).xyz;
  154. float3 c03 = tex2D(s_p, VAR.texCoord +2.0*dx -dy).xyz;
  155. float3 c10 = tex2D(s_p, VAR.texCoord -dx ).xyz;
  156. float3 c11 = tex2D(s_p, VAR.texCoord ).xyz;
  157. float3 c12 = tex2D(s_p, VAR.texCoord +dx ).xyz;
  158. float3 c13 = tex2D(s_p, VAR.texCoord +2.0*dx ).xyz;
  159. float3 c20 = tex2D(s_p, VAR.texCoord -dx +dy).xyz;
  160. float3 c21 = tex2D(s_p, VAR.texCoord +dy).xyz;
  161. float3 c22 = tex2D(s_p, VAR.texCoord +dx +dy).xyz;
  162. float3 c23 = tex2D(s_p, VAR.texCoord +2.0*dx +dy).xyz;
  163. float3 c30 = tex2D(s_p, VAR.texCoord -dx +2.0*dy).xyz;
  164. float3 c31 = tex2D(s_p, VAR.texCoord +2.0*dy).xyz;
  165. float3 c32 = tex2D(s_p, VAR.texCoord +dx +2.0*dy).xyz;
  166. float3 c33 = tex2D(s_p, VAR.texCoord +2.0*dx +2.0*dy).xyz;
  167.  
  168.  
  169. float4x4 red_matrix = float4x4(c00.x, c01.x, c02.x, c03.x,
  170. c10.x, c11.x, c12.x, c13.x,
  171. c20.x, c21.x, c22.x, c23.x,
  172. c30.x, c31.x, c32.x, c33.x);
  173.  
  174. float4x4 green_matrix = float4x4(c00.y, c01.y, c02.y, c03.y,
  175. c10.y, c11.y, c12.y, c13.y,
  176. c20.y, c21.y, c22.y, c23.y,
  177. c30.y, c31.y, c32.y, c33.y);
  178.  
  179. float4x4 blue_matrix = float4x4(c00.z, c01.z, c02.z, c03.z,
  180. c10.z, c11.z, c12.z, c13.z,
  181. c20.z, c21.z, c22.z, c23.z,
  182. c30.z, c31.z, c32.z, c33.z);
  183.  
  184.  
  185. float4x1 invX_Px = mul(invX, float4x1(fp.x*fp.x*fp.x, fp.x*fp.x, fp.x, 1.0));
  186.  
  187.  
  188. float red = mul( red_matrix, invX_Px);
  189. float green = mul(green_matrix, invX_Px);
  190. float blue = mul( blue_matrix, invX_Px);
  191.  
  192. float2 pos = abs(fp - float2(0.5));
  193.  
  194. //float3 Y = mul( float3x3(c01, c02, c00), yuv[0] );
  195. //Y = lerp(float3(BEAM_MIN_WIDTH), float3(BEAM_MAX_WIDTH), Y);
  196. //float2 Y;
  197. //Y.x = max(c01.r, max(c01.g, c01.b));
  198. //Y.y = max(c02.r, max(c02.g, c02.b));
  199. //Y = lerp(float2(BEAM_MIN_WIDTH), float2(BEAM_MAX_WIDTH), Y);
  200. //Y.x = (c01.r + c01.g + c01.b)/3;
  201. //Y.y = (c02.r + c02.g + c02.b)/3;
  202. //Y=pow(Y,BEAM_WIDTH_SENSITIVITY);
  203. //float lum = (Y.x*(1.5-pos.x) + Y.y*(0.5+pos.x) + Y.z*(0.5-pos.x))/(2.5-pos.x);
  204. //float lum = lerp(Y.x,Y.y, 1.0-Y.x);
  205.  
  206. //float d = clamp(pos.y/lum, 0.0, 1.0);
  207. c01 = lerp(float3(BEAM_MIN_WIDTH), float3(BEAM_MAX_WIDTH), c01);
  208. c02 = lerp(float3(BEAM_MIN_WIDTH), float3(BEAM_MAX_WIDTH), c02);
  209. c01=pow(c01,BEAM_WIDTH_SENSITIVITY);
  210. c02=pow(c02,BEAM_WIDTH_SENSITIVITY);
  211. float3 lum = lerp(c01,c02, 1.0-c01);
  212. float3 d = clamp(pos.y/lum, 0.0, 1.0);
  213.  
  214. d = smoothstep(0.0, 1.0, 1.0-d);
  215.  
  216. d = SCANLINES_STRENGTH*(d-1.0)+1.0;
  217.  
  218. float3 color = float3(red, green, blue);
  219. //float3 color = c11.rgb;
  220.  
  221.  
  222. color.b *= CRT_TV_BLUE_TINT;
  223.  
  224. color = clamp(color*d, 0.0, 1.0);
  225.  
  226. #ifdef PHOSPHOR
  227. float mod_factor = VAR.texCoord.x * IN.output_size.x * IN.texture_size.x / IN.video_size.x;
  228.  
  229. float3 dotMaskWeights = lerp(
  230. float3(1.0, 0.7, 1.0),
  231. float3(0.7, 1.0, 0.7),
  232. floor(fmod(mod_factor, 2.0))
  233. );
  234. #endif
  235.  
  236.  
  237.  
  238. color = GAMMA_IN(color);
  239. #ifdef PHOSPHOR
  240. color.rgb *= dotMaskWeights;
  241. #endif
  242. color = color*COLOR_BOOST;
  243. color = GAMMA_OUT(color);
  244.  
  245. return float4(color, 1.0);
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement