Refactored RenderTarget2D

This commit is contained in:
Nils Gaitzsch 2020-06-16 17:40:32 +02:00
parent a82a338795
commit 9f682a0078
9 changed files with 120 additions and 135 deletions

View file

@ -0,0 +1,66 @@
#include "framework.h"
#include "RenderTarget2D.h"
#include "Utils.h"
using T5M::Renderer::Utils::throwIfFailed;
RenderTarget2D::RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format)
{
D3D11_TEXTURE2D_DESC desc = {};
desc.Width = w;
desc.Height = h;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = format;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
HRESULT res = device->CreateTexture2D(&desc, NULL, &Texture);
throwIfFailed(res);
D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
viewDesc.Format = desc.Format;
viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MipSlice = 0;
res = device->CreateRenderTargetView(Texture.Get(), &viewDesc, &RenderTargetView);
throwIfFailed(res);
// Setup the description of the shader resource view.
D3D11_SHADER_RESOURCE_VIEW_DESC shaderDesc;
shaderDesc.Format = desc.Format;
shaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderDesc.Texture2D.MostDetailedMip = 0;
shaderDesc.Texture2D.MipLevels = 1;
res = device->CreateShaderResourceView(Texture.Get(), &shaderDesc, &ShaderResourceView);
throwIfFailed(res);
D3D11_TEXTURE2D_DESC depthTexDesc = {};
depthTexDesc.Width = w;
depthTexDesc.Height = h;
depthTexDesc.MipLevels = 1;
depthTexDesc.ArraySize = 1;
depthTexDesc.SampleDesc.Count = 1;
depthTexDesc.SampleDesc.Quality = 0;
depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthTexDesc.Usage = D3D11_USAGE_DEFAULT;
depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthTexDesc.CPUAccessFlags = 0;
depthTexDesc.MiscFlags = 0;
res = device->CreateTexture2D(&depthTexDesc, NULL, &DepthStencilTexture);
throwIfFailed(res);
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc = {};
dsvDesc.Format = depthTexDesc.Format;
dsvDesc.Flags = 0;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
dsvDesc.Texture2D.MipSlice = 0;
res = device->CreateDepthStencilView(DepthStencilTexture.Get(), &dsvDesc, &DepthStencilView);
throwIfFailed(res);
}

View file

@ -0,0 +1,17 @@
#pragma once
#include <wrl/client.h>
using Microsoft::WRL::ComPtr;
class RenderTarget2D
{
public:
ComPtr<ID3D11RenderTargetView> RenderTargetView;
ComPtr<ID3D11ShaderResourceView> ShaderResourceView;
ComPtr<ID3D11Texture2D> Texture;
ComPtr<ID3D11DepthStencilView> DepthStencilView;
ComPtr<ID3D11Texture2D> DepthStencilTexture;
ComPtr<ID3D11ShaderResourceView> DepthShaderResourceView;
RenderTarget2D() {};
RenderTarget2D(ID3D11Device* device, int w, int h, DXGI_FORMAT format);
};

View file

@ -76,10 +76,6 @@ Renderer11::~Renderer11()
DX11_RELEASE(m_cbLights);
DX11_RELEASE(m_cbMisc);
DX11_DELETE(m_renderTarget);
DX11_DELETE(m_dumpScreenRenderTarget);
DX11_DELETE(m_shadowMap);
DX11_RELEASE(m_swapChain);
DX11_RELEASE(m_context);
DX11_RELEASE(m_device);

View file

