Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

460 lines
12 KiB

  1. // STATIC: "EFFECT" "0..3"
  2. // STATIC: "VERTEX_LIT" "0..1"
  3. // STATIC: "BASETEXTURE2" "0..1"
  4. // STATIC: "FANCY_BLENDING" "0..1"
  5. // STATIC: "SELFILLUM" "0..1"
  6. // STATIC: "COLOR_BAR" "0..1"
  7. // STATIC: "STRIPES" "0..1"
  8. // STATIC: "STRIPES_USE_NORMAL2" "0..1"
  9. // DYNAMIC: "PIXELFOGTYPE" "0..1"
  10. // DYNAMIC: "VISUALIZE_DOF" "0..1"
  11. // DYNAMIC: "HEATHAZE" "0..1"
  12. // SKIP: ( STRIPES == 0 ) && ( STRIPES_USE_NORMAL2 == 1 )
  13. // SKIP: ( EFFECT != 1 ) && ( COLOR_BAR == 1 )
  14. // SKIP: ( EFFECT != 2 ) && ( VISUALIZE_DOF == 1 )
  15. // SKIP: ( EFFECT == 2 || EFFECT == 3 ) && ( STRIPES == 1 || STRIPES_USE_NORMAL2 == 1 || COLOR_BAR == 1 || BASETEXTURE2 == 1 || FANCY_BLENDING == 1 || VERTEX_LIT == 1 || PIXELFOGTYPE == 1 || SELFILLUM == 1 )
  16. // SKIP: ( EFFECT != 3 ) && ( HEATHAZE == 1 )
  17. #include "shader_constant_register_map.h"
  18. #include "common_ps_fxc.h"
  19. sampler BaseTextureSampler : register( s0 );
  20. #if BASETEXTURE2 == 1
  21. sampler BaseTexture2Sampler : register( s4 );
  22. #if FANCY_BLENDING == 1
  23. sampler BlendModulationSampler : register( s3 );
  24. #endif
  25. #endif
  26. #if STRIPES
  27. sampler StripeSampler : register( s5 );
  28. const float4 g_vPyroParms6 : register( c5 );
  29. #define g_vStripeColor g_vPyroParms6.rgb
  30. #define g_flStripeLMScale g_vPyroParms6.a
  31. const float4 g_vPyroParms7 : register( c6 );
  32. #define g_vStripeNormal1 g_vPyroParms6.xyz
  33. #define g_flUnused6 g_vPyroParms6.w
  34. #if ( STRIPES_USE_NORMAL2 == 1 )
  35. const float4 g_vPyroParms8 : register( c7 );
  36. #define g_vStripeNormal2 g_vPyroParms7.xyz
  37. #define g_flUnused7 g_vPyroParms7.w
  38. #endif
  39. #endif
  40. #if EFFECT == 0
  41. sampler LightmapSampler : register( s1 );
  42. sampler CanvasSampler : register( s2 );
  43. const float4 g_vPyroParms1 : register( c0 );
  44. #define g_vBaseStepRange g_vPyroParms1.xy
  45. #define g_vLightmapStepRange g_vPyroParms1.zw
  46. const float4 g_vPyroParms2 : register( c1 );
  47. #define g_vColorModulation g_vPyroParms2.rgb
  48. #define g_flUnused1 g_vPyroParms2.w
  49. const float4 g_vPyroParms3 : register( c2 );
  50. #define g_vCanvasStepRange g_vPyroParms3.xy
  51. #define g_vUnused2 g_vPyroParms3.zw
  52. const float4 g_vPyroParms4 : register( c3 );
  53. #define g_vCanvasColorStart g_vPyroParms4.rgb
  54. #define g_flUnused3 g_vPyroParms4.w
  55. const float4 g_vPyroParms5 : register( c4 );
  56. #define g_vCanvasColorEnd g_vPyroParms5.rgb
  57. #define g_flUnused4 g_vPyroParms5.w
  58. #elif EFFECT == 1
  59. sampler LightmapSampler : register( s1 );
  60. sampler ColorBarSampler : register( s2 );
  61. const float4 g_vPyroParms1 : register( c0 );
  62. #define g_flGrayPower g_vPyroParms1.x
  63. #define g_flGrayStep g_vPyroParms1.yz
  64. #define g_flLightMapGradients g_vPyroParms1.w
  65. const float4 g_vPyroParms2 : register( c1 );
  66. #define g_vColorModulation g_vPyroParms2.rgb
  67. #define g_flDiffuseLighting g_vPyroParms2.w
  68. const float4 g_vPyroParms3 : register( c2 );
  69. #define g_flDiffuseBase g_vPyroParms3.x
  70. #define g_vSelfIllumTint g_vPyroParms3.yzw
  71. #elif EFFECT == 2
  72. sampler BlurredFrameSampler : register( s4 );
  73. const float4 g_vPyroParms1 : register( c0 );
  74. #define g_flDoFStartDistance g_vPyroParms1.x
  75. #define g_flDoFPower g_vPyroParms1.y
  76. #define g_flDoFMax g_vPyroParms1.z
  77. #define g_flUnused1 g_vPyroParms1.w
  78. #elif EFFECT == 3
  79. sampler NoiseSampler : register( s3 );
  80. sampler WarpFrameSampler : register( s4 );
  81. sampler VignetteSampler : register( s5 );
  82. sampler VignetteTileSampler : register( s6 );
  83. const float4 g_vPyroParms1 : register( c0 );
  84. #define g_flNoiseScale g_vPyroParms1.x // 0.2
  85. #define g_flTimeScale g_vPyroParms1.y // 0.020
  86. #define g_flHeatHazeScale g_vPyroParms1.z // 0.2
  87. #define g_flUnused1 g_vPyroParms1.w
  88. #endif
  89. const HALF3 g_EyePos : register( c10 );
  90. const HALF4 g_FogParams : register( c11 );
  91. const float4 g_vGeneralPyroParms1 : register( c12 );
  92. #define g_fWriteDepthToAlpha g_vGeneralPyroParms1.x
  93. #define g_flTime g_vGeneralPyroParms1.y
  94. #define g_flGeneralUnused2 g_vGeneralPyroParms1.z
  95. #define g_flGeneralUnused3 g_vGeneralPyroParms1.w
  96. struct PS_INPUT
  97. {
  98. #if EFFECT == 0 || EFFECT == 1
  99. float4 vBaseAndSeamlessTexCoord : TEXCOORD0;
  100. #if ( STRIPES == 1 )
  101. float2 vStripeSeamlessTexCoord : TEXCOORD1;
  102. #endif
  103. #if ( VERTEX_LIT == 0 )
  104. float2 vLightmapBlendTexCoord : TEXCOORD2;
  105. #endif
  106. #if BASETEXTURE2 == 1
  107. float3 vBlendFactor : TEXCOORD3;
  108. #endif
  109. float4 worldPos_projPosZ : TEXCOORD4;
  110. float3 vWorldNormal : TEXCOORD5;
  111. float4 vVertexColor : COLOR;
  112. #else
  113. float2 vBaseTexCoord : TEXCOORD0;
  114. #endif
  115. };
  116. float ToGray( const float3 vColor )
  117. {
  118. return dot( vColor, float3( 0.30f, 0.59f, 0.11f ) );
  119. }
  120. void HandleBlending( const float2 vBaseTextureCoord, const float3 vBlendFactor, inout float4 vBaseColor )
  121. {
  122. #if BASETEXTURE2 == 1
  123. float4 vBaseColor2 = tex2D( BaseTexture2Sampler, vBaseTextureCoord );
  124. float flBlendFactor = vBlendFactor.z;
  125. #if FANCY_BLENDING == 1
  126. float4 modt = tex2D( BlendModulationSampler, vBlendFactor.xy );
  127. float minb = saturate( modt.g - modt.r );
  128. float maxb = saturate( modt.g + modt.r );
  129. flBlendFactor = smoothstep( minb, maxb, flBlendFactor );
  130. #endif
  131. vBaseColor = lerp( vBaseColor, vBaseColor2, flBlendFactor );
  132. #endif
  133. }
  134. #if STRIPES
  135. void CalculateStripe( const float2 vStripeSeamlessTexCoord, const float3 vWorldNormal, const float flLMScale, inout float3 vResult )
  136. {
  137. float4 vStripeColor = tex2D( StripeSampler, vStripeSeamlessTexCoord );
  138. vStripeColor.rgb *= g_vStripeColor;
  139. vStripeColor.rgb *= lerp( float3( 1.0, 1.0, 1.0 ), flLMScale, g_flStripeLMScale );
  140. #if VERTEX_LIT == 1 && 0
  141. float flAngle = saturate( dot( vWorldNormal, g_vStripeNormal1 ) );
  142. vResult.rgb = ( vWorldNormal * 0.5 ) + 0.5;
  143. return;
  144. flAngle = 1 - flAngle;
  145. vStripeColor.a *= flAngle;
  146. #endif
  147. vResult = lerp( vResult, vStripeColor.rgb, vStripeColor.a );
  148. }
  149. #endif
  150. #if EFFECT == -1
  151. float4 main( PS_INPUT i ) : COLOR
  152. {
  153. float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
  154. #if BASETEXTURE2 == 1
  155. HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
  156. #endif
  157. // return vBaseColor;
  158. vBaseColor *= i.vVertexColor;
  159. #if VERTEX_LIT == 0
  160. float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
  161. #endif
  162. float4 vCanvas = tex2D( CanvasSampler, i.vBaseAndSeamlessTexCoord.zw );
  163. float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
  164. // return saturate( min( g_FogParams.z, (i.worldPos_projPosZ.w * g_FogParams.w) - g_FogParams.x ) );
  165. // return float4( g_FogParams.x, g_FogParams.z, g_FogParams.w, 1 );
  166. // return g_LinearFogColor;
  167. // flFogFactor = 1;
  168. float4 vResult;
  169. #if 0
  170. vResult = vBaseColor * vLightmapSample;
  171. #else
  172. float flBaseGray = dot( vBaseColor.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  173. #if VERTEX_LIT == 0
  174. float flLightmapGray = dot( vLightmapSample.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  175. #endif
  176. flBaseGray = smoothstep( g_vBaseStepRange.x, g_vBaseStepRange.y, flBaseGray );
  177. vResult = float4( flBaseGray.rrr, vBaseColor.a );
  178. #if VERTEX_LIT == 0
  179. // flLightmapGray = pow( flLightmapGray, 0.01 );
  180. flLightmapGray = smoothstep( g_vLightmapStepRange.x, g_vLightmapStepRange.y, flLightmapGray );
  181. vResult *= flLightmapGray;
  182. #endif
  183. float flCanvasGray = dot( vCanvas.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  184. flCanvasGray = smoothstep( g_vCanvasStepRange.x, g_vCanvasStepRange.y, flCanvasGray );
  185. vCanvas.rgb = lerp( g_vCanvasColorStart, g_vCanvasColorEnd, flCanvasGray );
  186. vResult *= vCanvas;
  187. #endif
  188. return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, true, i.worldPos_projPosZ.w );
  189. }
  190. #elif EFFECT == 0
  191. float4 main( PS_INPUT i ) : COLOR
  192. {
  193. float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
  194. #if BASETEXTURE2 == 1
  195. HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
  196. #endif
  197. vBaseColor.rgb *= i.vVertexColor.rgb;
  198. vBaseColor.rgb = ceil( vBaseColor.rgb * 16.0 ) / 16.0;
  199. #if VERTEX_LIT == 0
  200. float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
  201. #endif
  202. float4 vCanvas = tex2D( CanvasSampler, i.vBaseAndSeamlessTexCoord.zw );
  203. float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
  204. float4 vResult;
  205. float flBaseGray = dot( vBaseColor.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  206. #if VERTEX_LIT == 0
  207. float flLightmapGray = dot( vLightmapSample.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  208. #endif
  209. #ifdef GRAY_DIFFUSE
  210. flBaseGray = smoothstep( g_vBaseStepRange.x, g_vBaseStepRange.y, flBaseGray );
  211. vResult = float4( flBaseGray.rrr, vBaseColor.a );
  212. #else
  213. vResult.rgb = smoothstep( g_vBaseStepRange.xxx, g_vBaseStepRange.yyy, vBaseColor.rgb );
  214. vResult.a = vBaseColor.a;
  215. #endif
  216. #if VERTEX_LIT == 0
  217. #ifdef GRAY_LM
  218. flLightmapGray = pow( flLightmapGray, 0.01 );
  219. flLightmapGray = smoothstep( g_vLightmapStepRange.x, g_vLightmapStepRange.y, flLightmapGray );
  220. vResult.rgb *= flLightmapGray;
  221. #else
  222. vLightmapSample.rgb = smoothstep( g_vLightmapStepRange.xxx, g_vLightmapStepRange.yyy, vLightmapSample.rgb );
  223. // vLightmapSample.rgb = lerp( float3( 0.0, 0.0, 0.0 ), float3( 3.1, 1.1, 5.1 ), vLightmapSample.rgb );
  224. vResult.rgb *= vLightmapSample.rgb;
  225. #endif
  226. #endif
  227. float flCanvasGray = dot( vCanvas.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  228. flCanvasGray = smoothstep( g_vCanvasStepRange.x, g_vCanvasStepRange.y, flCanvasGray );
  229. vCanvas.rgb = lerp( g_vCanvasColorStart, g_vCanvasColorEnd, flCanvasGray );
  230. // vCanvas.rgb = pow( vCanvas.rgb, 0.6 );
  231. vResult *= vCanvas;
  232. return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, true, i.worldPos_projPosZ.w );
  233. }
  234. #elif EFFECT == 1
  235. #define GRAY_DIFFUSE 1
  236. #define GRAY_LM 1
  237. float4 main( PS_INPUT i ) : COLOR
  238. {
  239. float4 vResult;
  240. float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
  241. #if BASETEXTURE2 == 1
  242. HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
  243. #endif
  244. float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
  245. vBaseColor.rgb = lerp( vBaseColor.rgb, 1.0, g_flDiffuseBase );
  246. vResult = vBaseColor * i.vVertexColor;
  247. #if VERTEX_LIT == 0
  248. float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
  249. vResult.rgb = lerp( vResult.rgb, 0.5, g_flDiffuseLighting );
  250. vResult.rgb *= vLightmapSample.rgb;
  251. #endif
  252. #if SELFILLUM
  253. float3 vSelfIllumComponent = g_vSelfIllumTint * vBaseColor.rgb;
  254. vResult.rgb = lerp( vResult.rgb, vSelfIllumComponent, vBaseColor.a );
  255. #endif
  256. float flGray = dot( vResult.rgb, float3( 0.30f, 0.59f, 0.11f ) );
  257. flGray = pow( flGray, g_flGrayPower );
  258. flGray = smoothstep( g_flGrayStep.x, g_flGrayStep.y, flGray );
  259. flGray = ceil( flGray * g_flLightMapGradients ) / g_flLightMapGradients;
  260. #if COLOR_BAR == 1
  261. float4 vCanvas = tex1D( ColorBarSampler, flGray );
  262. vResult.rgb = vCanvas.rgb * flGray;
  263. #endif
  264. #if STRIPES
  265. CalculateStripe( i.vStripeSeamlessTexCoord, i.vWorldNormal, flGray, vResult.rgb );
  266. #endif
  267. return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, false, i.worldPos_projPosZ.w );
  268. }
  269. #elif EFFECT == 2
  270. float4 main( PS_INPUT i ) : COLOR
  271. {
  272. float flDepth = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy ).r;
  273. float4 vBaseColor = tex2D( BlurredFrameSampler, i.vBaseTexCoord.xy );
  274. float flAmount;
  275. flAmount = flDepth;
  276. flAmount = saturate( flDepth - g_flDoFStartDistance );
  277. flAmount = pow( flAmount, g_flDoFPower );
  278. flAmount *= g_flDoFMax;
  279. #if VISUALIZE_DOF == 1
  280. return float4( flAmount.rrr, 1 );
  281. #else
  282. return float4( vBaseColor.rgb, flAmount );
  283. #endif
  284. }
  285. #elif EFFECT == 3
  286. float4 main( PS_INPUT i ) : COLOR
  287. {
  288. float flVignetteAmount = tex2D( VignetteSampler, i.vBaseTexCoord.xy );
  289. float4 vVignetteTile = tex2D( VignetteTileSampler, i.vBaseTexCoord.xy * 50.0f );
  290. #if HEATHAZE == 1
  291. float2 vOffset = tex2D( WarpFrameSampler, i.vBaseTexCoord.xy ).aa;
  292. float flDynamicOffset = tex2D( NoiseSampler, float2( i.vBaseTexCoord.x, ( i.vBaseTexCoord.y * g_flNoiseScale ) + ( g_flTime * g_flTimeScale ) ) ).r;
  293. // return float4( vOffset.yyy, 1 );
  294. // return float4( flDynamicOffset.xxx, 1.0 );
  295. // vOffset = ( vOffset - 0.5 );
  296. vOffset = smoothstep( 0.1, 1.0, vOffset );
  297. vOffset *= flDynamicOffset * g_flHeatHazeScale;
  298. float4 vOriginal = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy + float2( 0, vOffset.y ) );
  299. #else
  300. float4 vOriginal = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy );
  301. #endif
  302. float flDelta = flVignetteAmount.x - vVignetteTile.a;
  303. float flFinal = flDelta <= 0.0f ? 0.0f : lerp( flVignetteAmount.x, 1.0, flDelta / flVignetteAmount.x );
  304. vOriginal.rgb = lerp( vOriginal.rgb, vVignetteTile.rgb, flFinal * flVignetteAmount.x );
  305. return float4( vOriginal );
  306. }
  307. #endif