Skip to content

Commit 6fded2e

Browse files
committed
PBR shader, ported from Strata with permission; added $emissivefresnel
1 parent d01357c commit 6fded2e

File tree

11 files changed

+1509
-994
lines changed

11 files changed

+1509
-994
lines changed

src/materialsystem/stdshaders/common_fxc.h

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,60 @@ float4 tex2Dsrgb( sampler iSampler, float2 iUv )
330330
#endif
331331
}
332332

333+
float4 tex2Dsrgblod( sampler iSampler, float4 iUv )
334+
{
335+
// This function is named as a hint that the texture is meant to be read with
336+
// an sRGB->linear conversion. We have to do this in shader code on the 360 sometimes.
337+
#if ( SHADER_SRGB_READ == 0 )
338+
{
339+
// Don't fake the srgb read in shader code
340+
return tex2Dlod( iSampler, iUv );
341+
}
342+
#else
343+
{
344+
if ( IsX360() )
345+
{
346+
float4 vTextureValue = tex2Dlod( iSampler, iUv );
347+
vTextureValue.rgb = X360GammaToLinear( vTextureValue.rgb );
348+
return vTextureValue.rgba;
349+
}
350+
else
351+
{
352+
float4 vTextureValue = tex2Dlod( iSampler, iUv );
353+
vTextureValue.rgb = SrgbGammaToLinear( vTextureValue.rgb );
354+
return vTextureValue.rgba;
355+
}
356+
}
357+
#endif
358+
}
359+
360+
float4 tex2Dsrgbgrad( sampler iSampler, float2 iUv, float2 iDdx, float2 iDdy )
361+
{
362+
// This function is named as a hint that the texture is meant to be read with
363+
// an sRGB->linear conversion. We have to do this in shader code on the 360 sometimes.
364+
#if ( SHADER_SRGB_READ == 0 )
365+
{
366+
// Don't fake the srgb read in shader code
367+
return tex2Dgrad( iSampler, iUv, iDdx, iDdy );
368+
}
369+
#else
370+
{
371+
if ( IsX360() )
372+
{
373+
float4 vTextureValue = tex2Dgrad( iSampler, iUv, iDdx, iDdy );
374+
vTextureValue.rgb = X360GammaToLinear( vTextureValue.rgb );
375+
return vTextureValue.rgba;
376+
}
377+
else
378+
{
379+
float4 vTextureValue = tex2Dgrad( iSampler, iUv, iDdx, iDdy );
380+
vTextureValue.rgb = SrgbGammaToLinear( vTextureValue.rgb );
381+
return vTextureValue.rgba;
382+
}
383+
}
384+
#endif
385+
}
386+
333387
// Tangent transform helper functions
334388
float3 Vec3WorldToTangent( float3 iWorldVector, float3 iWorldNormal, float3 iWorldTangent, float3 iWorldBinormal )
335389
{

src/materialsystem/stdshaders/include/pbr_ps20b.inc

Lines changed: 106 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
// ALL SKIP STATEMENTS THAT AFFECT THIS SHADER!!!
2-
// ($PIXELFOGTYPE == 0) && ($WRITEWATERFOGTODESTALPHA != 0)
32
// ( $FLASHLIGHT == 0 ) && ( $FLASHLIGHTSHADOWS == 1 )
43
// ( $FLASHLIGHT == 0 ) && ( $FLASHLIGHTDEPTHFILTERMODE != 0 )
5-
// ( $LIGHTMAPPED == 0 ) && ( $PARALLAXCORRECT != 0 )
4+
// !$HSV && $HSV_BLEND
5+
// defined $PIXELFOGTYPE && defined $WRITEWATERFOGTODESTALPHA && ( $PIXELFOGTYPE != 1 ) && $WRITEWATERFOGTODESTALPHA
6+
// defined $LIGHTING_PREVIEW && defined $FASTPATHENVMAPTINT && $LIGHTING_PREVIEW && $FASTPATHENVMAPTINT
7+
// defined $LIGHTING_PREVIEW && defined $FASTPATHENVMAPCONTRAST && $LIGHTING_PREVIEW && $FASTPATHENVMAPCONTRAST
8+
// defined $LIGHTING_PREVIEW && defined $FASTPATH && $LIGHTING_PREVIEW && $FASTPATH
9+
// ($FLASHLIGHT || $FLASHLIGHTSHADOWS) && $LIGHTING_PREVIEW
610
// defined $PIXELFOGTYPE && defined $WRITEWATERFOGTODESTALPHA && ( $PIXELFOGTYPE != 1 ) && $WRITEWATERFOGTODESTALPHA
711
// defined $LIGHTING_PREVIEW && defined $FASTPATHENVMAPTINT && $LIGHTING_PREVIEW && $FASTPATHENVMAPTINT
812
// defined $LIGHTING_PREVIEW && defined $FASTPATHENVMAPCONTRAST && $LIGHTING_PREVIEW && $FASTPATHENVMAPCONTRAST
@@ -27,15 +31,27 @@ class pbr_ps20b_Static_Index
2731
unsigned int m_nFLASHLIGHTDEPTHFILTERMODE : 2;
2832
unsigned int m_nLIGHTMAPPED : 2;
2933
unsigned int m_nEMISSIVE : 2;
30-
unsigned int m_nSPECULAR : 2;
34+
unsigned int m_nPARALLAXOCCLUSION : 1;
35+
unsigned int m_nWVT : 2;
36+
unsigned int m_nHSV : 2;
37+
unsigned int m_nHSV_BLEND : 2;
3138
unsigned int m_nPARALLAXCORRECT : 2;
39+
unsigned int m_nBLENDTINTBYMRAOALPHA : 2;
40+
unsigned int m_nPARALLAXDITHER : 1;
41+
unsigned int m_nEMISSIVEFRESNEL : 1;
3242
#ifdef _DEBUG
3343
bool m_bFLASHLIGHT : 1;
3444
bool m_bFLASHLIGHTDEPTHFILTERMODE : 1;
3545
bool m_bLIGHTMAPPED : 1;
3646
bool m_bEMISSIVE : 1;
37-
bool m_bSPECULAR : 1;
47+
bool m_bPARALLAXOCCLUSION : 1;
48+
bool m_bWVT : 1;
49+
bool m_bHSV : 1;
50+
bool m_bHSV_BLEND : 1;
3851
bool m_bPARALLAXCORRECT : 1;
52+
bool m_bBLENDTINTBYMRAOALPHA : 1;
53+
bool m_bPARALLAXDITHER : 1;
54+
bool m_bEMISSIVEFRESNEL : 1;
3955
#endif // _DEBUG
4056
public:
4157
void SetFLASHLIGHT( int i )
@@ -74,12 +90,39 @@ public:
7490
#endif // _DEBUG
7591
}
7692

77-
void SetSPECULAR( int i )
93+
void SetPARALLAXOCCLUSION( int i )
94+
{
95+
Assert( i >= 0 && i <= 0 );
96+
m_nPARALLAXOCCLUSION = i;
97+
#ifdef _DEBUG
98+
m_bPARALLAXOCCLUSION = true;
99+
#endif // _DEBUG
100+
}
101+
102+
void SetWVT( int i )
103+
{
104+
Assert( i >= 0 && i <= 1 );
105+
m_nWVT = i;
106+
#ifdef _DEBUG
107+
m_bWVT = true;
108+
#endif // _DEBUG
109+
}
110+
111+
void SetHSV( int i )
112+
{
113+
Assert( i >= 0 && i <= 1 );
114+
m_nHSV = i;
115+
#ifdef _DEBUG
116+
m_bHSV = true;
117+
#endif // _DEBUG
118+
}
119+
120+
void SetHSV_BLEND( int i )
78121
{
79122
Assert( i >= 0 && i <= 1 );
80-
m_nSPECULAR = i;
123+
m_nHSV_BLEND = i;
81124
#ifdef _DEBUG
82-
m_bSPECULAR = true;
125+
m_bHSV_BLEND = true;
83126
#endif // _DEBUG
84127
}
85128

@@ -92,69 +135,87 @@ public:
92135
#endif // _DEBUG
93136
}
94137

138+
void SetBLENDTINTBYMRAOALPHA( int i )
139+
{
140+
Assert( i >= 0 && i <= 1 );
141+
m_nBLENDTINTBYMRAOALPHA = i;
142+
#ifdef _DEBUG
143+
m_bBLENDTINTBYMRAOALPHA = true;
144+
#endif // _DEBUG
145+
}
146+
147+
void SetPARALLAXDITHER( int i )
148+
{
149+
Assert( i >= 0 && i <= 0 );
150+
m_nPARALLAXDITHER = i;
151+
#ifdef _DEBUG
152+
m_bPARALLAXDITHER = true;
153+
#endif // _DEBUG
154+
}
155+
156+
void SetEMISSIVEFRESNEL( int i )
157+
{
158+
Assert( i >= 0 && i <= 0 );
159+
m_nEMISSIVEFRESNEL = i;
160+
#ifdef _DEBUG
161+
m_bEMISSIVEFRESNEL = true;
162+
#endif // _DEBUG
163+
}
164+
95165
pbr_ps20b_Static_Index( IShaderShadow* pShaderShadow, IMaterialVar** params )
96166
{
97167
m_nFLASHLIGHT = 0;
98168
m_nFLASHLIGHTDEPTHFILTERMODE = 0;
99169
m_nLIGHTMAPPED = 0;
100170
m_nEMISSIVE = 0;
101-
m_nSPECULAR = 0;
171+
m_nPARALLAXOCCLUSION = 0;
172+
m_nWVT = 0;
173+
m_nHSV = 0;
174+
m_nHSV_BLEND = 0;
102175
m_nPARALLAXCORRECT = 0;
176+
m_nBLENDTINTBYMRAOALPHA = 0;
177+
m_nPARALLAXDITHER = 0;
178+
m_nEMISSIVEFRESNEL = 0;
103179
#ifdef _DEBUG
104180
m_bFLASHLIGHT = false;
105181
m_bFLASHLIGHTDEPTHFILTERMODE = false;
106182
m_bLIGHTMAPPED = false;
107183
m_bEMISSIVE = false;
108-
m_bSPECULAR = false;
184+
m_bPARALLAXOCCLUSION = false;
185+
m_bWVT = false;
186+
m_bHSV = false;
187+
m_bHSV_BLEND = false;
109188
m_bPARALLAXCORRECT = false;
189+
m_bBLENDTINTBYMRAOALPHA = false;
190+
m_bPARALLAXDITHER = false;
191+
m_bEMISSIVEFRESNEL = false;
110192
#endif // _DEBUG
111193
}
112194

113195
int GetIndex() const
114196
{
115-
Assert( m_bFLASHLIGHT && m_bFLASHLIGHTDEPTHFILTERMODE && m_bLIGHTMAPPED && m_bEMISSIVE && m_bSPECULAR && m_bPARALLAXCORRECT );
197+
Assert( m_bFLASHLIGHT && m_bFLASHLIGHTDEPTHFILTERMODE && m_bLIGHTMAPPED && m_bEMISSIVE && m_bPARALLAXOCCLUSION && m_bWVT && m_bHSV && m_bHSV_BLEND && m_bPARALLAXCORRECT && m_bBLENDTINTBYMRAOALPHA && m_bPARALLAXDITHER && m_bEMISSIVEFRESNEL );
116198
AssertMsg( !( ( m_nFLASHLIGHT == 0 ) && ( m_nFLASHLIGHTDEPTHFILTERMODE != 0 ) ), "Invalid combo combination ( ( FLASHLIGHT == 0 ) && ( FLASHLIGHTDEPTHFILTERMODE != 0 ) )" );
117-
AssertMsg( !( ( m_nLIGHTMAPPED == 0 ) && ( m_nPARALLAXCORRECT != 0 ) ), "Invalid combo combination ( ( LIGHTMAPPED == 0 ) && ( PARALLAXCORRECT != 0 ) )" );
118-
return ( 80 * m_nFLASHLIGHT ) + ( 160 * m_nFLASHLIGHTDEPTHFILTERMODE ) + ( 480 * m_nLIGHTMAPPED ) + ( 960 * m_nEMISSIVE ) + ( 1920 * m_nSPECULAR ) + ( 3840 * m_nPARALLAXCORRECT ) + 0;
199+
AssertMsg( !( !m_nHSV && m_nHSV_BLEND ), "Invalid combo combination ( !HSV && HSV_BLEND )" );
200+
return ( 40 * m_nFLASHLIGHT ) + ( 80 * m_nFLASHLIGHTDEPTHFILTERMODE ) + ( 240 * m_nLIGHTMAPPED ) + ( 480 * m_nEMISSIVE ) + ( 960 * m_nPARALLAXOCCLUSION ) + ( 960 * m_nWVT ) + ( 1920 * m_nHSV ) + ( 3840 * m_nHSV_BLEND ) + ( 7680 * m_nPARALLAXCORRECT ) + ( 15360 * m_nBLENDTINTBYMRAOALPHA ) + ( 30720 * m_nPARALLAXDITHER ) + ( 30720 * m_nEMISSIVEFRESNEL ) + 0;
119201
}
120202
};
121203