@ -15,6 +15,9 @@
#include "effect.h"
#include <IndexBuffer.h>
#include "VertexBuffer.h"
#include "RenderTarget2D.h"
class RenderTarget2D;
#define MESH_BITS(x) (1 << x)
#define DX11_RELEASE(x) if (x != NULL) x->Release()
@ -53,107 +56,6 @@ struct RendererVertex
float Bone;
};
class RenderTarget2D
{
public:
ID3D11RenderTargetView* RenderTargetView;
ID3D11ShaderResourceView* ShaderResourceView;
ID3D11Texture2D* Texture;
ID3D11DepthStencilView* DepthStencilView;
ID3D11Texture2D* DepthStencilTexture;
ID3D11ShaderResourceView* DepthShaderResourceView;
bool IsValid = false;
RenderTarget2D()
{
}
static RenderTarget2D* Create(ID3D11Device* device, int w, int h, DXGI_FORMAT format)
{
RenderTarget2D* rt = new RenderTarget2D();
D3D11_TEXTURE2D_DESC desc;
desc.Width = w;
desc.Height = h;
desc.MipLevels = 1;
desc.ArraySize = 1;
desc.Format = format;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.Usage = D3D11_USAGE_DEFAULT;
desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
desc.CPUAccessFlags = 0;
desc.MiscFlags = 0;
rt->Texture = NULL;
HRESULT res = device->CreateTexture2D(&desc, NULL, &rt->Texture);
if (FAILED(res))
return NULL;
D3D11_RENDER_TARGET_VIEW_DESC viewDesc;
viewDesc.Format = desc.Format;
viewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
viewDesc.Texture2D.MipSlice = 0;
res = device->CreateRenderTargetView(rt->Texture, &viewDesc, &rt->RenderTargetView);
if (FAILED(res))
return NULL;
// Setup the description of the shader resource view.
D3D11_SHADER_RESOURCE_VIEW_DESC shaderDesc;
shaderDesc.Format = desc.Format;
shaderDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
shaderDesc.Texture2D.MostDetailedMip = 0;
shaderDesc.Texture2D.MipLevels = 1;
res = device->CreateShaderResourceView(rt->Texture, &shaderDesc, &rt->ShaderResourceView);
if (FAILED(res))
return NULL;
D3D11_TEXTURE2D_DESC depthTexDesc;
ZeroMemory(&depthTexDesc, sizeof(D3D11_TEXTURE2D_DESC));
depthTexDesc.Width = w;
depthTexDesc.Height = h;
depthTexDesc.MipLevels = 1;
depthTexDesc.ArraySize = 1;
depthTexDesc.SampleDesc.Count = 1;
depthTexDesc.SampleDesc.Quality = 0;
depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthTexDesc.Usage = D3D11_USAGE_DEFAULT;
depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthTexDesc.CPUAccessFlags = 0;
depthTexDesc.MiscFlags = 0;
rt->DepthStencilTexture = NULL;
res = device->CreateTexture2D(&depthTexDesc, NULL, &rt->DepthStencilTexture);
if (FAILED(res))
return NULL;
D3D11_DEPTH_STENCIL_VIEW_DESC dsvDesc;
ZeroMemory(&dsvDesc, sizeof(D3D11_DEPTH_STENCIL_VIEW_DESC));
dsvDesc.Format = depthTexDesc.Format;
dsvDesc.Flags = 0;
dsvDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
dsvDesc.Texture2D.MipSlice = 0;
rt->DepthStencilView = NULL;
res = device->CreateDepthStencilView(rt->DepthStencilTexture, &dsvDesc, &rt->DepthStencilView);
if (FAILED(res))
return NULL;
return rt;
}
~RenderTarget2D()
{
DX11_RELEASE(RenderTargetView);
DX11_RELEASE(ShaderResourceView);
DX11_RELEASE(Texture);
DX11_RELEASE(DepthStencilView);
DX11_RELEASE(DepthStencilTexture);
}
};
class Texture2D
{
@ -234,7 +136,7 @@ public:
};
typedef struct RendererHUDBar
struct RendererHUDBar
{
VertexBuffer vertexBufferBorder;
IndexBuffer indexBufferBorder;
@ -296,7 +198,7 @@ struct RendererLight
Vector3 Position;
float Type;
Vector3 Color;
float Dynamic;
bool Dynamic;
Vector4 Direction;
float Intensity;
float In;
@ -305,7 +207,6 @@ struct RendererLight
RendererLight()
{
Dynamic = 0.0f;
}
};
@ -537,10 +438,10 @@ private:
ID3D11DepthStencilView* m_depthStencilView;
ID3D11Texture2D* m_depthStencilTexture;
RenderTarget2D* m_dumpScreenRenderTarget;
RenderTarget2D* m_renderTarget;
RenderTarget2D* m_currentRenderTarget;
RenderTarget2D* m_shadowMap;
RenderTarget2D m_dumpScreenRenderTarget;
RenderTarget2D m_renderTarget;
RenderTarget2D m_currentRenderTarget;
RenderTarget2D m_shadowMap;
// Shaders
ID3D11VertexShader* m_vsRooms;

View file

