Wildvine Engine
Referencia Doxygen del codigo propio de Wildvine Engine.
Cargando...
Buscando...
Nada coincide
ShaderProgram.cpp
Ir a la documentación de este archivo.
1
6#include "ShaderProgram.h"
7#include "Device.h"
8#include "DeviceContext.h"
10
11
12HRESULT
14 const std::string& fileName,
15 LayoutBuilder layoutBuilder) {
16 if (!device.m_device) {
17 ERROR("ShaderProgram", "init", "Device is null.");
18 return E_POINTER;
19 }
20 if (fileName.empty()) {
21 ERROR("ShaderProgram", "init", "File name is empty.");
22 return E_INVALIDARG;
23 }
24 //if (layoutBuilder) {
25 // ERROR("ShaderProgram", "init", "Input layout is empty.");
26 // return E_INVALIDARG;
27 //}
28 m_shaderFileName = fileName;
29 // Create the Vertex Shader
30 HRESULT hr = CreateShader(device, ShaderType::VERTEX_SHADER);
31 if (FAILED(hr)) {
32 ERROR("ShaderProgram", "init", "Failed to create vertex shader.");
33 return hr;
34 }
35
36 // Create the Input Layout
37 hr = CreateInputLayout(device, layoutBuilder);
38 if (FAILED(hr)) {
39 ERROR("ShaderProgram", "init", "Failed to create input layout.");
40 return hr;
41 }
42
43 // Create the Pixel Shader
45 if (FAILED(hr)) {
46 ERROR("ShaderProgram", "init", "Failed to create pixel shader.");
47 return hr;
48 }
49
50 return hr;
51}
52
53HRESULT
55 if (!m_vertexShaderData) {
56 ERROR("ShaderProgram", "CreateInputLayout", "Vertex shader data is null.");
57 return E_POINTER;
58 }
59 if (!device.m_device) {
60 ERROR("ShaderProgram", "CreateInputLayout", "Device is null.");
61 return E_POINTER;
62 }
63 //if (Layout.empty()) {
64 // ERROR("ShaderProgram", "CreateInputLayout", "Input layout is empty.");
65 // return E_INVALIDARG;
66 //}
67
68 auto& layout = layoutBuilder.Get();
69
70 HRESULT hr = m_inputLayout.init(device, layout.data(), layout.size() , m_vertexShaderData);
72
73 if (FAILED(hr)) {
74 ERROR("ShaderProgram", "CreateInputLayout", "Failed to create input layout.");
75 return hr;
76 }
77
78 return hr;
79}
80
81HRESULT
83 if (!device.m_device) {
84 ERROR("ShaderProgram", "CreateShader", "Device is null.");
85 return E_POINTER;
86 }
87 if (m_shaderFileName.empty()) {
88 ERROR("ShaderProgram", "CreateShader", "Shader file name is empty.");
89 return E_INVALIDARG;
90 }
91
92 HRESULT hr = S_OK;
93 ID3DBlob* shaderData = nullptr;
94
95 const char* shaderEntryPoint = (type == ShaderType::PIXEL_SHADER) ? "PS" : "VS";
96 const char* shaderModel = (type == ShaderType::PIXEL_SHADER) ? "ps_5_0" : "vs_5_0";
97
98 // Compile the shader from file
100 shaderEntryPoint,
101 shaderModel,
102 &shaderData);
103
104 if (FAILED(hr)) {
105 ERROR("ShaderProgram", "CreateShader",
106 "Failed to compile shader from file: %s", m_shaderFileName.c_str());
107 return hr;
108 }
109
110 // Create the shader object
111 if (type == PIXEL_SHADER) {
112 hr = device.CreatePixelShader(shaderData->GetBufferPointer(),
113 shaderData->GetBufferSize(),
114 nullptr,
116 }
117 else {
118 hr = device.CreateVertexShader(shaderData->GetBufferPointer(),
119 shaderData->GetBufferSize(),
120 nullptr,
122 }
123
124 if (FAILED(hr)) {
125 ERROR("ShaderProgram", "CreateShader",
126 "Failed to create shader object from compiled data.");
127 shaderData->Release();
128 return hr;
129 }
130
131 // Store the compiled shader data
132 if (type == PIXEL_SHADER) {
134 m_pixelShaderData = shaderData;
135 }
136 else {
138 m_vertexShaderData = shaderData;
139 }
140
141 return S_OK;
142}
143
144HRESULT
146 ShaderType type,
147 const std::string& fileName) {
148 if (!device.m_device) {
149 ERROR("ShaderProgram", "init", "Device is null.");
150 return E_POINTER;
151 }
152 if (fileName.empty()) {
153 ERROR("ShaderProgram", "init", "File name is empty.");
154 return E_INVALIDARG;
155 }
156 m_shaderFileName = fileName;
157
158 HRESULT hr = CreateShader(device, type);
159
160 if (FAILED(hr)) {
161 ERROR("ShaderProgram", "CreateShader",
162 "Failed to Create shader from file: %s", m_shaderFileName.c_str());
163 return hr;
164 }
165
166 return S_OK;
167}
168
169HRESULT
171 LPCSTR szEntryPoint,
172 LPCSTR szShaderModel,
173 ID3DBlob** ppBlobOut) {
174 HRESULT hr = S_OK;
175
176 DWORD dwShaderFlags = D3DCOMPILE_ENABLE_STRICTNESS;
177#if defined( DEBUG ) || defined( _DEBUG )
178 // Set the D3DCOMPILE_DEBUG flag to embed debug information in the shaders.
179 // Setting this flag improves the shader debugging experience, but still allows
180 // the shaders to be optimized and to run exactly the way they will run in
181 // the release configuration of this program.
182 dwShaderFlags |= D3DCOMPILE_DEBUG;
183#endif
184 ID3DBlob* pErrorBlob;
185 hr = D3DX11CompileFromFile(szFileName,
186 nullptr,
187 nullptr,
188 szEntryPoint,
189 szShaderModel,
190 dwShaderFlags,
191 0,
192 nullptr,
193 ppBlobOut,
194 &pErrorBlob,
195 nullptr);
196
197 if (FAILED(hr)) {
198 if (pErrorBlob) {
199 ERROR("ShaderProgram", "CompileShaderFromFile",
200 "Failed to compile shader from file: %s. Error: %s",
201 szFileName, static_cast<const char*>(pErrorBlob->GetBufferPointer()));
202
203 pErrorBlob->Release();
204 }
205 else {
206 ERROR("ShaderProgram", "CompileShaderFromFile",
207 "Failed to compile shader from file: %s. No error message available.",
208 szFileName);
209 }
210 return hr;
211 }
212
213 SAFE_RELEASE(pErrorBlob)
214
215 return S_OK;
216}
217
218void
221 ERROR("ShaderProgram", "render", "Shaders or InputLayout not initialized");
222 return;
223 }
224
225 m_inputLayout.render(deviceContext);
226 deviceContext.m_deviceContext->VSSetShader(m_VertexShader, nullptr, 0);
227 deviceContext.m_deviceContext->PSSetShader(m_PixelShader, nullptr, 0);
228}
229
230void
232 if (!deviceContext.m_deviceContext) {
233 ERROR("RenderTargetView", "render", "DeviceContext is nullptr.");
234 return;
235 }
236 switch (type) {
237 case VERTEX_SHADER:
238 deviceContext.m_deviceContext->VSSetShader(m_VertexShader, nullptr, 0);
239 break;
240 case PIXEL_SHADER:
241 deviceContext.m_deviceContext->PSSetShader(m_PixelShader, nullptr, 0);
242 break;
243 default:
244 break;
245 }
246}
247
248void
256
Declara la API de DeviceContext dentro del subsistema Core.
Declara la API de Device dentro del subsistema Core.
Declara la API de LayoutBuilder dentro del subsistema Utilities.
#define SAFE_RELEASE(x)
ShaderType
@ PIXEL_SHADER
@ VERTEX_SHADER
#define ERROR(classObj, method, errorMSG)
Declara la API de ShaderProgram dentro del subsistema Core.
ID3D11DeviceContext * m_deviceContext
Puntero al contexto inmediato de Direct3D 11.
Encapsula un ID3D11Device y facilita la creación de recursos gráficos en Direct3D 11.
Definition Device.h:21
ID3D11Device * m_device
Puntero al dispositivo Direct3D 11.
Definition Device.h:146
HRESULT CreateVertexShader(const void *pShaderBytecode, unsigned int BytecodeLength, ID3D11ClassLinkage *pClassLinkage, ID3D11VertexShader **ppVertexShader)
Crea un Vertex Shader.
Definition Device.cpp:100
HRESULT CreatePixelShader(const void *pShaderBytecode, unsigned int BytecodeLength, ID3D11ClassLinkage *pClassLinkage, ID3D11PixelShader **ppPixelShader)
Crea un Pixel Shader.
Definition Device.cpp:168
void destroy()
Libera el recurso ID3D11InputLayout y deja la instancia en estado no inicializado.
HRESULT init(Device &device, const D3D11_INPUT_ELEMENT_DESC *layoutDesc, UINT layoutCount, ID3DBlob *vertexShaderData)
Inicializa el Input Layout a partir de una descripción y bytecode de Vertex Shader.
ID3D11InputLayout * m_inputLayout
Recurso COM de Direct3D 11 que representa el Input Layout.
Definition InputLayout.h:93
void render(DeviceContext &deviceContext)
Aplica el Input Layout al contexto de dispositivo.
const std::vector< D3D11_INPUT_ELEMENT_DESC > & Get() const
ID3D11VertexShader * m_VertexShader
Vertex Shader compilado y creado en GPU.
HRESULT CreateShader(Device &device, ShaderType type)
Crea un shader (Vertex o Pixel) a partir del archivo establecido en m_shaderFileName.
ID3D11PixelShader * m_PixelShader
Pixel Shader compilado y creado en GPU.
InputLayout m_inputLayout
Input Layout asociado al Vertex Shader.
ID3DBlob * m_vertexShaderData
Bytecode compilado del Vertex Shader.
void render(DeviceContext &deviceContext)
Aplica el Vertex Shader, Pixel Shader e Input Layout al pipeline.
ID3DBlob * m_pixelShaderData
Bytecode compilado del Pixel Shader.
HRESULT CompileShaderFromFile(char *szFileName, LPCSTR szEntryPoint, LPCSTR szShaderModel, ID3DBlob **ppBlobOut)
Compila un shader desde archivo.
HRESULT init(Device &device, const std::string &fileName, LayoutBuilder layoutBuilder)
Inicializa el programa de shaders desde un archivo HLSL.
std::string m_shaderFileName
Nombre del archivo HLSL asociado a este programa de shaders.
void destroy()
Libera todos los recursos asociados (shaders, blobs e input layout).
HRESULT CreateInputLayout(Device &device, LayoutBuilder)
Crea un Input Layout asociado al Vertex Shader.