Sdk postprocess
		
		
		
		Jump to navigation
		Jump to search
		
sdk_postprocess is a shader provided with the original Source SDK, it has since been replaced by the current set of SDK_Shaders.
This shader applies an overdone sharpen filter to the image.
sdk_postprocess_ps20.fxc
#include "common_ps_fxc.h"
sampler BaseTextureSampler	: register( s0 );
const HALF sharpenFactor : register( c0 );
struct PS_INPUT
{
	HALF2 vBaseTexCoord0 : TEXCOORD0;
	HALF2 vBaseTexCoord1 : TEXCOORD1;
	HALF2 vBaseTexCoord2 : TEXCOORD2;
	HALF2 vBaseTexCoord3 : TEXCOORD3;
	HALF2 vBaseTexCoord4 : TEXCOORD4;
};
HALF4 main( PS_INPUT i ) : COLOR
{
	HALF4 mainColor = tex2D( BaseTextureSampler, i.vBaseTexCoord1 );
	HALF4 baseColor1 = tex2D( BaseTextureSampler, i.vBaseTexCoord1 );
	HALF4 baseColor2 = tex2D( BaseTextureSampler, i.vBaseTexCoord2 );
	HALF4 baseColor3 = tex2D( BaseTextureSampler, i.vBaseTexCoord3 );
	HALF4 baseColor4 = tex2D( BaseTextureSampler, i.vBaseTexCoord4 );
	HALF4 g = mainColor - (baseColor1 + baseColor2 + baseColor3 + baseColor4) * 0.25;
	return mainColor + g * sharpenFactor;
}
sdk_postprocess_vs20.fxc
#include "common_vs_fxc.h"
struct VS_INPUT
{
	float3 vPos						: POSITION;
	float2 vBaseTexCoord			: TEXCOORD0;
};
struct VS_OUTPUT
{
    float4 vProjPos					: POSITION;	
	float2 vBaseTexCoord0			: TEXCOORD0;
	float2 vBaseTexCoord1			: TEXCOORD1;
	float2 vBaseTexCoord2			: TEXCOORD2;
	float2 vBaseTexCoord3			: TEXCOORD3;
	float2 vBaseTexCoord4			: TEXCOORD4;
};
const float cBlurAmount :  register( SHADER_SPECIFIC_CONST_0 );
VS_OUTPUT main( const VS_INPUT v )
{
	VS_OUTPUT o = ( VS_OUTPUT )0;
	// Project the point.
	float4 vProjPos = mul( float4( v.vPos, 1 ), cModelViewProj );
	o.vProjPos = vProjPos;
	// Pass texture coordinates through to the pixel shader.
	float adj = cBlurAmount;
	
	o.vBaseTexCoord0 = v.vBaseTexCoord;
	o.vBaseTexCoord1 = v.vBaseTexCoord + float2( -adj, adj );
	o.vBaseTexCoord2 = v.vBaseTexCoord + float2( -adj, -adj );
	o.vBaseTexCoord3 = v.vBaseTexCoord + float2( adj, -adj );
	o.vBaseTexCoord4 = v.vBaseTexCoord + float2( adj, adj );
	return o;
}
sdk_postprocess.cpp
//========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose: Just about as simple as a shader gets. Specify a vertex
//          and pixel shader, bind textures, and that's it.
//
// $Header: $
// $NoKeywords: $
//=============================================================================//
#include "BaseVSShader.h"
#include "convar.h"
/*
NOTE: this shader needs to be called from the client DLL. You could insert this code at the end of CViewRender::RenderView.
if ( g_pMaterialSystemHardwareConfig->GetDXSupportLevel() >= 80 )
{
		// Get whatever material references your postprocess shader.
		IMaterial *pMaterial = materials->FindMaterial( "sdk/sdk_postprocess", TEXTURE_GROUP_CLIENT_EFFECTS, true );
		if ( pMaterial )
		{
				// This copies the contents of the framebuffer (drawn during RenderView) into a texture that your shader can use.
				UpdateScreenEffectTexture( 0 );
				materials->MatrixMode( MATERIAL_PROJECTION );
				materials->PushMatrix();
				materials->LoadIdentity();	
				materials->MatrixMode( MATERIAL_VIEW );
				materials->PushMatrix();
				materials->LoadIdentity();	
				materials->DrawScreenSpaceQuad( pMaterial );
				materials->MatrixMode( MATERIAL_PROJECTION );
				materials->PopMatrix();
				materials->MatrixMode( MATERIAL_VIEW );
				materials->PopMatrix();
		}
}
*/
BEGIN_VS_SHADER( SDK_PostProcess, "Help for SDK_PostProcess" )
	BEGIN_SHADER_PARAMS
		SHADER_PARAM( FILTERSIZE, SHADER_PARAM_TYPE_FLOAT, "0.0", "contrast 0 == normal 1 == color*color" )
		SHADER_PARAM( SHARPENFACTOR, SHADER_PARAM_TYPE_FLOAT, "0.0", "contrast 0 == normal 1 == color*color" )
	END_SHADER_PARAMS
	// Set up anything that is necessary to make decisions in SHADER_FALLBACK.
	SHADER_INIT_PARAMS()
	{
	}
	SHADER_FALLBACK
	{
		return 0;
	}
	bool NeedsFullFrameBufferTexture( IMaterialVar **params ) const
	{
		return true;
	}
	SHADER_INIT
	{
	}
	SHADER_DRAW
	{
		SHADOW_STATE
		{
			// Enable the texture for base texture and lightmap.
			pShaderShadow->EnableTexture( SHADER_TEXTURE_STAGE0, true );
			pShaderShadow->EnableDepthWrites( false );
			int fmt = VERTEX_POSITION;
			pShaderShadow->VertexShaderVertexFormat( fmt, 1, 0, 0, 0 );
			pShaderShadow->SetVertexShader( "sdk_postprocess_vs20", 0 );
			pShaderShadow->SetPixelShader( "sdk_postprocess_ps20" );
			// Optional, do some blending..
			//pShaderShadow->EnableBlending( true );
			//pShaderShadow->BlendFunc( SHADER_BLEND_DST_COLOR, SHADER_BLEND_SRC_COLOR );
			DefaultFog();
		}
		DYNAMIC_STATE
		{
			// Tell it how wide the blur is.
			int width, height;
			pShaderAPI->GetBackBufferDimensions( width, height );
			float v[4] = {0,0,0,0};
			v[0] = params[FILTERSIZE]->GetFloatValue() / width;
			pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_0, v, 1 );
			float factor[4];
			factor[0] = params[SHARPENFACTOR]->GetFloatValue();
			factor[1] = factor[2] = factor[3] = factor[0];
			pShaderAPI->SetPixelShaderConstant( 0, factor );
			pShaderAPI->BindFBTexture( SHADER_TEXTURE_STAGE0 );
			pShaderAPI->SetVertexShaderIndex( 0 );
		}
		Draw();
	}
END_SHADER