mirror of
https://github.com/TombEngine/TombEngine.git
synced 2025-05-11 04:56:49 +03:00
RenderTargetCubeArray for Shadow Maps
This commit is contained in:
parent
a587b08792
commit
ccf072833b
11 changed files with 136 additions and 16 deletions
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
}
|
|
@ -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) {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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);
|
||||
|
||||
};
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue