您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
152 行
10 KiB
152 行
10 KiB
// This file contains various helper declarations for declaring and sampling members of the ShadowContext struct.
|
|
|
|
// shadow lookup routines when dynamic array access is possible
|
|
#if SHADOW_SUPPORTS_DYNAMIC_INDEXING != 0
|
|
|
|
// Shader model >= 5.1
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_COMP( _Tex2DArraySlots , _SamplerCompSlots ) real4 SampleCompShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real slice ) { return SAMPLE_TEXTURE2D_ARRAY_SHADOW( ctxt.tex2DArray[texIdx], ctxt.compSamplers[sampIdx], tcs, slice ); }
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_SAMP( _Tex2DArraySlots , _SamplerSlots ) real4 SampleShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real2 tcs, real slice, real lod = 0.0 ) { return SAMPLE_TEXTURE2D_ARRAY_LOD( ctxt.tex2DArray[texIdx], ctxt.samplers[sampIdx], tcs, slice, lod ); }
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_LOAD( _Tex2DArraySlots ) real4 LoadShadow_T2DA( ShadowContext ctxt, uint texIdx, uint2 tcs, uint slice, uint lod = 0 ) { return LOAD_TEXTURE2D_ARRAY_LOD( ctxt.tex2DArray[texIdx], tcs, slice, lod ).x; }
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_TCA_COMP( _TexCubeArraySlots, _SamplerCompSlots ) real4 SampleCompShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real4 tcs, real cubeIdx ) { return SAMPLE_TEXTURECUBE_ARRAY_SHADOW( ctxt.texCubeArray[texIdx], ctxt.compSamplers[sampIdx], tcs, cubeIdx );}
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_TCA_SAMP( _TexCubeArraySlots, _SamplerSlots ) real4 SampleShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real cubeIdx, real lod = 0.0 ) { return SAMPLE_TEXTURECUBE_ARRAY_LOD( ctxt.texCubeArray[texIdx], ctxt.samplers[sampIdx], tcs, cubeIdx, lod ); }
|
|
|
|
#else // helper macros if dynamic indexing does not work
|
|
|
|
// Sampler and texture combinations are static. No shadowmap will ever be sampled with two different samplers.
|
|
// Once shadowmaps and samplers are fixed consider writing custom dispatchers directly accessing textures and samplers.
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_COMP( _Tex2DArraySlots, _SamplerCompSlots ) \
|
|
real4 SampleCompShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real slice ) \
|
|
{ \
|
|
real4 res = 1.0.xxxx; \
|
|
[unroll] for( uint i = 0; i < _Tex2DArraySlots; i++ ) \
|
|
{ \
|
|
[unroll] for( uint j = 0; j < _SamplerCompSlots; j++ ) \
|
|
{ \
|
|
[branch] if( i == texIdx && j == sampIdx ) \
|
|
{ \
|
|
res = SAMPLE_TEXTURE2D_ARRAY_SHADOW( ctxt.tex2DArray[i], ctxt.compSamplers[j], tcs, slice ); \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
return res; \
|
|
}
|
|
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_SAMP( _Tex2DArraySlots, _SamplerSlots ) \
|
|
real4 SampleShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real2 tcs, real slice, real lod = 0.0 ) \
|
|
{ \
|
|
real4 res = 1.0.xxxx; \
|
|
[unroll] for( uint i = 0; i < _Tex2DArraySlots; i++ ) \
|
|
{ \
|
|
[unroll] for( uint j = 0; j < _SamplerSlots; j++ ) \
|
|
{ \
|
|
[branch] if( i == texIdx && j == sampIdx ) \
|
|
{ \
|
|
res = SAMPLE_TEXTURE2D_ARRAY_LOD( ctxt.tex2DArray[i], ctxt.samplers[j], tcs, slice, lod ); \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
return res; \
|
|
}
|
|
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_T2DA_LOAD( _Tex2DArraySlots ) \
|
|
real LoadShadow_T2DA( ShadowContext ctxt, uint texIdx, uint2 tcs, uint slice, uint lod = 0 ) \
|
|
{ \
|
|
real res = 1.0; \
|
|
[unroll] for( uint i = 0; i < _Tex2DArraySlots; i++ ) \
|
|
{ \
|
|
[branch] if( i == texIdx ) \
|
|
{ \
|
|
res = LOAD_TEXTURE2D_ARRAY_LOD( ctxt.tex2DArray[i], tcs, slice, lod ).x; \
|
|
break; \
|
|
} \
|
|
} \
|
|
return res; \
|
|
}
|
|
|
|
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_TCA_COMP( _TexCubeArraySlots, _SamplerCompSlots ) \
|
|
real4 SampleCompShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real4 tcs, real cubeIdx ) \
|
|
{ \
|
|
real4 res = 1.0.xxxx; \
|
|
[unroll] for( uint i = 0; i < _TexCubeArraySlots; i++ ) \
|
|
{ \
|
|
[unroll] for( uint j = 0; j < _SamplerCompSlots; j++ ) \
|
|
{ \
|
|
[branch] if( i == texIdx && j == sampIdx ) \
|
|
{ \
|
|
res = SAMPLE_TEXTURECUBE_ARRAY_SHADOW( ctxt.texCubeArray[i], ctxt.compSamplers[j], tcs, cubeIdx ); \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
return res; \
|
|
}
|
|
|
|
# define SHADOW_DEFINE_SAMPLING_FUNC_TCA_SAMP( _TexCubeArraySlots, _SamplerSlots ) \
|
|
real4 SampleShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real cubeIdx, real lod = 0.0 ) \
|
|
{ \
|
|
real4 res = 1.0.xxxx; \
|
|
[unroll] for( uint i = 0; i < _TexCubeArraySlots; i++ ) \
|
|
{ \
|
|
[unroll] for( uint j = 0; j < _SamplerSlots; j++ ) \
|
|
{ \
|
|
[branch] if( i == texIdx && j == sampIdx ) \
|
|
{ \
|
|
res = SAMPLE_TEXTURECUBE_ARRAY_LOD( ctxt.texCubeArray[i], ctxt.samplers[j], tcs, cubeIdx, lod ); \
|
|
break; \
|
|
} \
|
|
} \
|
|
} \
|
|
return res; \
|
|
}
|
|
#endif // SHADOW_SUPPORTS_DYNAMIC_INDEXING != 0
|
|
|
|
// helper macro to suppress code generation if _cnt is 0
|
|
#define SHADOW_DECLARE_SAMPLING_FUNC_T2DA_COMP( _Tex2DArraySlots , _SamplerCompSlots ) real4 SampleCompShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real slice );
|
|
#define SHADOW_DECLARE_SAMPLING_FUNC_T2DA_SAMP( _Tex2DArraySlots , _SamplerSlots ) real4 SampleShadow_T2DA( ShadowContext ctxt, uint texIdx, uint sampIdx, real2 tcs, real slice, real lod = 0.0 );
|
|
#define SHADOW_DECLARE_SAMPLING_FUNC_T2DA_LOAD( _Tex2DArraySlots ) real4 LoadShadow_T2DA( ShadowContext ctxt, uint texIdx, uint2 tcs, uint slice, uint lod = 0 );
|
|
#define SHADOW_DECLARE_SAMPLING_FUNC_TCA_COMP( _TexCubeArraySlots, _SamplerCompSlots ) real4 SampleCompShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real4 tcs, real cubeIdx );
|
|
#define SHADOW_DECLARE_SAMPLING_FUNC_TCA_SAMP( _TexCubeArraySlots, _SamplerSlots ) real4 SampleShadow_TCA( ShadowContext ctxt, uint texIdx, uint sampIdx, real3 tcs, real cubeIdx, real lod = 0.0 );
|
|
|
|
#define SHADOW_CAT( _left, _right ) _left ## _right
|
|
|
|
#define SHADOW_CHECK_0( _macro )
|
|
#define SHADOW_CHECK_1( _macro ) _macro
|
|
#define SHADOW_CHECK_2( _macro ) _macro
|
|
#define SHADOW_CHECK_3( _macro ) _macro
|
|
#define SHADOW_CHECK_4( _macro ) _macro
|
|
#define SHADOW_CHECK_5( _macro ) _macro
|
|
#define SHADOW_CHECK_6( _macro ) _macro
|
|
#define SHADOW_CHECK_7( _macro ) _macro
|
|
#define SHADOW_CHECK_8( _macro ) _macro
|
|
#define SHADOW_CHECK_9( _macro ) _macro
|
|
#define SHADOW_CHECK( _cnt, _macro ) SHADOW_CAT( SHADOW_CHECK_ , _cnt ) ( _macro )
|
|
|
|
|
|
#define SHADOW_CHECK_ALT_0( _macro, _alt ) _alt
|
|
#define SHADOW_CHECK_ALT_1( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_2( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_3( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_4( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_5( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_6( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_7( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_8( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT_9( _macro, _alt ) _macro
|
|
#define SHADOW_CHECK_ALT( _cnt, _macro, _alt ) SHADOW_CAT( SHADOW_CHECK_ALT_ , _cnt ) ( _macro, _alt )
|
|
|
|
// helper macro to declare texture members for the shadow context.
|
|
#define SHADOWCONTEXT_DECLARE_TEXTURES( _Tex2DArraySlots, _TexCubeArraySlots, _SamplerCompSlots, _SamplerSlots ) \
|
|
SHADOW_CHECK( _Tex2DArraySlots , Texture2DArray tex2DArray[_Tex2DArraySlots]; ) \
|
|
SHADOW_CHECK( _TexCubeArraySlots, TextureCubeArray texCubeArray[_TexCubeArraySlots]; ) \
|
|
SHADOW_CHECK( _SamplerCompSlots , SamplerComparisonState compSamplers[_Tex2DArraySlots]; ) \
|
|
SHADOW_CHECK( _SamplerSlots , SamplerState samplers[_Tex2DArraySlots]; )
|
|
// helper macro to declare texture sampling functions for the shadow context.
|
|
#define SHADOW_DEFINE_SAMPLING_FUNCS( _Tex2DArraySlots, _TexCubeArraySlots, _SamplerCompSlots, _SamplerSlots ) \
|
|
SHADOW_CHECK( _Tex2DArraySlots , SHADOW_CHECK_ALT( _SamplerCompSlots, SHADOW_DEFINE_SAMPLING_FUNC_T2DA_COMP( _Tex2DArraySlots, _SamplerCompSlots ), SHADOW_DECLARE_SAMPLING_FUNC_T2DA_COMP( _Tex2DArraySlots, _SamplerCompSlots ) ) ) \
|
|
SHADOW_CHECK( _Tex2DArraySlots , SHADOW_CHECK_ALT( _SamplerSlots , SHADOW_DEFINE_SAMPLING_FUNC_T2DA_SAMP( _Tex2DArraySlots, _SamplerSlots ), SHADOW_DECLARE_SAMPLING_FUNC_T2DA_SAMP( _Tex2DArraySlots, _SamplerSlots ) ) ) \
|
|
SHADOW_CHECK_ALT( _Tex2DArraySlots , SHADOW_DEFINE_SAMPLING_FUNC_T2DA_LOAD( _Tex2DArraySlots ), SHADOW_DECLARE_SAMPLING_FUNC_T2DA_LOAD( _Tex2DArraySlots ) ) \
|
|
SHADOW_CHECK( _TexCubeArraySlots, SHADOW_CHECK_ALT( _SamplerCompSlots, SHADOW_DEFINE_SAMPLING_FUNC_TCA_COMP(_TexCubeArraySlots, _SamplerCompSlots ), SHADOW_DECLARE_SAMPLING_FUNC_TCA_COMP(_TexCubeArraySlots, _SamplerCompSlots ) ) ) \
|
|
SHADOW_CHECK( _TexCubeArraySlots, SHADOW_CHECK_ALT( _SamplerSlots , SHADOW_DEFINE_SAMPLING_FUNC_TCA_SAMP(_TexCubeArraySlots, _SamplerSlots ), SHADOW_DECLARE_SAMPLING_FUNC_TCA_SAMP(_TexCubeArraySlots, _SamplerSlots ) ) )
|