RenderTargetCubeArray for Shadow Maps

This commit is contained in:
Nils Gaitzsch 2020-07-26 16:15:35 +02:00
parent a587b08792
commit ccf072833b
11 changed files with 136 additions and 16 deletions

View file

@ -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;

View file

@ -11,7 +11,7 @@ namespace T5M::Renderer {
ComPtr<ID3D11Texture2D> DepthStencilTexture;
ComPtr<ID3D11ShaderResourceView> 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);
};
}

View file

@ -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;

View file

@ -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);
};
}

View file

@ -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) {
}
}

View file

@ -0,0 +1,35 @@
#pragma once
#include <d3d11.h>
#include <array>
#include <wrl/client.h>
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<FLOAT>(resolution),
static_cast<FLOAT>(resolution),
0,
1,
};
}
public:
size_t numCubes;
size_t resolution;
D3D11_VIEWPORT viewport;
vector<array<ComPtr<ID3D11RenderTargetView>, 6>> RenderTargetView;
ComPtr<ID3D11ShaderResourceView> ShaderResourceView;
ComPtr<ID3D11Texture2D> Texture;
vector<array<ComPtr<ID3D11DepthStencilView>, 6>> DepthStencilView;
ComPtr<ID3D11Texture2D> DepthStencilTexture;
RenderTargetCubeArray();
RenderTargetCubeArray(ID3D11Device* device, size_t resolution,size_t arraySize, DXGI_FORMAT format, DXGI_FORMAT depthFormat = DXGI_FORMAT_D32_FLOAT);
};
}

View file

@ -25,10 +25,12 @@ struct CAMERA_INFO;
#include <level.h>
#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<Texture2D, Texture2D>;
#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;

View file

@ -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;
}

View file

@ -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

View file

@ -331,6 +331,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClInclude Include="Renderer\Utils.h" />
<ClInclude Include="Renderer\RenderTarget2D\RenderTarget2D.h" />
<ClInclude Include="Renderer\RenderTargetCube\RenderTargetCube.h" />
<ClInclude Include="Renderer\RenderTargetCubeArray\RenderTargetCubeArray.h" />
<ClInclude Include="Scripting\LanguageScript.h" />
<ClInclude Include="Renderer\Renderer11.h" />
<ClInclude Include="resource.h" />
@ -575,6 +576,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Renderer\Utils.cpp" />
<ClCompile Include="Renderer\RenderTarget2D\RenderTarget2D.cpp" />
<ClCompile Include="Renderer\RenderTargetCube\RenderTargetCube.cpp" />
<ClCompile Include="Renderer\RenderTargetCubeArray\RenderTargetCubeArray.cpp" />
<ClCompile Include="Scripting\LanguageScript.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_demigod.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_guide.cpp" />

View file

@ -852,6 +852,9 @@
<ClInclude Include="Renderer\ConstantBuffer\ConstantBuffer.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Renderer\RenderTargetCubeArray\RenderTargetCubeArray.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Game\box.cpp">
@ -1550,6 +1553,9 @@
<ClCompile Include="Game\memory\malloc.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Renderer\RenderTargetCubeArray\RenderTargetCubeArray.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />