diff --git a/WickedEngine/Renderable3DComponent.cpp b/WickedEngine/Renderable3DComponent.cpp index e2009851f..f9a291fcf 100644 --- a/WickedEngine/Renderable3DComponent.cpp +++ b/WickedEngine/Renderable3DComponent.cpp @@ -284,7 +284,7 @@ void Renderable3DComponent::RenderSecondaryScene(wiRenderTarget& mainRT, wiRende wiRenderer::DrawWaterRipples(threadID); } - //wiRenderer::UnbindTextures(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); + wiRenderer::graphicsDevice->UnbindTextures(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); rtTransparent.Activate(threadID, mainRT.depth); { wiRenderer::DrawWorldTransparent(wiRenderer::getCamera(), shadedSceneRT.GetTexture(), rtReflection.GetTexture() , rtWaterRipple.GetTexture(), threadID); @@ -352,7 +352,7 @@ void Renderable3DComponent::RenderLightShafts(wiRenderTarget& mainRT, GRAPHICSTH wiImageEffects fx((float)wiRenderer::GetScreenWidth(), (float)wiRenderer::GetScreenHeight()); - //wiRenderer::UnbindTextures(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); + wiRenderer::graphicsDevice->UnbindTextures(TEXSLOT_ONDEMAND0, TEXSLOT_ONDEMAND_COUNT, threadID); rtSun[0].Activate(threadID, mainRT.depth); { wiRenderer::DrawSun(threadID); } diff --git a/WickedEngine/wiDepthTarget.cpp b/WickedEngine/wiDepthTarget.cpp index 04f696c75..68c4f99e6 100644 --- a/WickedEngine/wiDepthTarget.cpp +++ b/WickedEngine/wiDepthTarget.cpp @@ -8,20 +8,22 @@ wiDepthTarget::wiDepthTarget() //depthTarget = NULL; //shaderResource = NULL; texture = nullptr; + textureCube = nullptr; isCube = false; } wiDepthTarget::~wiDepthTarget() { - //if(texture2D) texture2D->Release(); texture2D = NULL; - //if(depthTarget) depthTarget->Release(); depthTarget = NULL; - //if(shaderResource) shaderResource->Release(); shaderResource = NULL; SAFE_DELETE(texture); + SAFE_DELETE(textureCube); } void wiDepthTarget::Initialize(int width, int height, UINT MSAAC, UINT MSAAQ) { + SAFE_DELETE(texture); + SAFE_DELETE(textureCube); + isCube = false; Texture2DDesc depthBufferDesc; @@ -69,6 +71,9 @@ void wiDepthTarget::Initialize(int width, int height, UINT MSAAC, UINT MSAAQ) } void wiDepthTarget::InitializeCube(int size) { + SAFE_DELETE(texture); + SAFE_DELETE(textureCube); + isCube = true; Texture2DDesc depthBufferDesc; @@ -120,7 +125,7 @@ void wiDepthTarget::InitializeCube(int size) void wiDepthTarget::Clear(GRAPHICSTHREAD threadID) { - wiRenderer::graphicsDevice->ClearDepthStencil( texture, CLEAR_DEPTH | CLEAR_STENCIL, 1.0f, 0); + wiRenderer::graphicsDevice->ClearDepthStencil(GetTexture(), CLEAR_DEPTH | CLEAR_STENCIL, 1.0f, 0); } void wiDepthTarget::CopyFrom(const wiDepthTarget& from, GRAPHICSTHREAD threadID) { diff --git a/WickedEngine/wiDepthTarget.h b/WickedEngine/wiDepthTarget.h index fc4d8be08..294ec3c76 100644 --- a/WickedEngine/wiDepthTarget.h +++ b/WickedEngine/wiDepthTarget.h @@ -25,5 +25,6 @@ public: void CopyFrom(const wiDepthTarget&, GRAPHICSTHREAD threadID); Texture2D* GetTexture() const { return(isCube ? textureCube : texture); } + Texture2DDesc GetDesc() const { return GetTexture()->desc; } }; diff --git a/WickedEngine/wiGraphicsAPI_DX11.cpp b/WickedEngine/wiGraphicsAPI_DX11.cpp index 1714584f2..98d6cdc86 100644 --- a/WickedEngine/wiGraphicsAPI_DX11.cpp +++ b/WickedEngine/wiGraphicsAPI_DX11.cpp @@ -278,15 +278,9 @@ HRESULT GraphicsDevice_DX11::CreateTexture2D(const Texture2DDesc* pDesc, const S if (FAILED(hr)) return hr; - hr = CreateRenderTargetView(*ppTexture2D); - if (FAILED(hr)) - return hr; - hr = CreateShaderResourceView(*ppTexture2D); - if (FAILED(hr)) - return hr; - hr = CreateDepthStencilView(*ppTexture2D); - if (FAILED(hr)) - return hr; + CreateRenderTargetView(*ppTexture2D); + CreateShaderResourceView(*ppTexture2D); + CreateDepthStencilView(*ppTexture2D); return hr; } @@ -315,15 +309,9 @@ HRESULT GraphicsDevice_DX11::CreateTextureCube(const Texture2DDesc* pDesc, const if (FAILED(hr)) return hr; - hr = CreateRenderTargetView(*ppTextureCube); - if (FAILED(hr)) - return hr; - hr = CreateShaderResourceView(*ppTextureCube); - if (FAILED(hr)) - return hr; - hr = CreateDepthStencilView(*ppTextureCube); - if (FAILED(hr)) - return hr; + CreateRenderTargetView(*ppTextureCube); + CreateShaderResourceView(*ppTextureCube); + CreateDepthStencilView(*ppTextureCube); return hr; } @@ -336,6 +324,10 @@ HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture2D* pTexture) if (pTexture->desc.MiscFlags & RESOURCE_MISC_TEXTURECUBE) { shaderResourceViewDesc.Format = pTexture->desc.Format; + if (pTexture->desc.BindFlags & D3D11_BIND_DEPTH_STENCIL) + { + shaderResourceViewDesc.Format = DXGI_FORMAT_R32_FLOAT; + } shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; shaderResourceViewDesc.TextureCube.MostDetailedMip = 0; //from most detailed... shaderResourceViewDesc.TextureCube.MipLevels = -1; //...to least detailed @@ -343,6 +335,10 @@ HRESULT GraphicsDevice_DX11::CreateShaderResourceView(Texture2D* pTexture) else { shaderResourceViewDesc.Format = pTexture->desc.Format; + if (pTexture->desc.BindFlags & D3D11_BIND_DEPTH_STENCIL) + { + shaderResourceViewDesc.Format = DXGI_FORMAT_R24_UNORM_X8_TYPELESS; + } shaderResourceViewDesc.ViewDimension = (pTexture->desc.SampleDesc.Quality == 0 ? D3D11_SRV_DIMENSION_TEXTURE2D : D3D11_SRV_DIMENSION_TEXTURE2DMS); shaderResourceViewDesc.Texture2D.MostDetailedMip = 0; //from most detailed... shaderResourceViewDesc.Texture2D.MipLevels = -1; //...to least detailed diff --git a/WickedEngine/wiRenderTarget.cpp b/WickedEngine/wiRenderTarget.cpp index a088cc379..96d1fd906 100644 --- a/WickedEngine/wiRenderTarget.cpp +++ b/WickedEngine/wiRenderTarget.cpp @@ -3,38 +3,28 @@ #include "wiDepthTarget.h" -void wiRenderTarget::clear(){ - //textureDesc = { 0 }; - numViews = 0; - viewPort = ViewPort(); - depth = nullptr; - //retargetted = false; - isCube = false; -} - wiRenderTarget::wiRenderTarget() { - clear(); + numViews = 0; + depth = nullptr; + isCube = false; } wiRenderTarget::wiRenderTarget(UINT width, UINT height, int numViews, bool hasDepth, UINT MSAAC, UINT MSAAQ , DXGI_FORMAT format, UINT mipMapLevelCount) { - clear(); + numViews = 0; + depth = nullptr; + isCube = false; Initialize(width, height, numViews, hasDepth, MSAAC, MSAAQ, format, mipMapLevelCount); } wiRenderTarget::~wiRenderTarget() { - //for(int i=0;iRelease(); texture2D[i] = NULL; - // if(renderTarget[i]) renderTarget[i]->Release(); renderTarget[i] = NULL; - // if(SAVEDshaderResource[i]) SAVEDshaderResource[i]->Release(); SAVEDshaderResource[i]=NULL; - // if(shaderResource[i] && !retargetted) shaderResource[i]->Release(); shaderResource[i] = NULL; - //} - //texture2D.clear(); - //renderTarget.clear(); - //shaderResource.clear(); + clear(); +} + +void wiRenderTarget::clear() { for (unsigned int i = 0; i < renderTargets.size(); ++i) { SAFE_DELETE(renderTargets[i]); @@ -49,6 +39,8 @@ wiRenderTarget::~wiRenderTarget() void wiRenderTarget::Initialize(UINT width, UINT height, int numViews, bool hasDepth, UINT MSAAC, UINT MSAAQ , DXGI_FORMAT format, UINT mipMapLevelCount) { + clear(); + isCube = false; this->numViews = numViews; @@ -113,6 +105,8 @@ void wiRenderTarget::Initialize(UINT width, UINT height, int numViews, bool hasD } void wiRenderTarget::InitializeCube(UINT size, int numViews, bool hasDepth, DXGI_FORMAT format, UINT mipMapLevelCount) { + clear(); + isCube = true; this->numViews = numViews; diff --git a/WickedEngine/wiRenderTarget.h b/WickedEngine/wiRenderTarget.h index ffcb8e568..c66419e5d 100644 --- a/WickedEngine/wiRenderTarget.h +++ b/WickedEngine/wiRenderTarget.h @@ -40,7 +40,8 @@ public: //void Restore(); Texture2D* GetTexture(int viewID = 0) const{ return (isCube ? renderTargets_Cube[viewID] : renderTargets[viewID]); } - Texture2DDesc GetDesc(int viewID = 0) const{ return GetTexture(viewID)->desc; } + Texture2DDesc GetDesc(int viewID = 0) const { assert(viewID < numViews); return GetTexture(viewID)->desc; } UINT GetMipCount(); + bool IsInitialized() { return (numViews > 0 || depth != nullptr); } }; diff --git a/WickedEngine/wiRenderer.cpp b/WickedEngine/wiRenderer.cpp index 3c23caa97..853d6a1d2 100644 --- a/WickedEngine/wiRenderer.cpp +++ b/WickedEngine/wiRenderer.cpp @@ -1988,8 +1988,7 @@ void wiRenderer::DrawForShadowMap(GRAPHICSTHREAD threadID) CulledList culledObjects; CulledCollection culledRenderer; - auto texDesc = l->shadowMaps_dirLight[index].GetDesc(); - if (texDesc.Height != SHADOWMAPRES) + if (!l->shadowMaps_dirLight[index].IsInitialized() || l->shadowMaps_dirLight[index].depth->GetDesc().Height != SHADOWMAPRES) { // Create the shadow map l->shadowMaps_dirLight[index].Initialize(SHADOWMAPRES, SHADOWMAPRES, 0, true);