mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
461 lines
12 KiB
Plaintext
461 lines
12 KiB
Plaintext
// 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
|