Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

// STATIC: "EFFECT" "0..3"
// STATIC: "VERTEX_LIT" "0..1"
// STATIC: "BASETEXTURE2" "0..1"
// STATIC: "FANCY_BLENDING" "0..1"
// STATIC: "SELFILLUM" "0..1"
// STATIC: "COLOR_BAR" "0..1"
// STATIC: "STRIPES" "0..1"
// STATIC: "STRIPES_USE_NORMAL2" "0..1"
// DYNAMIC: "PIXELFOGTYPE" "0..1"
// DYNAMIC: "VISUALIZE_DOF" "0..1"
// DYNAMIC: "HEATHAZE" "0..1"
// SKIP: ( STRIPES == 0 ) && ( STRIPES_USE_NORMAL2 == 1 )
// SKIP: ( EFFECT != 1 ) && ( COLOR_BAR == 1 )
// SKIP: ( EFFECT != 2 ) && ( VISUALIZE_DOF == 1 )
// 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 )
// SKIP: ( EFFECT != 3 ) && ( HEATHAZE == 1 )
#include "shader_constant_register_map.h"
#include "common_ps_fxc.h"
sampler BaseTextureSampler : register( s0 );
#if BASETEXTURE2 == 1
sampler BaseTexture2Sampler : register( s4 );
#if FANCY_BLENDING == 1
sampler BlendModulationSampler : register( s3 );
#endif
#endif
#if STRIPES
sampler StripeSampler : register( s5 );
const float4 g_vPyroParms6 : register( c5 );
#define g_vStripeColor g_vPyroParms6.rgb
#define g_flStripeLMScale g_vPyroParms6.a
const float4 g_vPyroParms7 : register( c6 );
#define g_vStripeNormal1 g_vPyroParms6.xyz
#define g_flUnused6 g_vPyroParms6.w
#if ( STRIPES_USE_NORMAL2 == 1 )
const float4 g_vPyroParms8 : register( c7 );
#define g_vStripeNormal2 g_vPyroParms7.xyz
#define g_flUnused7 g_vPyroParms7.w
#endif
#endif
#if EFFECT == 0
sampler LightmapSampler : register( s1 );
sampler CanvasSampler : register( s2 );
const float4 g_vPyroParms1 : register( c0 );
#define g_vBaseStepRange g_vPyroParms1.xy
#define g_vLightmapStepRange g_vPyroParms1.zw
const float4 g_vPyroParms2 : register( c1 );
#define g_vColorModulation g_vPyroParms2.rgb
#define g_flUnused1 g_vPyroParms2.w
const float4 g_vPyroParms3 : register( c2 );
#define g_vCanvasStepRange g_vPyroParms3.xy
#define g_vUnused2 g_vPyroParms3.zw
const float4 g_vPyroParms4 : register( c3 );
#define g_vCanvasColorStart g_vPyroParms4.rgb
#define g_flUnused3 g_vPyroParms4.w
const float4 g_vPyroParms5 : register( c4 );
#define g_vCanvasColorEnd g_vPyroParms5.rgb
#define g_flUnused4 g_vPyroParms5.w
#elif EFFECT == 1
sampler LightmapSampler : register( s1 );
sampler ColorBarSampler : register( s2 );
const float4 g_vPyroParms1 : register( c0 );
#define g_flGrayPower g_vPyroParms1.x
#define g_flGrayStep g_vPyroParms1.yz
#define g_flLightMapGradients g_vPyroParms1.w
const float4 g_vPyroParms2 : register( c1 );
#define g_vColorModulation g_vPyroParms2.rgb
#define g_flDiffuseLighting g_vPyroParms2.w
const float4 g_vPyroParms3 : register( c2 );
#define g_flDiffuseBase g_vPyroParms3.x
#define g_vSelfIllumTint g_vPyroParms3.yzw
#elif EFFECT == 2
sampler BlurredFrameSampler : register( s4 );
const float4 g_vPyroParms1 : register( c0 );
#define g_flDoFStartDistance g_vPyroParms1.x
#define g_flDoFPower g_vPyroParms1.y
#define g_flDoFMax g_vPyroParms1.z
#define g_flUnused1 g_vPyroParms1.w
#elif EFFECT == 3
sampler NoiseSampler : register( s3 );
sampler WarpFrameSampler : register( s4 );
sampler VignetteSampler : register( s5 );
sampler VignetteTileSampler : register( s6 );
const float4 g_vPyroParms1 : register( c0 );
#define g_flNoiseScale g_vPyroParms1.x // 0.2
#define g_flTimeScale g_vPyroParms1.y // 0.020
#define g_flHeatHazeScale g_vPyroParms1.z // 0.2
#define g_flUnused1 g_vPyroParms1.w
#endif
const HALF3 g_EyePos : register( c10 );
const HALF4 g_FogParams : register( c11 );
const float4 g_vGeneralPyroParms1 : register( c12 );
#define g_fWriteDepthToAlpha g_vGeneralPyroParms1.x
#define g_flTime g_vGeneralPyroParms1.y
#define g_flGeneralUnused2 g_vGeneralPyroParms1.z
#define g_flGeneralUnused3 g_vGeneralPyroParms1.w
struct PS_INPUT
{
#if EFFECT == 0 || EFFECT == 1
float4 vBaseAndSeamlessTexCoord : TEXCOORD0;
#if ( STRIPES == 1 )
float2 vStripeSeamlessTexCoord : TEXCOORD1;
#endif
#if ( VERTEX_LIT == 0 )
float2 vLightmapBlendTexCoord : TEXCOORD2;
#endif
#if BASETEXTURE2 == 1
float3 vBlendFactor : TEXCOORD3;
#endif
float4 worldPos_projPosZ : TEXCOORD4;
float3 vWorldNormal : TEXCOORD5;
float4 vVertexColor : COLOR;
#else
float2 vBaseTexCoord : TEXCOORD0;
#endif
};
float ToGray( const float3 vColor )
{
return dot( vColor, float3( 0.30f, 0.59f, 0.11f ) );
}
void HandleBlending( const float2 vBaseTextureCoord, const float3 vBlendFactor, inout float4 vBaseColor )
{
#if BASETEXTURE2 == 1
float4 vBaseColor2 = tex2D( BaseTexture2Sampler, vBaseTextureCoord );
float flBlendFactor = vBlendFactor.z;
#if FANCY_BLENDING == 1
float4 modt = tex2D( BlendModulationSampler, vBlendFactor.xy );
float minb = saturate( modt.g - modt.r );
float maxb = saturate( modt.g + modt.r );
flBlendFactor = smoothstep( minb, maxb, flBlendFactor );
#endif
vBaseColor = lerp( vBaseColor, vBaseColor2, flBlendFactor );
#endif
}
#if STRIPES
void CalculateStripe( const float2 vStripeSeamlessTexCoord, const float3 vWorldNormal, const float flLMScale, inout float3 vResult )
{
float4 vStripeColor = tex2D( StripeSampler, vStripeSeamlessTexCoord );
vStripeColor.rgb *= g_vStripeColor;
vStripeColor.rgb *= lerp( float3( 1.0, 1.0, 1.0 ), flLMScale, g_flStripeLMScale );
#if VERTEX_LIT == 1 && 0
float flAngle = saturate( dot( vWorldNormal, g_vStripeNormal1 ) );
vResult.rgb = ( vWorldNormal * 0.5 ) + 0.5;
return;
flAngle = 1 - flAngle;
vStripeColor.a *= flAngle;
#endif
vResult = lerp( vResult, vStripeColor.rgb, vStripeColor.a );
}
#endif
#if EFFECT == -1
float4 main( PS_INPUT i ) : COLOR
{
float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
#if BASETEXTURE2 == 1
HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
#endif
// return vBaseColor;
vBaseColor *= i.vVertexColor;
#if VERTEX_LIT == 0
float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
#endif
float4 vCanvas = tex2D( CanvasSampler, i.vBaseAndSeamlessTexCoord.zw );
float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
// return saturate( min( g_FogParams.z, (i.worldPos_projPosZ.w * g_FogParams.w) - g_FogParams.x ) );
// return float4( g_FogParams.x, g_FogParams.z, g_FogParams.w, 1 );
// return g_LinearFogColor;
// flFogFactor = 1;
float4 vResult;
#if 0
vResult = vBaseColor * vLightmapSample;
#else
float flBaseGray = dot( vBaseColor.rgb, float3( 0.30f, 0.59f, 0.11f ) );
#if VERTEX_LIT == 0
float flLightmapGray = dot( vLightmapSample.rgb, float3( 0.30f, 0.59f, 0.11f ) );
#endif
flBaseGray = smoothstep( g_vBaseStepRange.x, g_vBaseStepRange.y, flBaseGray );
vResult = float4( flBaseGray.rrr, vBaseColor.a );
#if VERTEX_LIT == 0
// flLightmapGray = pow( flLightmapGray, 0.01 );
flLightmapGray = smoothstep( g_vLightmapStepRange.x, g_vLightmapStepRange.y, flLightmapGray );
vResult *= flLightmapGray;
#endif
float flCanvasGray = dot( vCanvas.rgb, float3( 0.30f, 0.59f, 0.11f ) );
flCanvasGray = smoothstep( g_vCanvasStepRange.x, g_vCanvasStepRange.y, flCanvasGray );
vCanvas.rgb = lerp( g_vCanvasColorStart, g_vCanvasColorEnd, flCanvasGray );
vResult *= vCanvas;
#endif
return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, true, i.worldPos_projPosZ.w );
}
#elif EFFECT == 0
float4 main( PS_INPUT i ) : COLOR
{
float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
#if BASETEXTURE2 == 1
HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
#endif
vBaseColor.rgb *= i.vVertexColor.rgb;
vBaseColor.rgb = ceil( vBaseColor.rgb * 16.0 ) / 16.0;
#if VERTEX_LIT == 0
float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
#endif
float4 vCanvas = tex2D( CanvasSampler, i.vBaseAndSeamlessTexCoord.zw );
float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
float4 vResult;
float flBaseGray = dot( vBaseColor.rgb, float3( 0.30f, 0.59f, 0.11f ) );
#if VERTEX_LIT == 0
float flLightmapGray = dot( vLightmapSample.rgb, float3( 0.30f, 0.59f, 0.11f ) );
#endif
#ifdef GRAY_DIFFUSE
flBaseGray = smoothstep( g_vBaseStepRange.x, g_vBaseStepRange.y, flBaseGray );
vResult = float4( flBaseGray.rrr, vBaseColor.a );
#else
vResult.rgb = smoothstep( g_vBaseStepRange.xxx, g_vBaseStepRange.yyy, vBaseColor.rgb );
vResult.a = vBaseColor.a;
#endif
#if VERTEX_LIT == 0
#ifdef GRAY_LM
flLightmapGray = pow( flLightmapGray, 0.01 );
flLightmapGray = smoothstep( g_vLightmapStepRange.x, g_vLightmapStepRange.y, flLightmapGray );
vResult.rgb *= flLightmapGray;
#else
vLightmapSample.rgb = smoothstep( g_vLightmapStepRange.xxx, g_vLightmapStepRange.yyy, vLightmapSample.rgb );
// vLightmapSample.rgb = lerp( float3( 0.0, 0.0, 0.0 ), float3( 3.1, 1.1, 5.1 ), vLightmapSample.rgb );
vResult.rgb *= vLightmapSample.rgb;
#endif
#endif
float flCanvasGray = dot( vCanvas.rgb, float3( 0.30f, 0.59f, 0.11f ) );
flCanvasGray = smoothstep( g_vCanvasStepRange.x, g_vCanvasStepRange.y, flCanvasGray );
vCanvas.rgb = lerp( g_vCanvasColorStart, g_vCanvasColorEnd, flCanvasGray );
// vCanvas.rgb = pow( vCanvas.rgb, 0.6 );
vResult *= vCanvas;
return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, true, i.worldPos_projPosZ.w );
}
#elif EFFECT == 1
#define GRAY_DIFFUSE 1
#define GRAY_LM 1
float4 main( PS_INPUT i ) : COLOR
{
float4 vResult;
float4 vBaseColor = tex2D( BaseTextureSampler, i.vBaseAndSeamlessTexCoord.xy );
#if BASETEXTURE2 == 1
HandleBlending( i.vBaseAndSeamlessTexCoord.xy, i.vBlendFactor, vBaseColor );
#endif
float flFogFactor = CalcPixelFogFactor( 0, g_FogParams, g_EyePos.z, i.worldPos_projPosZ.z, i.worldPos_projPosZ.w );
vBaseColor.rgb = lerp( vBaseColor.rgb, 1.0, g_flDiffuseBase );
vResult = vBaseColor * i.vVertexColor;
#if VERTEX_LIT == 0
float4 vLightmapSample = tex2D( LightmapSampler, i.vLightmapBlendTexCoord.xy ) * float4( g_vColorModulation, 1.0 );
vResult.rgb = lerp( vResult.rgb, 0.5, g_flDiffuseLighting );
vResult.rgb *= vLightmapSample.rgb;
#endif
#if SELFILLUM
float3 vSelfIllumComponent = g_vSelfIllumTint * vBaseColor.rgb;
vResult.rgb = lerp( vResult.rgb, vSelfIllumComponent, vBaseColor.a );
#endif
float flGray = dot( vResult.rgb, float3( 0.30f, 0.59f, 0.11f ) );
flGray = pow( flGray, g_flGrayPower );
flGray = smoothstep( g_flGrayStep.x, g_flGrayStep.y, flGray );
flGray = ceil( flGray * g_flLightMapGradients ) / g_flLightMapGradients;
#if COLOR_BAR == 1
float4 vCanvas = tex1D( ColorBarSampler, flGray );
vResult.rgb = vCanvas.rgb * flGray;
#endif
#if STRIPES
CalculateStripe( i.vStripeSeamlessTexCoord, i.vWorldNormal, flGray, vResult.rgb );
#endif
return FinalOutput( vResult, flFogFactor, 0, TONEMAP_SCALE_LINEAR, false, i.worldPos_projPosZ.w );
}
#elif EFFECT == 2
float4 main( PS_INPUT i ) : COLOR
{
float flDepth = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy ).r;
float4 vBaseColor = tex2D( BlurredFrameSampler, i.vBaseTexCoord.xy );
float flAmount;
flAmount = flDepth;
flAmount = saturate( flDepth - g_flDoFStartDistance );
flAmount = pow( flAmount, g_flDoFPower );
flAmount *= g_flDoFMax;
#if VISUALIZE_DOF == 1
return float4( flAmount.rrr, 1 );
#else
return float4( vBaseColor.rgb, flAmount );
#endif
}
#elif EFFECT == 3
float4 main( PS_INPUT i ) : COLOR
{
float flVignetteAmount = tex2D( VignetteSampler, i.vBaseTexCoord.xy );
float4 vVignetteTile = tex2D( VignetteTileSampler, i.vBaseTexCoord.xy * 50.0f );
#if HEATHAZE == 1
float2 vOffset = tex2D( WarpFrameSampler, i.vBaseTexCoord.xy ).aa;
float flDynamicOffset = tex2D( NoiseSampler, float2( i.vBaseTexCoord.x, ( i.vBaseTexCoord.y * g_flNoiseScale ) + ( g_flTime * g_flTimeScale ) ) ).r;
// return float4( vOffset.yyy, 1 );
// return float4( flDynamicOffset.xxx, 1.0 );
// vOffset = ( vOffset - 0.5 );
vOffset = smoothstep( 0.1, 1.0, vOffset );
vOffset *= flDynamicOffset * g_flHeatHazeScale;
float4 vOriginal = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy + float2( 0, vOffset.y ) );
#else
float4 vOriginal = tex2D( BaseTextureSampler, i.vBaseTexCoord.xy );
#endif
float flDelta = flVignetteAmount.x - vVignetteTile.a;
float flFinal = flDelta <= 0.0f ? 0.0f : lerp( flVignetteAmount.x, 1.0, flDelta / flVignetteAmount.x );
vOriginal.rgb = lerp( vOriginal.rgb, vVignetteTile.rgb, flFinal * flVignetteAmount.x );
return float4( vOriginal );
}
#endif