@ -62,7 +62,7 @@ bool Renderer11::drawObjectOn2DPosition(short x, short y, short objectNum, short
Vector3 pos = m_viewportToolkit->Unproject(Vector3(x, y, 1), projection, view, Matrix::Identity);
// Clear just the Z-buffer so we can start drawing on top of the scene
m_context->ClearDepthStencilView(m_currentRenderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->ClearDepthStencilView(m_currentRenderTarget.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
// Set vertex buffer
m_context->IASetVertexBuffers(0, 1, m_moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset);
@ -214,9 +214,9 @@ bool Renderer11::drawShadowMap()
m_context->OMSetDepthStencilState(m_states->DepthDefault(), 0);
// Bind and clear render target
m_context->ClearRenderTargetView(m_shadowMap->RenderTargetView, Colors::White);
m_context->ClearDepthStencilView(m_shadowMap->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, &m_shadowMap->RenderTargetView, m_shadowMap->DepthStencilView);
m_context->ClearRenderTargetView(m_shadowMap.RenderTargetView.Get(), Colors::White);
m_context->ClearDepthStencilView(m_shadowMap.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, m_shadowMap.RenderTargetView.GetAddressOf(), m_shadowMap.DepthStencilView.Get());
m_context->RSSetViewports(1, &m_shadowMapViewport);
@ -469,9 +469,9 @@ int Renderer11::drawInventoryScene()
m_context->OMSetBlendState(m_states->Opaque(), NULL, 0xFFFFFFFF);
// Bind and clear render target
m_context->ClearRenderTargetView(m_renderTarget->RenderTargetView, Colors::Black);
m_context->ClearDepthStencilView(m_renderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, &m_renderTarget->RenderTargetView, m_renderTarget->DepthStencilView);
m_context->ClearRenderTargetView(m_renderTarget.RenderTargetView.Get(), Colors::Black);
m_context->ClearDepthStencilView(m_renderTarget.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, m_renderTarget.RenderTargetView.GetAddressOf(), m_renderTarget.DepthStencilView.Get());
m_context->RSSetViewports(1, &m_viewport);
// Clear the Z-Buffer after drawing the background
@ -480,14 +480,14 @@ int Renderer11::drawInventoryScene()
if (g_GameFlow->TitleType == TITLE_BACKGROUND)
drawFullScreenQuad(m_titleScreen->ShaderResourceView, Vector3(m_fadeFactor, m_fadeFactor, m_fadeFactor), false);
else
drawFullScreenQuad(m_dumpScreenRenderTarget->ShaderResourceView, Vector3(1.0f, 1.0f, 1.0f), false);
drawFullScreenQuad(m_dumpScreenRenderTarget.ShaderResourceView.Get(), Vector3(1.0f, 1.0f, 1.0f), false);
}
else
{
drawFullScreenQuad(m_dumpScreenRenderTarget->ShaderResourceView, Vector3(0.2f, 0.2f, 0.2f), false);
drawFullScreenQuad(m_dumpScreenRenderTarget.ShaderResourceView.Get(), Vector3(0.2f, 0.2f, 0.2f), false);
}
m_context->ClearDepthStencilView(m_renderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->ClearDepthStencilView(m_renderTarget.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
UINT stride = sizeof(RendererVertex);
UINT offset = 0;
@ -1820,7 +1820,7 @@ void Renderer11::AddDynamicLight(int x, int y, int z, short falloff, byte r, byt
dynamicLight->Color = Vector3(r / 255.0f, g / 255.0f, b / 255.0f);
dynamicLight->Out = falloff * 256.0f;
dynamicLight->Type = LIGHT_TYPES::LIGHT_TYPE_POINT;
dynamicLight->Dynamic = 1;
dynamicLight->Dynamic = true;
dynamicLight->Intensity = falloff/2;
m_dynamicLights.push_back(dynamicLight);
@ -1850,7 +1850,7 @@ int Renderer11::drawFinalPass()
m_context->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, &m_backBufferRTV, m_depthStencilView);
drawFullScreenQuad(m_renderTarget->ShaderResourceView, Vector3(m_fadeFactor, m_fadeFactor, m_fadeFactor), m_enableCinematicBars);
drawFullScreenQuad(m_renderTarget.ShaderResourceView.Get(), Vector3(m_fadeFactor, m_fadeFactor, m_fadeFactor), m_enableCinematicBars);
m_swapChain->Present(0, 0);
@ -1962,9 +1962,9 @@ bool Renderer11::drawScene(bool dump)
// Bind and clear render target
m_currentRenderTarget = (dump ? m_dumpScreenRenderTarget : m_renderTarget);
m_context->ClearRenderTargetView(m_currentRenderTarget->RenderTargetView, Colors::Black);
m_context->ClearDepthStencilView(m_currentRenderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, &m_currentRenderTarget->RenderTargetView, m_currentRenderTarget->DepthStencilView);
m_context->ClearRenderTargetView(m_currentRenderTarget.RenderTargetView.Get(), Colors::Black);
m_context->ClearDepthStencilView(m_currentRenderTarget.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->OMSetRenderTargets(1, m_currentRenderTarget.RenderTargetView.GetAddressOf(), m_currentRenderTarget.DepthStencilView.Get());
m_context->RSSetViewports(1, &m_viewport);
@ -2343,7 +2343,7 @@ bool Renderer11::drawRooms(bool transparent, bool animated)
m_context->PSSetSamplers(0, 1, &sampler);
m_context->PSSetShaderResources(1, 1, &m_caustics[m_currentCausticsFrame / 2]->ShaderResourceView);
m_context->PSSetSamplers(1, 1, &shadowSampler);
m_context->PSSetShaderResources(2, 1, &m_shadowMap->ShaderResourceView);
m_context->PSSetShaderResources(2, 1, m_shadowMap.ShaderResourceView.GetAddressOf());
updateConstantBuffer(m_cbCameraMatrices, &m_stCameraMatrices, sizeof(CCameraMatrixBuffer));
m_context->VSSetConstantBuffers(0, 1, &m_cbCameraMatrices);
@ -2604,7 +2604,7 @@ bool Renderer11::drawHorizonAndSky()
}
// Clear just the Z-buffer so we can start drawing on top of the horizon
m_context->ClearDepthStencilView(m_currentRenderTarget->DepthStencilView, D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
m_context->ClearDepthStencilView(m_currentRenderTarget.DepthStencilView.Get(), D3D11_CLEAR_DEPTH | D3D11_CLEAR_STENCIL, 1.0f, 0);
return true;
}

View file

@ -338,9 +338,9 @@ bool Renderer11::initialiseScreen(int w, int h, int refreshRate, bool windowed,
m_primitiveBatch = new PrimitiveBatch<RendererVertex>(m_context);
// Initialise buffers
m_renderTarget = RenderTarget2D::Create(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM);
m_dumpScreenRenderTarget = RenderTarget2D::Create(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM);
m_shadowMap = RenderTarget2D::Create(m_device, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, DXGI_FORMAT_R32_FLOAT);
m_renderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM);
m_dumpScreenRenderTarget = RenderTarget2D(m_device, w, h, DXGI_FORMAT_R8G8B8A8_UNORM);
m_shadowMap = RenderTarget2D(m_device, SHADOW_MAP_SIZE, SHADOW_MAP_SIZE, DXGI_FORMAT_R32_FLOAT);
// Shadow map
/*D3D11_TEXTURE2D_DESC depthTexDesc;

View file

@ -135,9 +135,6 @@ bool Renderer11::ChangeScreenResolution(int width, int height, int frequency, bo
ID3D11RenderTargetView* nullViews[] = { nullptr };
m_context->OMSetRenderTargets(0, nullViews, NULL);
DX11_DELETE(m_renderTarget);
DX11_DELETE(m_dumpScreenRenderTarget);
DX11_DELETE(m_shadowMap);
DX11_DELETE(m_gameFont);
DX11_DELETE(m_spriteBatch);
DX11_DELETE(m_primitiveBatch);

View file

@ -315,6 +315,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClInclude Include="Renderer\ShadowLightBuffer.h" />
<ClInclude Include="Renderer\StaticBuffer.h" />
<ClInclude Include="Renderer\Utils.h" />
<ClInclude Include="Renderer\RenderTarget2D.h" />
<ClInclude Include="Scripting\LanguageScript.h" />
<ClInclude Include="Renderer\Renderer11.h" />
<ClInclude Include="resource.h" />
@ -553,6 +554,7 @@ xcopy /Y "$(ProjectDir)Scripting\Scripts\*.lua" "$(TargetDir)\Scripts"</Command>
<ClCompile Include="Renderer\Renderer11String.cpp" />
<ClCompile Include="Renderer\Renderer11Frame.cpp" />
<ClCompile Include="Renderer\Utils.cpp" />
<ClCompile Include="Renderer\RenderTarget2D.cpp" />
<ClCompile Include="Scripting\LanguageScript.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_demigod.cpp" />
<ClCompile Include="Objects\TR4\Entity\tr4_guide.cpp" />

View file

@ -810,6 +810,9 @@
<ClInclude Include="Renderer\VertexBuffer.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Renderer\RenderTarget2D.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Game\box.cpp">
@ -1487,6 +1490,9 @@
<ClCompile Include="Renderer\VertexBuffer.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Renderer\RenderTarget2D.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />