Code: Select all
diff --git a/OgreMain/src/OgreHlmsDatablock.cpp b/OgreMain/src/OgreHlmsDatablock.cpp
index ae5e73810..6e41076dd 100644
--- a/OgreMain/src/OgreHlmsDatablock.cpp
+++ b/OgreMain/src/OgreHlmsDatablock.cpp
@@ -115,7 +115,7 @@ namespace Ogre
mAlphaTestCmp( CMPF_ALWAYS_PASS ),
mAlphaTestShadowCasterOnly( false ),
mAlphaTestThreshold( 0.5f ),
- mShadowConstantBias( 0.01f )
+ mShadowConstantBias( 0.05f )
{
mMacroblockHash[0] = mMacroblockHash[1] = 0;
mMacroblock[0] = mMacroblock[1] = 0;
diff --git a/OgreMain/src/OgreHlmsManager.cpp b/OgreMain/src/OgreHlmsManager.cpp
index 4292409f0..99c3787ff 100644
--- a/OgreMain/src/OgreHlmsManager.cpp
+++ b/OgreMain/src/OgreHlmsManager.cpp
@@ -44,7 +44,7 @@ namespace Ogre
HlmsManager::HlmsManager() :
mComputeHlms( 0 ),
mRenderSystem( 0 ),
- mShadowMappingUseBackFaces( true ),
+ mShadowMappingUseBackFaces( false ),
mDefaultHlmsType( HLMS_PBS )
#if !OGRE_NO_JSON
, mJsonListener( 0 )
diff --git a/Samples/2.0/ApiUsage/ShadowMapDebugging/ShadowMapDebuggingGameState.cpp b/Samples/2.0/ApiUsage/ShadowMapDebugging/ShadowMapDebuggingGameState.cpp
index a2415e108..057d414b9 100644
--- a/Samples/2.0/ApiUsage/ShadowMapDebugging/ShadowMapDebuggingGameState.cpp
+++ b/Samples/2.0/ApiUsage/ShadowMapDebugging/ShadowMapDebuggingGameState.cpp
@@ -97,7 +97,7 @@ namespace Demo
createChildSceneNode( Ogre::SCENE_DYNAMIC );
mSceneNode[idx]->setPosition( (i - 1.5f) * armsLength,
- 2.0f,
+ 0.0f,
(j - 1.5f) * armsLength );
mSceneNode[idx]->setScale( 0.65f, 0.65f, 0.65f );
@@ -123,7 +123,7 @@ namespace Demo
lightNode->attachObject( light );
light->setDiffuseColour( 0.8f, 0.4f, 0.2f ); //Warm
light->setSpecularColour( 0.8f, 0.4f, 0.2f );
- light->setPowerScale( Ogre::Math::PI );
+ light->setPowerScale( Ogre::Math::PI * 0 );
light->setType( Ogre::Light::LT_SPOTLIGHT );
lightNode->setPosition( -10.0f, 10.0f, 10.0f );
light->setDirection( Ogre::Vector3( 1, -1, -1 ).normalisedCopy() );
@@ -136,7 +136,7 @@ namespace Demo
lightNode->attachObject( light );
light->setDiffuseColour( 0.2f, 0.4f, 0.8f ); //Cold
light->setSpecularColour( 0.2f, 0.4f, 0.8f );
- light->setPowerScale( Ogre::Math::PI );
+ light->setPowerScale( Ogre::Math::PI * 0 );
light->setType( Ogre::Light::LT_SPOTLIGHT );
lightNode->setPosition( 10.0f, 10.0f, -10.0f );
light->setDirection( Ogre::Vector3( -1, -1, 1 ).normalisedCopy() );
@@ -175,6 +175,14 @@ namespace Demo
gaussianDeviationFactor, K );
#endif
+ {
+ Ogre::Root *root = mGraphicsSystem->getRoot();
+ Ogre::Hlms *hlms = root->getHlmsManager()->getHlms( Ogre::HLMS_PBS );
+ assert( dynamic_cast<Ogre::HlmsPbs*>( hlms ) );
+ Ogre::HlmsPbs *pbs = static_cast<Ogre::HlmsPbs*>( hlms );
+ pbs->getHlmsManager()->setShadowMappingUseBackFaces( false );
+ }
+
TutorialGameState::createScene01();
}
//-----------------------------------------------------------------------------------
@@ -450,10 +458,10 @@ namespace Demo
}
#endif
- if( nextFilter == Ogre::HlmsPbs::ExponentialShadowMaps )
+ //if( nextFilter == Ogre::HlmsPbs::ExponentialShadowMaps )
pbs->getHlmsManager()->setShadowMappingUseBackFaces( false );
- else
- pbs->getHlmsManager()->setShadowMappingUseBackFaces( true );
+// else
+// pbs->getHlmsManager()->setShadowMappingUseBackFaces( true );
pbs->setShadowSettings( nextFilter );
diff --git a/Samples/Media/Hlms/Common/Any/ShadowCaster_piece_vs.any b/Samples/Media/Hlms/Common/Any/ShadowCaster_piece_vs.any
index d4e0a668a..7a66574f5 100644
--- a/Samples/Media/Hlms/Common/Any/ShadowCaster_piece_vs.any
+++ b/Samples/Media/Hlms/Common/Any/ShadowCaster_piece_vs.any
@@ -3,14 +3,22 @@
@property( hlms_shadowcaster )
@piece( DoShadowCasterVS )
- float shadowConstantBias = uintBitsToFloat( worldMaterialIdx[inVs_drawId].y );
+ @property( hlms_no_reverse_depth )
+ float shadowConstantBias = uintBitsToFloat( worldMaterialIdx[inVs_drawId].y );
+ @else
+ //float shadowConstantBias = -uintBitsToFloat( worldMaterialIdx[inVs_drawId].y );
+ //float shadowConstantBias = -0.5 / passBuf.depthRange.y * 0.1f;
+ //float shadowConstantBias = -4.5 / passBuf.depthRange.y * 0.1f;
+ float shadowConstantBias = -0.015 / passBuf.depthRange.y /passBuf.depthRange.y * 0.1f;
+ //float shadowConstantBias = 0.65 / passBuf.depthRange.y * 0.1f;
+ @end
@property( !hlms_shadow_uses_depth_texture && !hlms_shadowcaster_point && !exponential_shadow_maps )
//Linear depth
@property( hlms_shadowcaster_directional || !hlms_no_reverse_depth )
- outVs.depth = outVs_Position.z + shadowConstantBias * passBuf.depthRange.y * passBuf.depthRange.y;
+ outVs.depth = outVs_Position.z + shadowConstantBias * passBuf.depthRange.y * passBuf.depthRange.y;
@else
- outVs.depth = (outVs_Position.z + shadowConstantBias * passBuf.depthRange.y) * passBuf.depthRange.y;
+ outVs.depth = (outVs_Position.z + shadowConstantBias * passBuf.depthRange.y) * passBuf.depthRange.y;
@end
@property( hlms_no_reverse_depth && (syntax == glsl || syntax == glsles) )outVs.depth = (outVs.depth * 0.5) + 0.5;@end
@end
@@ -27,7 +35,7 @@
//however we can use a cheap approximation ("pseudo linear depth")
//see http://www.yosoygames.com.ar/wp/2014/01/linear-depth-buffer-my-ass/
@property( hlms_shadowcaster_directional || !hlms_no_reverse_depth )
- outVs_Position.z = outVs_Position.z + shadowConstantBias * passBuf.depthRange.y * passBuf.depthRange.y;
+ outVs_Position.z = outVs_Position.z + shadowConstantBias * passBuf.depthRange.y * passBuf.depthRange.y;
@else
outVs_Position.z = (outVs_Position.z + shadowConstantBias * passBuf.depthRange.y) * passBuf.depthRange.y * outVs_Position.w;
@end
diff --git a/Samples/Media/Hlms/Pbs/Any/ShadowMapping_piece_ps.any b/Samples/Media/Hlms/Pbs/Any/ShadowMapping_piece_ps.any
index 58b8b7e01..8b843eeb5 100644
--- a/Samples/Media/Hlms/Pbs/Any/ShadowMapping_piece_ps.any
+++ b/Samples/Media/Hlms/Pbs/Any/ShadowMapping_piece_ps.any
@@ -1,4 +1,4 @@
-
+
//#include "SyntaxHighlightingMisc.h"
@property( hlms_num_shadow_map_lights )
@@ -134,10 +134,10 @@
@foreach( 4, m )
@property( @m == 0 )
INLINE float getShadow( @insertpiece( TEXTURE2DSHADOW ) shadowMap, @insertpiece( SamplerShadow )
- float4 psPosLN, float4 invShadowMapSize )
+ float4 psPosLN, float4 invShadowMapSize, float2 invDepthRange, PixelData pixelData, float f )
@end @property( @m == 1 )
INLINE float getShadow( @insertpiece( TEXTURE2DSHADOW ) shadowMap, @insertpiece( SamplerShadow )
- float4 psPosLN, float4 invShadowMapSize, float2 minUV, float2 maxUV )
+ float4 psPosLN, float4 invShadowMapSize, float2 invDepthRange, PixelData pixelData, float f, float2 minUV, float2 maxUV )
@end @property( @m == 2 )
INLINE float getShadowPoint( @insertpiece( TEXTURE2DSHADOW ) shadowMap, @insertpiece( SamplerShadow )
float3 posVS, float3 lightPos, float4 invShadowMapSize, float2 invDepthRange
@@ -150,6 +150,21 @@
@end
{
@property( @m < 2 )
+ float tmpNDotL = saturate( dot( passBuf.lights[0].position.xyz, pixelData.geomNormal.xyz ) );
+ @property( @m == 0 )
+ psPosLN.xy -= ((1.0f - tmpNDotL) * 3.5f * pixelData.geomNormal.xy * 0.000488281f * invDepthRange.y) * psPosLN.w;
+ @else
+ float regionSize = (maxUV.x - minUV.x) / invShadowMapSize.x;
+ regionSize = 1.0f / regionSize;
+ float dff = max( abs(OGRE_ddx( psPosLN.z )), abs(OGRE_ddy( psPosLN.z )) );
+ dff = 1.0f + pow( dff, 0.1 ) * 16.0;
+ //float dff = max( 1.0f - 4.0 * pow( max( abs(OGRE_ddx( psPosLN.z )), abs(OGRE_ddy( psPosLN.z )) ), 0.05 ), 0 );
+ //float dff = 1.0;
+ psPosLN.xyz -= ((1.0f - tmpNDotL) * (0.75f) * pixelData.geomNormal.xyz *
+ float3(regionSize,regionSize, -1.0f * invDepthRange.y / dff)) * psPosLN.w;
+// psPosLN.xyz -= ((1.0f - tmpNDotL) * 0.5f * pixelData.geomNormal.xyz * regionSize * (f+1)) * psPosLN.w;
+// psPosLN.z += (f) * psPosLN.w * 0.005f;
+ @end
//Spot and directional lights
@property( !exponential_shadow_maps && !hlms_no_reverse_depth )
float fDepth = psPosLN.z / psPosLN.w;
@@ -328,14 +343,18 @@
{
fShadow = getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL0,
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@counter(CurrentShadowMap)_uv_param );
@property( hlms_pssm_blend )
if( inPs.depth > passBuf.pssmBlendPoints@value(CurrentShadowMapBlend) )
{
fShadowBlend = getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL1,
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@value(CurrentShadowMap)_uv_param );
fShadow = lerp( fShadow, fShadowBlend,
(inPs.depth - passBuf.pssmBlendPoints@value(CurrentShadowMapBlend)) /
@@ -351,14 +370,18 @@
{
fShadow = getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL@n,
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@counter(CurrentShadowMap)_uv_param );
@property( hlms_pssm_blend && @n < hlms_pssm_splits_minus_one )
if( inPs.depth > passBuf.pssmBlendPoints@value(CurrentShadowMapBlend) )
{
fShadowBlend = getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL@value(CurrentShadowMap),
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@value(CurrentShadowMap)_uv_param );
fShadow = lerp( fShadow, fShadowBlend,
(inPs.depth - passBuf.pssmBlendPoints@value(CurrentShadowMapBlend)) /
@@ -387,7 +410,9 @@
@property( receive_shadows )
float fShadow = getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL0,
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@counter(CurrentShadowMap)_uv_param );
@end @property( !receive_shadows )
float fShadow = 1.0;
@@ -400,7 +425,9 @@
@piece( DarkenWithShadow )
* getShadow( hlms_shadowmap@value(CurrentShadowMap), @insertpiece( UseSamplerShadow )
inPs.posL@value(CurrentShadowMap),
- passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize
+ passBuf.shadowRcv[@value(CurrentShadowMap)].invShadowMapSize,
+ passBuf.shadowRcv[@value(CurrentShadowMap)].shadowDepthRange.xy,
+ pixelData, @value(CurrentShadowMap)
hlms_shadowmap@counter(CurrentShadowMap)_uv_param )
@end
It's the same as the one before, but also uses DDX & DDY to mitigate some of the artifacts