1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//===========================================================================//
#include "BaseVSShader.h"
#include "motion_blur_vs20.inc"
#include "motion_blur_ps20.inc"
#include "motion_blur_ps20b.inc"
#include "convar.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
ConVar mat_motion_blur_percent_of_screen_max( "mat_motion_blur_percent_of_screen_max", "4.0" );
DEFINE_FALLBACK_SHADER( MotionBlur, MotionBlur_dx9 )
BEGIN_VS_SHADER_FLAGS( MotionBlur_dx9, "Motion Blur", SHADER_NOT_EDITABLE )
BEGIN_SHADER_PARAMS
SHADER_PARAM( MOTIONBLURINTERNAL, SHADER_PARAM_TYPE_VEC4, "[0 0 0 0]", "Internal motion blur value set by proxy" )
END_SHADER_PARAMS
SHADER_INIT_PARAMS()
{
}
SHADER_FALLBACK
{
if ( g_pHardwareConfig->GetDXSupportLevel() < 90 )
{
return "Wireframe";
}
return 0;
}
SHADER_INIT
{
if ( params[BASETEXTURE]->IsDefined() )
{
LoadTexture( BASETEXTURE, IsOSX() && g_pHardwareConfig->CanDoSRGBReadFromRTs() ? TEXTUREFLAGS_SRGB : 0 );
}
}
SHADER_DRAW
{
SHADOW_STATE
{
pShaderShadow->VertexShaderVertexFormat( VERTEX_POSITION, 1, 0, 0 );
// On OpenGL OSX, we must do sRGB reads and writes since these render targets are tagged as such
bool bForceSRGBReadsAndWrites = IsOSX() && g_pHardwareConfig->CanDoSRGBReadFromRTs();
// NOTE: sRGB is disabled because of the NV8800 brokenness
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, bForceSRGBReadsAndWrites );
pShaderShadow->EnableSRGBWrite( bForceSRGBReadsAndWrites );
DECLARE_STATIC_VERTEX_SHADER( motion_blur_vs20 );
SET_STATIC_VERTEX_SHADER( motion_blur_vs20 );
if ( g_pHardwareConfig->SupportsPixelShaders_2_b() )
{
DECLARE_STATIC_PIXEL_SHADER( motion_blur_ps20b );
SET_STATIC_PIXEL_SHADER( motion_blur_ps20b );
}
else
{
DECLARE_STATIC_PIXEL_SHADER( motion_blur_ps20 );
SET_STATIC_PIXEL_SHADER( motion_blur_ps20 );
}
pShaderShadow->EnableDepthWrites( false );
pShaderShadow->EnableAlphaWrites( false );
}
DYNAMIC_STATE
{
DECLARE_DYNAMIC_VERTEX_SHADER( motion_blur_vs20 );
SET_DYNAMIC_VERTEX_SHADER( motion_blur_vs20 );
// Bind textures
BindTexture( SHADER_SAMPLER0, BASETEXTURE );
// Get texture dimensions
ITexture *src_texture = params[BASETEXTURE]->GetTextureValue();
//int flTextureWidth = src_texture->GetActualWidth();
int flTextureHeight = src_texture->GetActualHeight();
// Percent of screen clamp
float vConst[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
vConst[0] = mat_motion_blur_percent_of_screen_max.GetFloat() / 100.0f;
pShaderAPI->SetPixelShaderConstant( 0, vConst, 1 );
// Set values from material proxy
pShaderAPI->SetPixelShaderConstant( 1, params[MOTIONBLURINTERNAL]->GetVecValue(), 1 );
// Quality based on screen resolution height
int nQuality = 1;
if ( flTextureHeight >= 1080 ) // 1080p and higher
nQuality = 3;
else if ( flTextureHeight >= 720 ) // 720p to 1080p
nQuality = 2;
else // Lower resolution than 720p
nQuality = 1;
if ( fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[0] ) + fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[1] ) +
fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[2] ) + fabs( params[MOTIONBLURINTERNAL]->GetVecValue()[3] ) == 0.0f )
{
// No motion blur this frame, so force quality to 0
nQuality = 0;
}
if ( g_pHardwareConfig->SupportsPixelShaders_2_b() )
{
DECLARE_DYNAMIC_PIXEL_SHADER( motion_blur_ps20b );
SET_DYNAMIC_PIXEL_SHADER_COMBO( QUALITY, nQuality );
SET_DYNAMIC_PIXEL_SHADER( motion_blur_ps20b );
}
else
{
DECLARE_DYNAMIC_PIXEL_SHADER( motion_blur_ps20 );
SET_DYNAMIC_PIXEL_SHADER_COMBO( QUALITY, nQuality );
SET_DYNAMIC_PIXEL_SHADER( motion_blur_ps20 );
}
}
Draw();
}
END_SHADER
|