|
@@ -1297,8 +1297,10 @@ bool Renderer::CreateShadowMaps()
|
|
|
|
|
|
|
|
if (!drawShadows_)
|
|
if (!drawShadows_)
|
|
|
{
|
|
{
|
|
|
|
|
+ shadowDepthStencil_.Reset();
|
|
|
for (unsigned i = 0; i < NUM_SHADOWMAP_RESOLUTIONS; ++i)
|
|
for (unsigned i = 0; i < NUM_SHADOWMAP_RESOLUTIONS; ++i)
|
|
|
{
|
|
{
|
|
|
|
|
+ colorShadowMaps_[i].Reset();
|
|
|
for (unsigned j = 0; j < shadowMaps_[i].Size(); ++j)
|
|
for (unsigned j = 0; j < shadowMaps_[i].Size(); ++j)
|
|
|
shadowMaps_[i][j].Reset();
|
|
shadowMaps_[i][j].Reset();
|
|
|
}
|
|
}
|
|
@@ -1325,6 +1327,14 @@ bool Renderer::CreateShadowMaps()
|
|
|
// Create shadow maps and dummy color rendertargets
|
|
// Create shadow maps and dummy color rendertargets
|
|
|
unsigned size = shadowMapSize_;
|
|
unsigned size = shadowMapSize_;
|
|
|
bool fallback = graphics_->GetFallback();
|
|
bool fallback = graphics_->GetFallback();
|
|
|
|
|
+ // Create one depth stencil buffer in fallback mode to be shared by all shadow maps
|
|
|
|
|
+ if (fallback)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!shadowDepthStencil_)
|
|
|
|
|
+ shadowDepthStencil_ = new Texture2D(context_);
|
|
|
|
|
+ if (!shadowDepthStencil_->SetSize(size, size, D3DFMT_D16, TEXTURE_DEPTHSTENCIL))
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
for (unsigned i = 0; i < NUM_SHADOWMAP_RESOLUTIONS; ++i)
|
|
for (unsigned i = 0; i < NUM_SHADOWMAP_RESOLUTIONS; ++i)
|
|
|
{
|
|
{
|
|
|
// Dummy color rendertargets are not required in fallback mode, as the shadows are rendered into a color texture
|
|
// Dummy color rendertargets are not required in fallback mode, as the shadows are rendered into a color texture
|
|
@@ -1335,17 +1345,6 @@ bool Renderer::CreateShadowMaps()
|
|
|
if (!colorShadowMaps_[i]->SetSize(size, size, dummyColorFormat, TEXTURE_RENDERTARGET))
|
|
if (!colorShadowMaps_[i]->SetSize(size, size, dummyColorFormat, TEXTURE_RENDERTARGET))
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
- else
|
|
|
|
|
- {
|
|
|
|
|
- // In fallback mode, create one depth stencil that is large enough for the largest shadow map
|
|
|
|
|
- if (!i)
|
|
|
|
|
- {
|
|
|
|
|
- if (!colorShadowMaps_[i])
|
|
|
|
|
- colorShadowMaps_[i] = new Texture2D(context_);
|
|
|
|
|
- if (!colorShadowMaps_[i]->SetSize(size, size, D3DFMT_D16, TEXTURE_DEPTHSTENCIL))
|
|
|
|
|
- return false;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
for (unsigned j = 0; j < shadowMaps_[i].Size(); ++j)
|
|
for (unsigned j = 0; j < shadowMaps_[i].Size(); ++j)
|
|
|
{
|
|
{
|
|
|
if (!shadowMaps_[i][j])
|
|
if (!shadowMaps_[i][j])
|
|
@@ -1359,10 +1358,8 @@ bool Renderer::CreateShadowMaps()
|
|
|
shadowMaps_[i][j]->GetRenderSurface()->SetLinkedRenderTarget(colorShadowMaps_[i]->GetRenderSurface());
|
|
shadowMaps_[i][j]->GetRenderSurface()->SetLinkedRenderTarget(colorShadowMaps_[i]->GetRenderSurface());
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
- {
|
|
|
|
|
- shadowMaps_[i][j]->SetFilterMode(FILTER_NEAREST);
|
|
|
|
|
- shadowMaps_[i][j]->GetRenderSurface()->SetLinkedDepthBuffer(colorShadowMaps_[0]->GetRenderSurface());
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // In fallback mode, link the shared depth stencil buffer to all shadow maps
|
|
|
|
|
+ shadowMaps_[i][j]->GetRenderSurface()->SetLinkedDepthBuffer(shadowDepthStencil_->GetRenderSurface());
|
|
|
}
|
|
}
|
|
|
size >>= 1;
|
|
size >>= 1;
|
|
|
}
|
|
}
|