1#include "render_texture_class.h"
3render_texture_class::render_texture_class()
5 m_renderTargetTexture = 0;
6 m_renderTargetView = 0;
7 m_shaderResourceView = 0;
8 m_depthStencilBuffer = 0;
9 m_depthStencilView = 0;
18render_texture_class::~render_texture_class()
22bool render_texture_class::Initialize(ID3D11Device * device,
int textureWidth,
int textureHeight,
float screenDepth,
float screenNear,
int format)
24 Logger::Get().
Log(
"Initializing render_texture_class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
26 D3D11_TEXTURE2D_DESC textureDesc;
28 D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
29 D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
30 D3D11_TEXTURE2D_DESC depthBufferDesc;
31 D3D11_DEPTH_STENCIL_VIEW_DESC depthStencilViewDesc;
32 DXGI_FORMAT textureFormat;
40 textureFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
45 textureFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
51 m_textureWidth = textureWidth;
52 m_textureHeight = textureHeight;
55 ZeroMemory(&textureDesc,
sizeof(textureDesc));
58 textureDesc.Width = textureWidth;
59 textureDesc.Height = textureHeight;
60 textureDesc.MipLevels = 1;
61 textureDesc.ArraySize = 1;
62 textureDesc.Format = textureFormat;
63 textureDesc.SampleDesc.Count = 1;
64 textureDesc.Usage = D3D11_USAGE_DEFAULT;
65 textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
66 textureDesc.CPUAccessFlags = 0;
67 textureDesc.MiscFlags = 0;
70 result = device->CreateTexture2D(&textureDesc, NULL, &m_renderTargetTexture);
73 Logger::Get().
Log(
"Failed to create render target texture", __FILE__, __LINE__, Logger::LogLevel::Error);
78 renderTargetViewDesc.Format = textureDesc.Format;
79 renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
80 renderTargetViewDesc.Texture2D.MipSlice = 0;
83 result = device->CreateRenderTargetView(m_renderTargetTexture, &renderTargetViewDesc, &m_renderTargetView);
86 Logger::Get().
Log(
"Failed to create render target view", __FILE__, __LINE__, Logger::LogLevel::Error);
91 shaderResourceViewDesc.Format = textureDesc.Format;
92 shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
93 shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
94 shaderResourceViewDesc.Texture2D.MipLevels = 1;
97 result = device->CreateShaderResourceView(m_renderTargetTexture, &shaderResourceViewDesc, &m_shaderResourceView);
100 Logger::Get().
Log(
"Failed to create shader resource view", __FILE__, __LINE__, Logger::LogLevel::Error);
105 ZeroMemory(&depthBufferDesc,
sizeof(depthBufferDesc));
108 depthBufferDesc.Width = textureWidth;
109 depthBufferDesc.Height = textureHeight;
110 depthBufferDesc.MipLevels = 1;
111 depthBufferDesc.ArraySize = 1;
112 depthBufferDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
113 depthBufferDesc.SampleDesc.Count = 1;
114 depthBufferDesc.SampleDesc.Quality = 0;
115 depthBufferDesc.Usage = D3D11_USAGE_DEFAULT;
116 depthBufferDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;
117 depthBufferDesc.CPUAccessFlags = 0;
118 depthBufferDesc.MiscFlags = 0;
121 result = device->CreateTexture2D(&depthBufferDesc, NULL, &m_depthStencilBuffer);
124 Logger::Get().
Log(
"Failed to create depth buffer texture", __FILE__, __LINE__, Logger::LogLevel::Error);
129 ZeroMemory(&depthStencilViewDesc,
sizeof(depthStencilViewDesc));
132 depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
133 depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
134 depthStencilViewDesc.Texture2D.MipSlice = 0;
137 result = device->CreateDepthStencilView(m_depthStencilBuffer, &depthStencilViewDesc, &m_depthStencilView);
140 Logger::Get().
Log(
"Failed to create depth stencil view", __FILE__, __LINE__, Logger::LogLevel::Error);
145 m_viewport.Width = (float)textureWidth;
146 m_viewport.Height = (float)textureHeight;
147 m_viewport.MinDepth = 0.0f;
148 m_viewport.MaxDepth = 1.0f;
149 m_viewport.TopLeftX = 0;
150 m_viewport.TopLeftY = 0;
153 m_projectionMatrix = XMMatrixPerspectiveFovLH((3.141592654f / 4.0f), ((
float)textureWidth / (
float)textureHeight), screenNear, screenDepth);
156 m_orthoMatrix = XMMatrixOrthographicLH((
float)textureWidth, (
float)textureHeight, screenNear, screenDepth);
158 Logger::Get().
Log(
"render_texture_class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
163void render_texture_class::Shutdown()
165 Logger::Get().
Log(
"Shutting down render_texture_class", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
167 if (m_depthStencilView)
169 m_depthStencilView->Release();
170 m_depthStencilView = 0;
173 if (m_depthStencilBuffer)
175 m_depthStencilBuffer->Release();
176 m_depthStencilBuffer = 0;
179 if (m_shaderResourceView)
181 m_shaderResourceView->Release();
182 m_shaderResourceView = 0;
185 if (m_renderTargetView)
187 m_renderTargetView->Release();
188 m_renderTargetView = 0;
191 if (m_renderTargetTexture)
193 m_renderTargetTexture->Release();
194 m_renderTargetTexture = 0;
197 Logger::Get().
Log(
"render_texture_class shut down", __FILE__, __LINE__, Logger::LogLevel::Shutdown);
202void render_texture_class::SetRenderTarget(ID3D11DeviceContext * deviceContext)
205 deviceContext->OMSetRenderTargets(1, &m_renderTargetView, m_depthStencilView);
208 deviceContext->RSSetViewports(1, &m_viewport);
213void render_texture_class::ClearRenderTarget(ID3D11DeviceContext * deviceContext,
float red,
float green,
float blue,
float alpha)
225 deviceContext->ClearRenderTargetView(m_renderTargetView, color);
228 deviceContext->ClearDepthStencilView(m_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
233ID3D11ShaderResourceView* render_texture_class::GetShaderResourceView()
235 return m_shaderResourceView;
238void render_texture_class::GetProjectionMatrix(XMMATRIX & projectionMatrix)
240 projectionMatrix = m_projectionMatrix;
245void render_texture_class::GetOrthoMatrix(XMMATRIX & orthoMatrix)
247 orthoMatrix = m_orthoMatrix;
252int render_texture_class::GetTextureWidth()
254 return m_textureWidth;
258int render_texture_class::GetTextureHeight()
260 return m_textureHeight;
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)