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
139
140
141
142
143
144
145
146
147
148
|
"#ifndef _BASIC_STRUCTURES_FXH_\n"
"#define _BASIC_STRUCTURES_FXH_\n"
"\n"
"\n"
"#ifdef __cplusplus\n"
"\n"
"# ifndef BOOL\n"
"# define BOOL int32_t // Do not use bool, because sizeof(bool)==1 !\n"
"# endif\n"
"\n"
"# ifndef CHECK_STRUCT_ALIGNMENT\n"
" // Note that defining empty macros causes GL shader compilation error on Mac, because\n"
" // it does not allow standalone semicolons outside of main.\n"
" // On the other hand, adding semicolon at the end of the macro definition causes gcc error.\n"
"# define CHECK_STRUCT_ALIGNMENT(s) static_assert( sizeof(s) % 16 == 0, \"sizeof(\" #s \") is not multiple of 16\" )\n"
"# endif\n"
"\n"
"# ifndef DEFAULT_VALUE\n"
"# define DEFAULT_VALUE(x) =x\n"
"# endif\n"
"\n"
"#else\n"
"\n"
"# ifndef BOOL\n"
"# define BOOL bool\n"
"# endif\n"
"\n"
"# ifndef DEFAULT_VALUE\n"
"# define DEFAULT_VALUE(x)\n"
"# endif\n"
"\n"
"#endif\n"
"\n"
"\n"
"struct CascadeAttribs\n"
"{\n"
" float4 f4LightSpaceScale;\n"
" float4 f4LightSpaceScaledBias;\n"
" float4 f4StartEndZ;\n"
"\n"
" // Cascade margin in light projection space ([-1, +1] x [-1, +1] x [-1(GL) or 0, +1])\n"
" float4 f4MarginProjSpace;\n"
"};\n"
"#ifdef CHECK_STRUCT_ALIGNMENT\n"
" CHECK_STRUCT_ALIGNMENT(CascadeAttribs);\n"
"#endif\n"
"\n"
"#define SHADOW_MODE_PCF 1\n"
"#define SHADOW_MODE_VSM 2\n"
"#define SHADOW_MODE_EVSM2 3\n"
"#define SHADOW_MODE_EVSM4 4\n"
"#ifndef SHADOW_MODE\n"
"# define SHADOW_MODE SHADOW_MODE_PCF\n"
"#endif\n"
"\n"
"#define MAX_CASCADES 8\n"
"struct ShadowMapAttribs\n"
"{\n"
" // 0\n"
"#ifdef __cplusplus\n"
" float4x4 mWorldToLightViewT; // Matrices in HLSL are COLUMN-major while float4x4 is ROW major\n"
"#else\n"
" matrix mWorldToLightView; // Transform from view space to light projection space\n"
"#endif\n"
" // 16\n"
" CascadeAttribs Cascades[MAX_CASCADES];\n"
"\n"
"#ifdef __cplusplus\n"
" float4x4 mWorldToShadowMapUVDepthT[MAX_CASCADES];\n"
" float fCascadeCamSpaceZEnd[MAX_CASCADES];\n"
"#else\n"
" matrix mWorldToShadowMapUVDepth[MAX_CASCADES];\n"
" float4 f4CascadeCamSpaceZEnd[MAX_CASCADES/4];\n"
"#endif\n"
"\n"
" float4 f4ShadowMapDim; // Width, Height, 1/Width, 1/Height\n"
"\n"
" // Number of shadow cascades\n"
" int iNumCascades DEFAULT_VALUE(0);\n"
" float fNumCascades DEFAULT_VALUE(0);\n"
" // Do not use bool, because sizeof(bool)==1 !\n"
" BOOL bVisualizeCascades DEFAULT_VALUE(0);\n"
" BOOL bVisualizeShadowing DEFAULT_VALUE(0);\n"
"\n"
" float fReceiverPlaneDepthBiasClamp DEFAULT_VALUE(10);\n"
" float fFixedDepthBias DEFAULT_VALUE(1e-5f);\n"
" float fCascadeTransitionRegion DEFAULT_VALUE(0.1f);\n"
" int iMaxAnisotropy DEFAULT_VALUE(4);\n"
"\n"
" float fVSMBias DEFAULT_VALUE(1e-4f);\n"
" float fVSMLightBleedingReduction DEFAULT_VALUE(0);\n"
" float fEVSMPositiveExponent DEFAULT_VALUE(40);\n"
" float fEVSMNegativeExponent DEFAULT_VALUE(5);\n"
"\n"
" BOOL bIs32BitEVSM DEFAULT_VALUE(1);\n"
" int iFixedFilterSize DEFAULT_VALUE(3); // 3x3 filter\n"
" float fFilterWorldSize DEFAULT_VALUE(0);\n"
" bool fDummy;\n"
"};\n"
"#ifdef CHECK_STRUCT_ALIGNMENT\n"
" CHECK_STRUCT_ALIGNMENT(ShadowMapAttribs);\n"
"#endif\n"
"\n"
"struct LightAttribs\n"
"{\n"
" float4 f4Direction DEFAULT_VALUE(float4(0, 0,-1, 0));\n"
" float4 f4AmbientLight DEFAULT_VALUE(float4(0, 0, 0, 0));\n"
" float4 f4Intensity DEFAULT_VALUE(float4(1, 1, 1, 1));\n"
"\n"
" ShadowMapAttribs ShadowAttribs;\n"
"};\n"
"#ifdef CHECK_STRUCT_ALIGNMENT\n"
" CHECK_STRUCT_ALIGNMENT(LightAttribs);\n"
"#endif\n"
"\n"
"struct CameraAttribs\n"
"{\n"
" float4 f4Position; // Camera world position\n"
" float4 f4ViewportSize; // (width, height, 1/width, 1/height)\n"
"\n"
" float2 f2ViewportOrigin; // (min x, min y)\n"
" float fNearPlaneZ; \n"
" float fFarPlaneZ; // fNearPlaneZ < fFarPlaneZ\n"
"\n"
"#ifdef __cplusplus\n"
" float4x4 mViewT;\n"
" float4x4 mProjT;\n"
" float4x4 mViewProjT;\n"
" float4x4 mViewInvT;\n"
" float4x4 mProjInvT;\n"
" float4x4 mViewProjInvT;\n"
"#else\n"
" matrix mView;\n"
" matrix mProj;\n"
" matrix mViewProj;\n"
" matrix mViewInv;\n"
" matrix mProjInv;\n"
" matrix mViewProjInv;\n"
"#endif\n"
"\n"
" float4 f4ExtraData[5]; // Any appliation-specific data\n"
" // Sizeof(CameraAttribs) == 256*2\n"
"};\n"
"#ifdef CHECK_STRUCT_ALIGNMENT\n"
" CHECK_STRUCT_ALIGNMENT(CameraAttribs);\n"
"#endif\n"
"\n"
"#endif //_BASIC_STRUCTURES_FXH_\n"
|