23{
24 Logger::Get().
Log(
"Initializing render_texture_class", __FILE__, __LINE__, Logger::LogLevel::Initialize);
25
26 D3D11_TEXTURE2D_DESC textureDesc;
27 HRESULT result;
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;
33
34
35
36 switch (format)
37 {
38 case 1:
39 {
40 textureFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
41 break;
42 }
43 default:
44 {
45 textureFormat = DXGI_FORMAT_R8G8B8A8_UNORM;
46 break;
47 }
48 }
49
50
51 m_textureWidth = textureWidth;
52 m_textureHeight = textureHeight;
53
54
55 ZeroMemory(&textureDesc, sizeof(textureDesc));
56
57
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;
68
69
70 result = device->CreateTexture2D(&textureDesc, NULL, &m_renderTargetTexture);
71 if (FAILED(result))
72 {
73 Logger::Get().
Log(
"Failed to create render target texture", __FILE__, __LINE__, Logger::LogLevel::Error);
74 return false;
75 }
76
77
78 renderTargetViewDesc.Format = textureDesc.Format;
79 renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
80 renderTargetViewDesc.Texture2D.MipSlice = 0;
81
82
83 result = device->CreateRenderTargetView(m_renderTargetTexture, &renderTargetViewDesc, &m_renderTargetView);
84 if (FAILED(result))
85 {
86 Logger::Get().
Log(
"Failed to create render target view", __FILE__, __LINE__, Logger::LogLevel::Error);
87 return false;
88 }
89
90
91 shaderResourceViewDesc.Format = textureDesc.Format;
92 shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
93 shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
94 shaderResourceViewDesc.Texture2D.MipLevels = 1;
95
96
97 result = device->CreateShaderResourceView(m_renderTargetTexture, &shaderResourceViewDesc, &m_shaderResourceView);
98 if (FAILED(result))
99 {
100 Logger::Get().
Log(
"Failed to create shader resource view", __FILE__, __LINE__, Logger::LogLevel::Error);
101 return false;
102 }
103
104
105 ZeroMemory(&depthBufferDesc, sizeof(depthBufferDesc));
106
107
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;
119
120
121 result = device->CreateTexture2D(&depthBufferDesc, NULL, &m_depthStencilBuffer);
122 if (FAILED(result))
123 {
124 Logger::Get().
Log(
"Failed to create depth buffer texture", __FILE__, __LINE__, Logger::LogLevel::Error);
125 return false;
126 }
127
128
129 ZeroMemory(&depthStencilViewDesc, sizeof(depthStencilViewDesc));
130
131
132 depthStencilViewDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
133 depthStencilViewDesc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
134 depthStencilViewDesc.Texture2D.MipSlice = 0;
135
136
137 result = device->CreateDepthStencilView(m_depthStencilBuffer, &depthStencilViewDesc, &m_depthStencilView);
138 if (FAILED(result))
139 {
140 Logger::Get().
Log(
"Failed to create depth stencil view", __FILE__, __LINE__, Logger::LogLevel::Error);
141 return false;
142 }
143
144
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;
151
152
153 m_projectionMatrix = XMMatrixPerspectiveFovLH((3.141592654f / 4.0f), ((float)textureWidth / (float)textureHeight), screenNear, screenDepth);
154
155
156 m_orthoMatrix = XMMatrixOrthographicLH((float)textureWidth, (float)textureHeight, screenNear, screenDepth);
157
158 Logger::Get().
Log(
"render_texture_class initialized", __FILE__, __LINE__, Logger::LogLevel::Initialize);
159
160 return true;
161}
void Log(const std::string &message, const std::string &fileName, int lineNumber, LogLevel level=LogLevel::Info)