122-
#define shaderStaticTest_pbr_ps20b psh_forgot_to_set_static_FLASHLIGHT + psh_forgot_to_set_static_FLASHLIGHTDEPTHFILTERMODE + psh_forgot_to_set_static_LIGHTMAPPED + psh_forgot_to_set_static_EMISSIVE + psh_forgot_to_set_static_SPECULAR + psh_forgot_to_set_static_PARALLAXCORRECT
204+
#define shaderStaticTest_pbr_ps20b psh_forgot_to_set_static_FLASHLIGHT + psh_forgot_to_set_static_FLASHLIGHTDEPTHFILTERMODE + psh_forgot_to_set_static_LIGHTMAPPED + psh_forgot_to_set_static_EMISSIVE + psh_forgot_to_set_static_PARALLAXOCCLUSION + psh_forgot_to_set_static_WVT + psh_forgot_to_set_static_HSV + psh_forgot_to_set_static_HSV_BLEND + psh_forgot_to_set_static_PARALLAXCORRECT + psh_forgot_to_set_static_BLENDTINTBYMRAOALPHA + psh_forgot_to_set_static_PARALLAXDITHER + psh_forgot_to_set_static_EMISSIVEFRESNEL
123205

124206

125207
class pbr_ps20b_Dynamic_Index
126208
{
127-
unsigned int m_nWRITEWATERFOGTODESTALPHA : 2;
128-
unsigned int m_nPIXELFOGTYPE : 2;
129209
unsigned int m_nNUM_LIGHTS : 3;
130210
unsigned int m_nWRITE_DEPTH_TO_DESTALPHA : 2;
131211
unsigned int m_nFLASHLIGHTSHADOWS : 2;
212+
unsigned int m_nPIXELFOGTYPE : 2;
132213
#ifdef _DEBUG
133-
bool m_bWRITEWATERFOGTODESTALPHA : 1;
134-
bool m_bPIXELFOGTYPE : 1;
135214
bool m_bNUM_LIGHTS : 1;
136215
bool m_bWRITE_DEPTH_TO_DESTALPHA : 1;
137216
bool m_bFLASHLIGHTSHADOWS : 1;
138217
#endif // _DEBUG
139218
public:
140-
void SetWRITEWATERFOGTODESTALPHA( int i )
141-
{
142-
Assert( i >= 0 && i <= 1 );
143-
m_nWRITEWATERFOGTODESTALPHA = i;
144-
#ifdef _DEBUG
145-
m_bWRITEWATERFOGTODESTALPHA = true;
146-
#endif // _DEBUG
147-
}
148-
149-
void SetPIXELFOGTYPE( int i )
150-
{
151-
Assert( i >= 0 && i <= 1 );
152-
m_nPIXELFOGTYPE = i;
153-
#ifdef _DEBUG
154-
m_bPIXELFOGTYPE = true;
155-
#endif // _DEBUG
156-
}
157-
158219
void SetNUM_LIGHTS( int i )
159220
{
160221
Assert( i >= 0 && i <= 4 );
@@ -182,16 +243,19 @@ public:
182243
#endif // _DEBUG
183244
}
184245

246+
void SetPIXELFOGTYPE( int i )
247+
{
248+
Assert( i >= 0 && i <= 1 );
249+
m_nPIXELFOGTYPE = i;
250+
}
251+
185252
pbr_ps20b_Dynamic_Index( IShaderDynamicAPI* pShaderAPI )
186253
{
187-
m_nWRITEWATERFOGTODESTALPHA = 0;
188-
m_nPIXELFOGTYPE = 0;
189254
m_nNUM_LIGHTS = 0;
190255
m_nWRITE_DEPTH_TO_DESTALPHA = 0;
191256
m_nFLASHLIGHTSHADOWS = 0;
257+
m_nPIXELFOGTYPE = ( pShaderAPI->GetSceneFogMode() == MATERIAL_FOG_LINEAR_BELOW_FOG_Z ) ;
192258
#ifdef _DEBUG
193-
m_bWRITEWATERFOGTODESTALPHA = false;
194-
m_bPIXELFOGTYPE = false;
195259
m_bNUM_LIGHTS = false;
196260
m_bWRITE_DEPTH_TO_DESTALPHA = false;
197261
m_bFLASHLIGHTSHADOWS = false;
@@ -200,14 +264,10 @@ public:
200264

201265
int GetIndex() const
202266
{
203-
Assert( m_bWRITEWATERFOGTODESTALPHA && m_bPIXELFOGTYPE && m_bNUM_LIGHTS && m_bWRITE_DEPTH_TO_DESTALPHA && m_bFLASHLIGHTSHADOWS );
204-
AssertMsg( !( ( m_nPIXELFOGTYPE == 0 ) && ( m_nWRITEWATERFOGTODESTALPHA != 0 ) ), "Invalid combo combination ( ( PIXELFOGTYPE == 0 ) && ( WRITEWATERFOGTODESTALPHA != 0 ) )" );
205-
AssertMsg( !( 1 && ( 1 && ( ( m_nPIXELFOGTYPE != 1 ) && m_nWRITEWATERFOGTODESTALPHA ) ) ), "Invalid combo combination ( 1 && ( 1 && ( ( PIXELFOGTYPE != 1 ) && WRITEWATERFOGTODESTALPHA ) ) )" );
206-
AssertMsg( !( 1 && ( 1 && ( ( m_nPIXELFOGTYPE != 1 ) && m_nWRITEWATERFOGTODESTALPHA ) ) ), "Invalid combo combination ( 1 && ( 1 && ( ( PIXELFOGTYPE != 1 ) && WRITEWATERFOGTODESTALPHA ) ) )" );
207-
AssertMsg( !( 1 && ( 1 && ( ( m_nPIXELFOGTYPE != 1 ) && m_nWRITEWATERFOGTODESTALPHA ) ) ), "Invalid combo combination ( 1 && ( 1 && ( ( PIXELFOGTYPE != 1 ) && WRITEWATERFOGTODESTALPHA ) ) )" );
208-
return ( 1 * m_nWRITEWATERFOGTODESTALPHA ) + ( 2 * m_nPIXELFOGTYPE ) + ( 4 * m_nNUM_LIGHTS ) + ( 20 * m_nWRITE_DEPTH_TO_DESTALPHA ) + ( 40 * m_nFLASHLIGHTSHADOWS ) + 0;
267+
Assert( m_bNUM_LIGHTS && m_bWRITE_DEPTH_TO_DESTALPHA && m_bFLASHLIGHTSHADOWS );
268+
return ( 1 * m_nNUM_LIGHTS ) + ( 5 * m_nWRITE_DEPTH_TO_DESTALPHA ) + ( 10 * m_nFLASHLIGHTSHADOWS ) + ( 20 * m_nPIXELFOGTYPE ) + 0;
209269
}
210270
};
211271

212-
#define shaderDynamicTest_pbr_ps20b psh_forgot_to_set_dynamic_WRITEWATERFOGTODESTALPHA + psh_forgot_to_set_dynamic_PIXELFOGTYPE + psh_forgot_to_set_dynamic_NUM_LIGHTS + psh_forgot_to_set_dynamic_WRITE_DEPTH_TO_DESTALPHA + psh_forgot_to_set_dynamic_FLASHLIGHTSHADOWS
272+
#define shaderDynamicTest_pbr_ps20b psh_forgot_to_set_dynamic_NUM_LIGHTS + psh_forgot_to_set_dynamic_WRITE_DEPTH_TO_DESTALPHA + psh_forgot_to_set_dynamic_FLASHLIGHTSHADOWS
213273

0 commit comments

Comments
 (0)