diff options
| author | Joe Ludwig <[email protected]> | 2013-12-23 14:58:45 -0800 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-12-23 15:00:03 -0800 |
| commit | 7309a5f13f63fdcc7b1e090f6c176113a9d95061 (patch) | |
| tree | ad65c7fbe46a3c70bdc0a1426e88247ce1b0d7f5 /mp/src/materialsystem/stdshaders/depthwrite.cpp | |
| parent | Merge pull request #182 from ardneran/master (diff) | |
| download | source-sdk-2013-7309a5f13f63fdcc7b1e090f6c176113a9d95061.tar.xz source-sdk-2013-7309a5f13f63fdcc7b1e090f6c176113a9d95061.zip | |
Added many shader source files
This should include the latest version of every shader that was in the
2007 SDK. It also includes a smattering of debug shaders, both VR
distortion shaders, and other assorted shaders that will hopefully be
useful.
None of these new files are included in the game shader DLL project. If
you need to modify one of these shaders for use in your mod you will
need to rename it so that you don't collide with the version of that
shader that lives in stdshader_dx9.dll.
Diffstat (limited to 'mp/src/materialsystem/stdshaders/depthwrite.cpp')
| -rw-r--r-- | mp/src/materialsystem/stdshaders/depthwrite.cpp | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/mp/src/materialsystem/stdshaders/depthwrite.cpp b/mp/src/materialsystem/stdshaders/depthwrite.cpp new file mode 100644 index 00000000..06d7690f --- /dev/null +++ b/mp/src/materialsystem/stdshaders/depthwrite.cpp @@ -0,0 +1,207 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $Header: $ +// $NoKeywords: $ +//=============================================================================// + +#include "BaseVSShader.h" + +#include "depthwrite_ps20.inc" +#include "depthwrite_ps20b.inc" +#include "depthwrite_vs20.inc" + +#if !defined( _X360 ) +#include "depthwrite_ps30.inc" +#include "depthwrite_vs30.inc" +#endif + +BEGIN_VS_SHADER_FLAGS( DepthWrite, "Help for Depth Write", SHADER_NOT_EDITABLE ) + + BEGIN_SHADER_PARAMS + SHADER_PARAM( ALPHATESTREFERENCE, SHADER_PARAM_TYPE_FLOAT, "", "Alpha reference value" ) + SHADER_PARAM( COLOR_DEPTH, SHADER_PARAM_TYPE_BOOL, "0", "Write depth as color") + END_SHADER_PARAMS + + SHADER_INIT_PARAMS() + { + SET_FLAGS2( MATERIAL_VAR2_SUPPORTS_HW_SKINNING ); + } + + SHADER_FALLBACK + { + if ( g_pHardwareConfig->GetDXSupportLevel() < 90 ) + { + return "Wireframe"; + } + return 0; + } + + SHADER_INIT + { + } + + SHADER_DRAW + { + bool bAlphaClip = IS_FLAG_SET( MATERIAL_VAR_ALPHATEST ); + int nColorDepth = GetIntParam( COLOR_DEPTH, params, 0 ); + + SHADOW_STATE + { + // Set stream format (note that this shader supports compression) + unsigned int flags = VERTEX_POSITION | VERTEX_FORMAT_COMPRESSED; + int nTexCoordCount = 1; + int userDataSize = 0; + pShaderShadow->VertexShaderVertexFormat( flags, nTexCoordCount, NULL, userDataSize ); + + if ( nColorDepth == 0 ) + { + // Bias primitives when rendering into shadow map so we get slope-scaled depth bias + // rather than having to apply a constant bias in the filtering shader later + pShaderShadow->EnablePolyOffset( SHADER_POLYOFFSET_SHADOW_BIAS ); + } + + // Turn off writes to color buffer since we always sample shadows from the DEPTH texture later + // This gives us double-speed fill when rendering INTO the shadow map + pShaderShadow->EnableColorWrites( ( nColorDepth == 1 ) ); + pShaderShadow->EnableAlphaWrites( false ); + + // Don't backface cull unless alpha clipping, since this can cause artifacts when the + // geometry is clipped by the flashlight near plane + // If a material was already marked nocull, don't cull it + pShaderShadow->EnableCulling( IS_FLAG_SET(MATERIAL_VAR_ALPHATEST) && !IS_FLAG_SET(MATERIAL_VAR_NOCULL) ); + +#ifndef _X360 + if ( !g_pHardwareConfig->HasFastVertexTextures() ) +#endif + { + DECLARE_STATIC_VERTEX_SHADER( depthwrite_vs20 ); + SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, !bAlphaClip && IsX360() && !nColorDepth ); //360 needs to know if it *shouldn't* output texture coordinates to avoid shader patches + SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth ); + SET_STATIC_VERTEX_SHADER( depthwrite_vs20 ); + + if ( bAlphaClip || g_pHardwareConfig->PlatformRequiresNonNullPixelShaders() || nColorDepth ) + { + if( bAlphaClip ) + { + pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); + pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, true ); + } + + if( g_pHardwareConfig->SupportsPixelShaders_2_b() ) + { + DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps20b ); + SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth ); + SET_STATIC_PIXEL_SHADER( depthwrite_ps20b ); + } + else + { + DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps20 ); + SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth ); + SET_STATIC_PIXEL_SHADER( depthwrite_ps20 ); + } + } + } +#ifndef _X360 + else + { + SET_FLAGS2( MATERIAL_VAR2_USES_VERTEXID ); + + DECLARE_STATIC_VERTEX_SHADER( depthwrite_vs30 ); + SET_STATIC_VERTEX_SHADER_COMBO( ONLY_PROJECT_POSITION, 0 ); //360 only combo, and this is a PC path + SET_STATIC_VERTEX_SHADER_COMBO( COLOR_DEPTH, nColorDepth ); + SET_STATIC_VERTEX_SHADER( depthwrite_vs30 ); + + pShaderShadow->EnableTexture( SHADER_SAMPLER0, true ); + pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, true ); + + DECLARE_STATIC_PIXEL_SHADER( depthwrite_ps30 ); + SET_STATIC_PIXEL_SHADER_COMBO( COLOR_DEPTH, nColorDepth ); + SET_STATIC_PIXEL_SHADER( depthwrite_ps30 ); + } +#endif + } + DYNAMIC_STATE + { + +#ifndef _X360 + if ( !g_pHardwareConfig->HasFastVertexTextures() ) +#endif + { + depthwrite_vs20_Dynamic_Index vshIndex; + vshIndex.SetSKINNING( pShaderAPI->GetCurrentNumBones() > 0 ); + vshIndex.SetCOMPRESSED_VERTS( (int)vertexCompression ); + pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() ); + + if ( bAlphaClip ) + { + BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME ); + + float vAlphaThreshold[4] = {0.7f, 0.7f, 0.7f, 0.7f}; + if ( ALPHATESTREFERENCE != -1 && ( params[ALPHATESTREFERENCE]->GetFloatValue() > 0.0f ) ) + { + vAlphaThreshold[0] = vAlphaThreshold[1] = vAlphaThreshold[2] = vAlphaThreshold[3] = params[ALPHATESTREFERENCE]->GetFloatValue(); + } + + pShaderAPI->SetPixelShaderConstant( 0, vAlphaThreshold, 1 ); + } + + if( g_pHardwareConfig->SupportsPixelShaders_2_b() ) + { + DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps20b ); + SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip ); + SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps20b ); + } + else + { + DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps20 ); + SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip ); + SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps20 ); + } + } +#ifndef _X360 + else // 3.0 shader case (PC only) + { + SetHWMorphVertexShaderState( VERTEX_SHADER_SHADER_SPECIFIC_CONST_6, VERTEX_SHADER_SHADER_SPECIFIC_CONST_7, SHADER_VERTEXTEXTURE_SAMPLER0 ); + + depthwrite_vs30_Dynamic_Index vshIndex; + vshIndex.SetSKINNING( pShaderAPI->GetCurrentNumBones() > 0 ); + vshIndex.SetMORPHING( pShaderAPI->IsHWMorphingEnabled() ); + vshIndex.SetCOMPRESSED_VERTS( (int)vertexCompression ); + pShaderAPI->SetVertexShaderIndex( vshIndex.GetIndex() ); + + if ( bAlphaClip ) + { + BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME ); + + float vAlphaThreshold[4] = {0.7f, 0.7f, 0.7f, 0.7f}; + if ( ALPHATESTREFERENCE != -1 && ( params[ALPHATESTREFERENCE]->GetFloatValue() > 0.0f ) ) + { + vAlphaThreshold[0] = vAlphaThreshold[1] = vAlphaThreshold[2] = vAlphaThreshold[3] = params[ALPHATESTREFERENCE]->GetFloatValue(); + } + + pShaderAPI->SetPixelShaderConstant( 0, vAlphaThreshold, 1 ); + } + + DECLARE_DYNAMIC_PIXEL_SHADER( depthwrite_ps30 ); + SET_DYNAMIC_PIXEL_SHADER_COMBO( ALPHACLIP, bAlphaClip ); + SET_DYNAMIC_PIXEL_SHADER( depthwrite_ps30 ); + } +#endif + + Vector4D vParms; + + // set up arbitrary far planes, as the real ones are too far ( 30,000 ) +// pShaderAPI->SetPSNearAndFarZ( 1 ); + vParms.x = 7.0f; // arbitrary near + vParms.y = 4000.0f; // arbitrary far + vParms.z = 0.0f; + vParms.w = 0.0f; + pShaderAPI->SetPixelShaderConstant( 1, vParms.Base(), 2 ); + + } // DYNAMIC_STATE + + Draw( ); + } +END_SHADER |