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
133
134
135
136
137
138
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Header: $
// $NoKeywords: $
//=============================================================================//
#include "BaseVSShader.h"
#include "shadow_ps20.inc"
#include "shadow_ps20b.inc"
#include "shadow_vs20.inc"
BEGIN_VS_SHADER_FLAGS( Shadow, "Help for Shadow", SHADER_NOT_EDITABLE )
BEGIN_SHADER_PARAMS
END_SHADER_PARAMS
SHADER_INIT_PARAMS()
{
/*
The alpha blending state either must be:
Src Color * Dst Color + Dst Color * 0
(src color = C*A + 1-A)
or
// Can't be this, doesn't work with fog
Src Color * Dst Color + Dst Color * (1-Src Alpha)
(src color = C * A, Src Alpha = A)
*/
}
SHADER_FALLBACK
{
if ( g_pHardwareConfig->GetDXSupportLevel() < 90 )
{
return "Shadow_DX8";
}
return 0;
}
SHADER_INIT
{
LoadTexture( BASETEXTURE, TEXTUREFLAGS_SRGB );
}
SHADER_DRAW
{
SHADOW_STATE
{
pShaderShadow->EnableTexture( SHADER_SAMPLER0, true );
pShaderShadow->EnableSRGBRead( SHADER_SAMPLER0, true );
// NOTE: This is deliberately this way round (instead of "DST_COLOR, ZERO"),
// since these two permutations produce *different* values on 360!!
// This was causing undue darkening of the framebuffer by these
// shadows, which was highly noticeable in very dark areas:
EnableAlphaBlending( SHADER_BLEND_ZERO, SHADER_BLEND_SRC_COLOR );
unsigned int flags = VERTEX_POSITION | VERTEX_COLOR;
int numTexCoords = 1;
pShaderShadow->VertexShaderVertexFormat( flags, numTexCoords, 0, 0 );
DECLARE_STATIC_VERTEX_SHADER( shadow_vs20 );
SET_STATIC_VERTEX_SHADER( shadow_vs20 );
if( g_pHardwareConfig->SupportsPixelShaders_2_b() )
{
DECLARE_STATIC_PIXEL_SHADER( shadow_ps20b );
SET_STATIC_PIXEL_SHADER( shadow_ps20b );
}
else
{
DECLARE_STATIC_PIXEL_SHADER( shadow_ps20 );
SET_STATIC_PIXEL_SHADER( shadow_ps20 );
}
pShaderShadow->EnableSRGBWrite( true );
// We need to fog to *white* regardless of overbrighting...
FogToWhite();
}
DYNAMIC_STATE
{
BindTexture( SHADER_SAMPLER0, BASETEXTURE, FRAME );
SetVertexShaderTextureTransform( VERTEX_SHADER_SHADER_SPECIFIC_CONST_0, BASETEXTURETRANSFORM );
SetPixelShaderConstantGammaToLinear( 1, COLOR );
// Get texture dimensions...
int nWidth = 16;
int nHeight = 16;
ITexture *pTexture = params[BASETEXTURE]->GetTextureValue();
if (pTexture)
{
nWidth = pTexture->GetActualWidth();
nHeight = pTexture->GetActualHeight();
}
Vector4D vecJitter( 1.0 / nWidth, 1.0 / nHeight, 0.0, 0.0 );
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_2, vecJitter.Base() );
vecJitter.y *= -1.0f;
pShaderAPI->SetVertexShaderConstant( VERTEX_SHADER_SHADER_SPECIFIC_CONST_3, vecJitter.Base() );
MaterialFogMode_t fogType = pShaderAPI->GetSceneFogMode();
int fogIndex = ( fogType == MATERIAL_FOG_LINEAR_BELOW_FOG_Z ) ? 1 : 0;
DECLARE_DYNAMIC_VERTEX_SHADER( shadow_vs20 );
SET_DYNAMIC_VERTEX_SHADER_COMBO( DOWATERFOG, fogIndex );
SET_DYNAMIC_VERTEX_SHADER( shadow_vs20 );
if( g_pHardwareConfig->SupportsPixelShaders_2_b() )
{
DECLARE_DYNAMIC_PIXEL_SHADER( shadow_ps20b );
SET_DYNAMIC_PIXEL_SHADER_COMBO( PIXELFOGTYPE, pShaderAPI->GetPixelFogCombo() );
SET_DYNAMIC_PIXEL_SHADER( shadow_ps20b );
}
else
{
DECLARE_DYNAMIC_PIXEL_SHADER( shadow_ps20 );
SET_DYNAMIC_PIXEL_SHADER_COMBO( PIXELFOGTYPE, pShaderAPI->GetPixelFogCombo() );
SET_DYNAMIC_PIXEL_SHADER( shadow_ps20 );
}
float eyePos[4];
pShaderAPI->GetWorldSpaceCameraPosition( eyePos );
pShaderAPI->SetPixelShaderConstant( 2, eyePos, 1 );
pShaderAPI->SetPixelShaderFogParams( 3 );
}
Draw( );
}
END_SHADER
|