diff --git a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp index 0a5cf351d..dde635d20 100644 --- a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp +++ b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.cpp @@ -3,14 +3,14 @@ #include "Utils.h" namespace T5M::Renderer { using T5M::Renderer::Utils::throwIfFailed; - RenderTarget2D::RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format) { + RenderTarget2D::RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat) { D3D11_TEXTURE2D_DESC desc = {}; desc.Width = w; desc.Height = h; desc.MipLevels = 1; desc.ArraySize = 1; - desc.Format = format; + desc.Format = colorFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; @@ -46,7 +46,7 @@ namespace T5M::Renderer { depthTexDesc.ArraySize = 1; depthTexDesc.SampleDesc.Count = 1; depthTexDesc.SampleDesc.Quality = 0; - depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depthTexDesc.Format = depthFormat; depthTexDesc.Usage = D3D11_USAGE_DEFAULT; depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthTexDesc.CPUAccessFlags = 0; diff --git a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h index a540621eb..109285661 100644 --- a/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h +++ b/TR5Main/Renderer/RenderTarget2D/RenderTarget2D.h @@ -11,7 +11,7 @@ namespace T5M::Renderer { ComPtr DepthStencilTexture; ComPtr DepthShaderResourceView; RenderTarget2D() {}; - RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format); + RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); }; } diff --git a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp index 528514ad6..0ba6c0f7c 100644 --- a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp +++ b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.cpp @@ -2,14 +2,14 @@ #include "RenderTargetCube.h" #include "Utils.h" using T5M::Renderer::Utils::throwIfFailed; -T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format) : resolution(resolution) { +T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT colorFormat, DXGI_FORMAT depthFormat) : resolution(resolution) { D3D11_TEXTURE2D_DESC desc = {}; desc.Width = resolution; desc.Height = resolution; desc.MipLevels = 1; desc.ArraySize = 6; - desc.Format = format; + desc.Format = colorFormat; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.Usage = D3D11_USAGE_DEFAULT; @@ -17,7 +17,7 @@ T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int reso desc.CPUAccessFlags = 0; desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; - HRESULT res = device->CreateTexture2D(&desc, NULL, &Texture); + HRESULT res = device->CreateTexture2D(&desc, NULL, Texture.GetAddressOf()); throwIfFailed(res); D3D11_RENDER_TARGET_VIEW_DESC viewDesc = {}; @@ -49,7 +49,7 @@ T5M::Renderer::RenderTargetCube::RenderTargetCube(ID3D11Device* device, int reso depthTexDesc.ArraySize = 6; depthTexDesc.SampleDesc.Count = 1; depthTexDesc.SampleDesc.Quality = 0; - depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + depthTexDesc.Format = depthFormat; depthTexDesc.Usage = D3D11_USAGE_DEFAULT; depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; depthTexDesc.CPUAccessFlags = 0; diff --git a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h index dd0007a8a..e8fd7f3a1 100644 --- a/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h +++ b/TR5Main/Renderer/RenderTargetCube/RenderTargetCube.h @@ -36,6 +36,6 @@ namespace T5M::Renderer { int resolution; D3D11_VIEWPORT viewport; RenderTargetCube() : resolution(0), viewport({}) {}; - RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format); + RenderTargetCube(ID3D11Device* device, int resolution, DXGI_FORMAT format, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); }; } \ No newline at end of file diff --git a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp new file mode 100644 index 000000000..34efd5bc6 --- /dev/null +++ b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.cpp @@ -0,0 +1,76 @@ +#include "framework.h" +#include "RenderTargetCubeArray.h" +#include "Utils.h" +namespace T5M::Renderer { + RenderTargetCubeArray::RenderTargetCubeArray(ID3D11Device* device, size_t resolution, size_t numCubes, DXGI_FORMAT colorFormat,DXGI_FORMAT depthFormat) : numCubes(numCubes), resolution(resolution), viewport(CreateViewport(resolution)) { + D3D11_TEXTURE2D_DESC desc = {}; + desc.ArraySize = numCubes*6; + desc.Height = resolution; + desc.Width = resolution; + desc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.CPUAccessFlags = 0x0; + desc.SampleDesc.Count = 1; + desc.MipLevels = 1; + desc.Format = colorFormat; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; + desc.SampleDesc.Quality = 0; + HRESULT res = device->CreateTexture2D(&desc, nullptr, Texture.GetAddressOf()); + Utils::throwIfFailed(res); + + D3D11_RENDER_TARGET_VIEW_DESC viewDesc = {}; + viewDesc.Format = desc.Format; + viewDesc.Texture2DArray.ArraySize = 1; + viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DARRAY; + RenderTargetView.resize(numCubes); + for(int i = 0; i < numCubes - 1; i++) + for(int j = 0; j < 6; j++){ + viewDesc.Texture2DArray.FirstArraySlice = D3D11CalcSubresource(0, i*numCubes+j, 1); + res = device->CreateRenderTargetView(Texture.Get(), &viewDesc, RenderTargetView[i][j].GetAddressOf()); + Utils::throwIfFailed(res); + } + + D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc = {}; + srvDesc.Format = colorFormat; + srvDesc.TextureCubeArray.NumCubes = numCubes; + srvDesc.TextureCubeArray.First2DArrayFace = 0; + srvDesc.TextureCubeArray.MipLevels = 1; + srvDesc.TextureCubeArray.MostDetailedMip = 0; + srvDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + res = device->CreateShaderResourceView(Texture.Get(), &srvDesc,ShaderResourceView.GetAddressOf()); + Utils::throwIfFailed(res); + D3D11_TEXTURE2D_DESC depthTexDesc = {}; + depthTexDesc.Width = resolution; + depthTexDesc.Height = resolution; + depthTexDesc.MipLevels = 1; + depthTexDesc.ArraySize = numCubes*6; + depthTexDesc.SampleDesc.Count = 1; + depthTexDesc.SampleDesc.Quality = 0; + depthTexDesc.Format = depthFormat; + depthTexDesc.Usage = D3D11_USAGE_DEFAULT; + depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + depthTexDesc.CPUAccessFlags = 0; + depthTexDesc.MiscFlags = D3D11_RESOURCE_MISC_TEXTURECUBE; + res = device->CreateTexture2D(&depthTexDesc, NULL, DepthStencilTexture.GetAddressOf()); + Utils::throwIfFailed(res); + + D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = {}; + dsvDesc.Format = depthTexDesc.Format; + dsvDesc.Flags = 0; + dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY; + dsvDesc.Texture2DArray.ArraySize = 1; + DepthStencilView.resize(numCubes); + for(int i = 0; i < numCubes - 1; i++) + for(int j = 0; j < 6; j++){ + dsvDesc.Texture2DArray.FirstArraySlice = D3D11CalcSubresource(0, i * numCubes + j, 1); + res = device->CreateDepthStencilView(DepthStencilTexture.Get(), &dsvDesc, DepthStencilView[i][j].GetAddressOf()); + Utils::throwIfFailed(res); + } + } + + RenderTargetCubeArray::RenderTargetCubeArray() : resolution(0), viewport(CreateViewport(resolution)),numCubes(0) { + + } + +} + diff --git a/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h new file mode 100644 index 000000000..abed4c143 --- /dev/null +++ b/TR5Main/Renderer/RenderTargetCubeArray/RenderTargetCubeArray.h @@ -0,0 +1,35 @@ +#pragma once +#include +#include +#include +namespace T5M::Renderer { + using Microsoft::WRL::ComPtr; + using std::array; + using std::vector; + class RenderTargetCubeArray { + private: + static constexpr D3D11_VIEWPORT CreateViewport(size_t resolution) { + return { + 0, + 0, + static_cast(resolution), + static_cast(resolution), + 0, + 1, + + }; + } + public: + size_t numCubes; + size_t resolution; + D3D11_VIEWPORT viewport; + vector, 6>> RenderTargetView; + ComPtr ShaderResourceView; + ComPtr Texture; + vector, 6>> DepthStencilView; + ComPtr DepthStencilTexture; + RenderTargetCubeArray(); + RenderTargetCubeArray(ID3D11Device* device, size_t resolution,size_t arraySize, DXGI_FORMAT format, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT); + + }; +} \ No newline at end of file diff --git a/TR5Main/Renderer/Renderer11.h b/TR5Main/Renderer/Renderer11.h index def8a7fc0..395c28b28 100644 --- a/TR5Main/Renderer/Renderer11.h +++ b/TR5Main/Renderer/Renderer11.h @@ -25,10 +25,12 @@ struct CAMERA_INFO; #include #include "ConstantBuffer/ConstantBuffer.h" +#include "RenderTargetCubeArray/RenderTargetCubeArray.h" namespace T5M::Renderer { - constexpr size_t SHADOW_MAP_SIZE = 512; + constexpr size_t MAX_DYNAMIC_SHADOWS = 1; + constexpr size_t SHADOW_MAP_SIZE = 256; using TexturePair = std::tuple; #define MESH_BITS(x) (1 << x) #define DX11_RELEASE(x) if (x != NULL) x->Release() @@ -447,6 +449,7 @@ namespace T5M::Renderer T5M::Renderer::Texture2D m_caustics[NUM_CAUSTICS_TEXTURES]; T5M::Renderer::Texture2D m_binocularsTexture; T5M::Renderer::Texture2D m_whiteTexture; + T5M::Renderer::RenderTargetCubeArray m_shadowMaps; // Level data T5M::Renderer::Texture2D m_titleScreen; diff --git a/TR5Main/Renderer/Renderer11Init.cpp b/TR5Main/Renderer/Renderer11Init.cpp index b8430ba88..774bf9009 100644 --- a/TR5Main/Renderer/Renderer11Init.cpp +++ b/TR5Main/Renderer/Renderer11Init.cpp @@ -66,7 +66,7 @@ bool Renderer11::Initialise(int w, int h, int refreshRate, bool windowed, HWND h m_whiteTexture = Texture2D(m_device, L"WhiteSprite.png"); m_logo = Texture2D(m_device, L"Logo.png"); - + m_shadowMaps = RenderTargetCubeArray(m_device, SHADOW_MAP_SIZE, MAX_DYNAMIC_SHADOWS, DXGI_FORMAT_R8G8B8A8_UNORM_SRGB, DXGI_FORMAT_D16_UNORM); // Load shaders ID3D10Blob * blob; @@ -355,7 +355,7 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed, bool Renderer11::Create() { - D3D_FEATURE_LEVEL levels[1] = { D3D_FEATURE_LEVEL_10_0 }; + D3D_FEATURE_LEVEL levels[] = {D3D_FEATURE_LEVEL_11_0,D3D_FEATURE_LEVEL_11_1}; D3D_FEATURE_LEVEL featureLevel; HRESULT res; @@ -364,9 +364,7 @@ bool Renderer11::Create() #else res = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, levels, 1, D3D11_SDK_VERSION, &m_device, &featureLevel, &m_context); // D3D11_CREATE_DEVICE_DEBUG #endif - - if (FAILED(res)) - return false; + Utils::throwIfFailed(res); return true; } diff --git a/TR5Main/Shaders/DX11_Rooms.fx b/TR5Main/Shaders/DX11_Rooms.fx index a1140dd49..f72bd058d 100644 --- a/TR5Main/Shaders/DX11_Rooms.fx +++ b/TR5Main/Shaders/DX11_Rooms.fx @@ -80,7 +80,7 @@ PixelShaderInput VS(VertexShaderInput input) } float2 texOffset(int u, int v) { - return float2(u * 1.0f / 512, v * 1.0f / 512); + return float2(u * 1.0f / 256, v * 1.0f / 256); } float4 PS(PixelShaderInput input) : SV_TARGET diff --git a/TR5Main/TR5Main.vcxproj b/TR5Main/TR5Main.vcxproj index 7ddaa80ef..423e8a18d 100644 --- a/TR5Main/TR5Main.vcxproj +++ b/TR5Main/TR5Main.vcxproj @@ -331,6 +331,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + @@ -575,6 +576,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts" + diff --git a/TR5Main/TR5Main.vcxproj.filters b/TR5Main/TR5Main.vcxproj.filters index 432f6927f..aa5218600 100644 --- a/TR5Main/TR5Main.vcxproj.filters +++ b/TR5Main/TR5Main.vcxproj.filters @@ -852,6 +852,9 @@ File di intestazione + + File di intestazione + @@ -1550,6 +1553,9 @@ File di origine + + File di origine +