Wildvine Engine
Referencia Doxygen del codigo propio de Wildvine Engine.
Cargando...
Buscando...
Nada coincide
ForwardRenderer.cpp
Ir a la documentación de este archivo.
1
7#include <algorithm>
8#include <cmath>
9#include "Device.h"
10#include "DeviceContext.h"
11#include "Rendering/Material.h"
13#include "Rendering/Mesh.h"
14#include "SamplerState.h"
19
20HRESULT
22 HRESULT hr = m_perFrameBuffer.init(device, sizeof(CBPerFrame));
23 if (FAILED(hr)) {
24 return hr;
25 }
26
27 hr = m_perObjectBuffer.init(device, sizeof(CBPerObject));
28 if (FAILED(hr)) {
29 return hr;
30 }
31
32 hr = m_perMaterialBuffer.init(device, sizeof(CBPerMaterial));
33 if (FAILED(hr)) {
34 return hr;
35 }
36
38 true,
39 D3D11_DEPTH_WRITE_MASK_ZERO,
40 D3D11_COMPARISON_LESS_EQUAL);
41 if (FAILED(hr)) {
42 return hr;
43 }
44
45 hr = createShadowResources(device);
46 if (FAILED(hr)) {
47 return hr;
48 }
49
50 hr = m_preShadowDebugPass.init(device, 1280, 720);
51 if (FAILED(hr)) {
52 return hr;
53 }
54
55 hr = createBlendStates(device);
56 if (FAILED(hr)) {
57 return hr;
58 }
59
60 return S_OK;
61}
62
63void
64ForwardRenderer::resize(Device& device, unsigned int width, unsigned int height) {
65 m_preShadowDebugPass.resize(device, width, height);
66}
67
68void
70 const RenderScene& scene,
71 DeviceContext& deviceContext) {
72 updateLightMatrices(camera, scene);
73 XMStoreFloat4x4(&m_cbPerFrame.View, XMMatrixTranspose(camera.getView()));
74 XMStoreFloat4x4(&m_cbPerFrame.Projection, XMMatrixTranspose(camera.getProj()));
76 m_cbPerFrame.LightDir = EU::Vector3(0.0f, -1.0f, 0.0f);
77 m_cbPerFrame.LightColor = EU::Vector3(1.0f, 1.0f, 1.0f);
78
79 if (!scene.directionalLights.empty()) {
80 const LightData& mainLight = scene.directionalLights.front();
82 m_cbPerFrame.LightColor = mainLight.color * mainLight.intensity;
83 }
84
85 m_perFrameBuffer.update(deviceContext, nullptr, 0, nullptr, &m_cbPerFrame, 0, 0);
86}
87
88void
90 const Camera& camera,
91 RenderScene& scene,
92 EditorViewportPass& viewportPass) {
93 const float viewportClear[4] = { 0.10f, 0.10f, 0.10f, 1.0f };
94
95 buildQueues(scene, camera);
96 updatePerFrame(camera, scene, deviceContext);
97
98 renderPreShadowDebugPass(deviceContext, scene);
99 renderShadowPass(deviceContext);
100 viewportPass.begin(deviceContext, viewportClear);
101 viewportPass.setViewport(deviceContext);
102 viewportPass.clearDepth(deviceContext);
103 renderSkyboxPass(deviceContext, scene);
104 renderOpaquePass(deviceContext);
105 renderTransparentPass(deviceContext);
106}
107
108void
127
128void
130 (void)camera;
131 m_opaqueQueue.clear();
132 m_transparentQueue.clear();
133
134 for (auto& object : scene.opaqueObjects) {
135 m_opaqueQueue.push_back(&object);
136 }
137
138 for (auto& object : scene.transparentObjects) {
139 m_transparentQueue.push_back(&object);
140 }
141
142 std::sort(m_opaqueQueue.begin(), m_opaqueQueue.end(),
143 [](const RenderObject* lhs, const RenderObject* rhs) {
144 if (lhs->materialInstance != rhs->materialInstance) {
145 return lhs->materialInstance < rhs->materialInstance;
146 }
147 return lhs->distanceToCamera < rhs->distanceToCamera;
148 });
149
150 std::sort(m_transparentQueue.begin(), m_transparentQueue.end(),
151 [](const RenderObject* lhs, const RenderObject* rhs) {
152 return lhs->distanceToCamera > rhs->distanceToCamera;
153 });
154}
155
156void
159 return;
160 }
161
162 ID3D11ShaderResourceView* nullShadowSRV[1] = { nullptr };
163 deviceContext.PSSetShaderResources(6, 1, nullShadowSRV);
164 deviceContext.OMSetRenderTargets(0, nullptr, m_shadowDSV.m_depthStencilView);
165 deviceContext.ClearDepthStencilView(m_shadowDSV.m_depthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0);
166
167 D3D11_VIEWPORT shadowViewport{};
168 shadowViewport.TopLeftX = 0.0f;
169 shadowViewport.TopLeftY = 0.0f;
170 shadowViewport.Width = static_cast<float>(m_shadowMapSize);
171 shadowViewport.Height = static_cast<float>(m_shadowMapSize);
172 shadowViewport.MinDepth = 0.0f;
173 shadowViewport.MaxDepth = 1.0f;
174 deviceContext.RSSetViewports(1, &shadowViewport);
175
176 m_shadowRasterizer.render(deviceContext);
177 m_perFrameBuffer.render(deviceContext, 0, 1, false);
178
179 for (const RenderObject* object : m_opaqueQueue) {
180 if (!object || !object->castShadow) {
181 continue;
182 }
183 renderShadowObject(deviceContext, *object);
184 }
185}
186
187void
190 return;
191 }
192
193 const float clearColor[4] = { 0.10f, 0.10f, 0.10f, 1.0f };
194 ID3D11ShaderResourceView* nullShadowSRV[1] = { nullptr };
195 deviceContext.PSSetShaderResources(6, 1, nullShadowSRV);
196 m_applyShadows = false;
197
198 m_preShadowDebugPass.begin(deviceContext, clearColor);
199 m_preShadowDebugPass.setViewport(deviceContext);
200 m_preShadowDebugPass.clearDepth(deviceContext);
201 renderSkyboxPass(deviceContext, scene);
202 renderOpaquePass(deviceContext);
203 renderTransparentPass(deviceContext);
204
205 m_applyShadows = true;
206}
207
208void
210 m_perFrameBuffer.render(deviceContext, 0, 1, true);
213 }
214 else {
215 ID3D11ShaderResourceView* nullShadowSRV[1] = { nullptr };
216 deviceContext.PSSetShaderResources(6, 1, nullShadowSRV);
217 }
218 deviceContext.OMSetBlendState(m_opaqueBlendState, m_blendFactor, 0xffffffff);
219
220 for (const RenderObject* object : m_opaqueQueue) {
221 if (!object) {
222 continue;
223 }
224 renderObject(deviceContext, *object, RenderPassType::Opaque);
225 }
226}
227
228void
230 m_perFrameBuffer.render(deviceContext, 0, 1, true);
233 }
234 else {
235 ID3D11ShaderResourceView* nullShadowSRV[1] = { nullptr };
236 deviceContext.PSSetShaderResources(6, 1, nullShadowSRV);
237 }
238
239 for (const RenderObject* object : m_transparentQueue) {
240 if (!object) {
241 continue;
242 }
243 Material* material = object->materialInstance ? object->materialInstance->getMaterial() : nullptr;
244 deviceContext.OMSetBlendState(resolveBlendState(material), m_blendFactor, 0xffffffff);
245 renderObject(deviceContext, *object, RenderPassType::Transparent);
246 }
247
248 deviceContext.OMSetBlendState(m_opaqueBlendState, m_blendFactor, 0xffffffff);
249}
250
251void
253 if (!scene.skybox) {
254 return;
255 }
256 scene.skybox->render(deviceContext);
257}
258
259void
261 const RenderObject& object,
262 RenderPassType passType) {
263 if (!object.mesh || (!object.materialInstance && object.materialInstances.empty())) {
264 return;
265 }
266
267 XMStoreFloat4x4(&m_cbPerObject.World, XMMatrixTranspose(object.world));
268 m_perObjectBuffer.update(deviceContext, nullptr, 0, nullptr, &m_cbPerObject, 0, 0);
269 m_perObjectBuffer.render(deviceContext, 1, 1, true);
270
271 deviceContext.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
272
273 std::vector<Submesh>& submeshes = object.mesh->getSubmeshes();
274 for (Submesh& submesh : submeshes) {
275 MaterialInstance* materialInstance = object.materialInstance;
276 if (submesh.materialSlot < object.materialInstances.size() &&
277 object.materialInstances[submesh.materialSlot]) {
278 materialInstance = object.materialInstances[submesh.materialSlot];
279 }
280
281 if (!materialInstance) {
282 continue;
283 }
284
285 Material* material = materialInstance->getMaterial();
286 if (!material) {
287 continue;
288 }
289
290 if (material->getRasterizerState()) {
291 material->getRasterizerState()->render(deviceContext);
292 }
293
294 if (passType == RenderPassType::Transparent) {
295 m_transparentDepthStencil.render(deviceContext, 0, false);
296 }
297 else if (material->getDepthStencilState()) {
298 material->getDepthStencilState()->render(deviceContext, 0, false);
299 }
300
301 if (material->getShader()) {
302 material->getShader()->render(deviceContext);
303 }
304
305 if (material->getSamplerState()) {
306 material->getSamplerState()->render(deviceContext, 0, 1);
307 }
308
309 materialInstance->bindTextures(deviceContext);
310
311 const MaterialParams& params = materialInstance->getParams();
315 m_cbPerMaterial.AO = params.ao;
319 if (material->getDomain() == MaterialDomain::Masked) {
321 }
322 m_perMaterialBuffer.update(deviceContext, nullptr, 0, nullptr, &m_cbPerMaterial, 0, 0);
323 m_perMaterialBuffer.render(deviceContext, 2, 1, true);
324
325 submesh.vertexBuffer.render(deviceContext, 0, 1);
326 submesh.indexBuffer.render(deviceContext, 0, 1, false, DXGI_FORMAT_R32_UINT);
327 deviceContext.DrawIndexed(submesh.indexCount, submesh.startIndex, 0);
328 }
329}
330
331void
333 if (!object.mesh) {
334 return;
335 }
336
337 XMStoreFloat4x4(&m_cbPerObject.World, XMMatrixTranspose(object.world));
338 m_perObjectBuffer.update(deviceContext, nullptr, 0, nullptr, &m_cbPerObject, 0, 0);
339 m_perObjectBuffer.render(deviceContext, 1, 1, false);
340
341 m_shadowShader.render(deviceContext);
342 deviceContext.m_deviceContext->PSSetShader(nullptr, nullptr, 0);
343 deviceContext.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
344
345 std::vector<Submesh>& submeshes = object.mesh->getSubmeshes();
346 for (Submesh& submesh : submeshes) {
347 submesh.vertexBuffer.render(deviceContext, 0, 1);
348 submesh.indexBuffer.render(deviceContext, 0, 1, false, DXGI_FORMAT_R32_UINT);
349 deviceContext.DrawIndexed(submesh.indexCount, submesh.startIndex, 0);
350 }
351}
352
353HRESULT
355 HRESULT hr = m_shadowDepthTexture.init(
356 device,
359 DXGI_FORMAT_R24G8_TYPELESS,
360 D3D11_BIND_DEPTH_STENCIL | D3D11_BIND_SHADER_RESOURCE);
361 if (FAILED(hr)) {
362 return hr;
363 }
364
365 hr = m_shadowDepthSRV.init(device, m_shadowDepthTexture, DXGI_FORMAT_R24_UNORM_X8_TYPELESS);
366 if (FAILED(hr)) {
367 return hr;
368 }
369
370 hr = m_shadowDSV.init(device, m_shadowDepthTexture, DXGI_FORMAT_D24_UNORM_S8_UINT, D3D11_DSV_DIMENSION_TEXTURE2D);
371 if (FAILED(hr)) {
372 return hr;
373 }
374
375 LayoutBuilder builder;
376 builder.Add("POSITION", DXGI_FORMAT_R32G32B32_FLOAT)
377 .Add("NORMAL", DXGI_FORMAT_R32G32B32_FLOAT)
378 .Add("TANGENT", DXGI_FORMAT_R32G32B32_FLOAT)
379 .Add("BITANGENT", DXGI_FORMAT_R32G32B32_FLOAT)
380 .Add("TEXCOORD", DXGI_FORMAT_R32G32_FLOAT);
381
382 hr = m_shadowShader.init(device, "ShadowMap.hlsl", builder);
383 if (FAILED(hr)) {
384 return hr;
385 }
386
387 hr = m_shadowRasterizer.init(device, D3D11_FILL_SOLID, D3D11_CULL_BACK, false, true);
388 if (FAILED(hr)) {
389 return hr;
390 }
391
392 return S_OK;
393}
394
395void
397 EU::Vector3 lightDir = EU::Vector3(0.0f, -1.0f, 0.0f);
398 if (!scene.directionalLights.empty()) {
399 lightDir = scene.directionalLights.front().direction;
400 }
401
402 XMVECTOR lightDirVec = XMVector3Normalize(XMVectorSet(lightDir.x, lightDir.y, lightDir.z, 0.0f));
403 XMVECTOR cameraPos = XMVectorSet(camera.getPosition().x, camera.getPosition().y, camera.getPosition().z, 1.0f);
404 XMVECTOR lightTarget = cameraPos;
405 XMVECTOR lightEye = XMVectorSubtract(lightTarget, XMVectorScale(lightDirVec, 35.0f));
406 XMVECTOR worldUp = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
407 if (fabsf(XMVectorGetX(XMVector3Dot(lightDirVec, worldUp))) > 0.98f) {
408 worldUp = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);
409 }
410
411 XMMATRIX lightView = XMMatrixLookAtLH(lightEye, lightTarget, worldUp);
412 XMMATRIX lightProjection = XMMatrixOrthographicLH(40.0f, 40.0f, 1.0f, 80.0f);
413 XMStoreFloat4x4(&m_cbPerFrame.LightViewProjection, XMMatrixTranspose(lightView * lightProjection));
414}
415
416HRESULT
418 if (!device.m_device) {
419 return E_POINTER;
420 }
421
422 D3D11_BLEND_DESC blendDesc{};
423 blendDesc.AlphaToCoverageEnable = FALSE;
424 blendDesc.IndependentBlendEnable = FALSE;
425
426 D3D11_RENDER_TARGET_BLEND_DESC& renderTarget = blendDesc.RenderTarget[0];
427 renderTarget.BlendEnable = FALSE;
428 renderTarget.SrcBlend = D3D11_BLEND_ONE;
429 renderTarget.DestBlend = D3D11_BLEND_ZERO;
430 renderTarget.BlendOp = D3D11_BLEND_OP_ADD;
431 renderTarget.SrcBlendAlpha = D3D11_BLEND_ONE;
432 renderTarget.DestBlendAlpha = D3D11_BLEND_ZERO;
433 renderTarget.BlendOpAlpha = D3D11_BLEND_OP_ADD;
434 renderTarget.RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;
435
436 HRESULT hr = device.m_device->CreateBlendState(&blendDesc, &m_opaqueBlendState);
437 if (FAILED(hr)) {
438 return hr;
439 }
440
441 renderTarget.BlendEnable = TRUE;
442 renderTarget.SrcBlend = D3D11_BLEND_SRC_ALPHA;
443 renderTarget.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
444 renderTarget.BlendOp = D3D11_BLEND_OP_ADD;
445 renderTarget.SrcBlendAlpha = D3D11_BLEND_ONE;
446 renderTarget.DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
447 renderTarget.BlendOpAlpha = D3D11_BLEND_OP_ADD;
448
449 hr = device.m_device->CreateBlendState(&blendDesc, &m_alphaBlendState);
450 if (FAILED(hr)) {
451 return hr;
452 }
453
454 renderTarget.BlendEnable = TRUE;
455 renderTarget.SrcBlend = D3D11_BLEND_SRC_ALPHA;
456 renderTarget.DestBlend = D3D11_BLEND_ONE;
457 renderTarget.BlendOp = D3D11_BLEND_OP_ADD;
458 renderTarget.SrcBlendAlpha = D3D11_BLEND_ONE;
459 renderTarget.DestBlendAlpha = D3D11_BLEND_ONE;
460 renderTarget.BlendOpAlpha = D3D11_BLEND_OP_ADD;
461
462 hr = device.m_device->CreateBlendState(&blendDesc, &m_additiveBlendState);
463 if (FAILED(hr)) {
464 return hr;
465 }
466
467 renderTarget.BlendEnable = TRUE;
468 renderTarget.SrcBlend = D3D11_BLEND_ONE;
469 renderTarget.DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
470 renderTarget.BlendOp = D3D11_BLEND_OP_ADD;
471 renderTarget.SrcBlendAlpha = D3D11_BLEND_ONE;
472 renderTarget.DestBlendAlpha = D3D11_BLEND_INV_SRC_ALPHA;
473 renderTarget.BlendOpAlpha = D3D11_BLEND_OP_ADD;
474
475 return device.m_device->CreateBlendState(&blendDesc, &m_premultipliedBlendState);
476}
477
478ID3D11BlendState*
480 if (!material) {
481 return m_opaqueBlendState;
482 }
483
484 if (material->getDomain() != MaterialDomain::Transparent) {
485 return m_opaqueBlendState;
486 }
487
488 switch (material->getBlendMode()) {
493 case BlendMode::Alpha:
495 default:
497 }
498}
499
500
501
502
503
Declara la API de Camera dentro del subsistema Utilities.
Declara la API de DeviceContext dentro del subsistema Core.
Declara la API de Device dentro del subsistema Core.
Declara la API de EditorViewportPass dentro del subsistema Utilities.
Declara la API de ForwardRenderer dentro del subsistema Rendering.
Declara la API de LayoutBuilder dentro del subsistema Utilities.
Declara la API de MaterialInstance dentro del subsistema Rendering.
Declara la API de Material dentro del subsistema Rendering.
Declara la API de Mesh dentro del subsistema Rendering.
#define SAFE_RELEASE(x)
@ PremultipliedAlpha
RenderPassType
Definition RenderTypes.h:28
Declara la API de SamplerState dentro del subsistema Core.
Declara la API de Skybox dentro del subsistema Utilities.
void update(DeviceContext &deviceContext, ID3D11Resource *pDstResource, unsigned int DstSubresource, const D3D11_BOX *pDstBox, const void *pSrcData, unsigned int SrcRowPitch, unsigned int SrcDepthPitch)
Actualiza el contenido del buffer (típicamente mediante UpdateSubresource).
Definition Buffer.cpp:76
HRESULT init(Device &device, const MeshComponent &mesh, unsigned int bindFlag)
Inicializa el buffer como Vertex o Index Buffer usando un MeshComponent.
Definition Buffer.cpp:11
void render(DeviceContext &deviceContext, unsigned int StartSlot, unsigned int NumBuffers, bool setPixelShader=false, DXGI_FORMAT format=DXGI_FORMAT_UNKNOWN)
Enlaza el buffer a la etapa correspondiente del pipeline para el frame de render.
Definition Buffer.cpp:102
void destroy()
Libera el ID3D11Buffer y resetea los metadatos internos.
Definition Buffer.cpp:136
XMMATRIX getView() const
Matriz View (mundo->vista).
Definition Camera.h:113
EU::Vector3 getPosition() const
Obtiene la posición en mundo.
Definition Camera.h:45
XMMATRIX getProj() const
Matriz Projection (vista->clip).
Definition Camera.h:119
HRESULT init(Device &device, bool depthEnable, D3D11_DEPTH_WRITE_MASK writeMask, D3D11_COMPARISON_FUNC depthFunc)
Crea el objeto ID3D11DepthStencilState a partir de flags comunes.
void destroy()
Libera el recurso ID3D11DepthStencilState y deja la instancia en estado no inicializado.
void render(DeviceContext &deviceContext, unsigned int stencilRef=0, bool reset=false)
Aplica el estado de profundidad/esténcil al contexto (OMSetDepthStencilState).
void destroy()
Libera el recurso asociado al ID3D11DepthStencilView.
HRESULT init(Device &device, Texture &depthStencil, DXGI_FORMAT format)
Inicializa el ID3D11DepthStencilView a partir de una textura de profundidad.
ID3D11DepthStencilView * m_depthStencilView
Vista de profundidad/esténcil de Direct3D 11.
void DrawIndexed(unsigned int IndexCount, unsigned int StartIndexLocation, int BaseVertexLocation)
Envía un comando de dibujado de primitivas indexadas.
void OMSetBlendState(ID3D11BlendState *pBlendState, const float BlendFactor[4], unsigned int SampleMask)
Asigna un Blend State al Output Merger.
void PSSetShaderResources(unsigned int StartSlot, unsigned int NumViews, ID3D11ShaderResourceView *const *ppShaderResourceViews)
Asigna Shader Resource Views a la etapa de Pixel Shader.
void IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY Topology)
Define la topología de primitivas a renderizar.
void RSSetViewports(unsigned int NumViewports, const D3D11_VIEWPORT *pViewports)
Configura los viewports en la etapa de rasterización.
ID3D11DeviceContext * m_deviceContext
Puntero al contexto inmediato de Direct3D 11.
void ClearDepthStencilView(ID3D11DepthStencilView *pDepthStencilView, unsigned int ClearFlags, float Depth, UINT8 Stencil)
Limpia un Depth Stencil View.
void OMSetRenderTargets(unsigned int NumViews, ID3D11RenderTargetView *const *ppRenderTargetViews, ID3D11DepthStencilView *pDepthStencilView)
Asigna Render Targets y Depth Stencil al Output Merger.
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
A 3D vector class.
Definition Vector3.h:45
float x
The x-coordinate of the vector.
Definition Vector3.h:47
float z
The z-coordinate of the vector.
Definition Vector3.h:49
float y
The y-coordinate of the vector.
Definition Vector3.h:48
HRESULT init(Device &device, unsigned int width, unsigned int height)
void setViewport(DeviceContext &deviceContext)
void begin(DeviceContext &deviceContext, const float clearColor[4])
void clearDepth(DeviceContext &deviceContext)
HRESULT resize(Device &device, unsigned int width, unsigned int height)
DepthStencilView m_shadowDSV
void resize(Device &device, unsigned int width, unsigned int height)
Reconstuye los recursos dependientes del tamano del viewport.
ID3D11BlendState * m_alphaBlendState
ID3D11BlendState * m_opaqueBlendState
ID3D11BlendState * m_premultipliedBlendState
std::vector< const RenderObject * > m_transparentQueue
void renderOpaquePass(DeviceContext &deviceContext)
void destroy()
Libera los recursos internos del renderer.
void updatePerFrame(const Camera &camera, const RenderScene &scene, DeviceContext &deviceContext)
Actualiza constantes globales usadas por el frame actual.
void renderObject(DeviceContext &deviceContext, const RenderObject &object, RenderPassType passType)
CBPerMaterial m_cbPerMaterial
HRESULT init(Device &device)
Inicializa buffers, shaders y estados del renderer.
HRESULT createBlendStates(Device &device)
DepthStencilState m_transparentDepthStencil
void renderShadowPass(DeviceContext &deviceContext)
void renderShadowObject(DeviceContext &deviceContext, const RenderObject &object)
ID3D11BlendState * resolveBlendState(const Material *material) const
ID3D11BlendState * m_additiveBlendState
Texture m_shadowDepthTexture
void render(DeviceContext &deviceContext, const Camera &camera, RenderScene &scene, EditorViewportPass &viewportPass)
Renderiza la escena completa sobre el EditorViewportPass.
RasterizerState m_shadowRasterizer
CBPerObject m_cbPerObject
ShaderProgram m_shadowShader
void buildQueues(RenderScene &scene, const Camera &camera)
std::vector< const RenderObject * > m_opaqueQueue
void updateLightMatrices(const Camera &camera, const RenderScene &scene)
void renderTransparentPass(DeviceContext &deviceContext)
HRESULT createShadowResources(Device &device)
void renderPreShadowDebugPass(DeviceContext &deviceContext, RenderScene &scene)
EditorViewportPass m_preShadowDebugPass
CBPerFrame m_cbPerFrame
void renderSkyboxPass(DeviceContext &deviceContext, RenderScene &scene)
unsigned int m_shadowMapSize
LayoutBuilder & Add(const char *semantic, DXGI_FORMAT format, UINT semanticIndex=0, UINT inputSlot=0, UINT alignedByteOffset=D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_CLASSIFICATION slotClass=D3D11_INPUT_PER_VERTEX_DATA, UINT instanceStepRate=0)
Agrupa un material base con sus texturas y parametros concretos.
Material * getMaterial() const
void bindTextures(DeviceContext &deviceContext) const
Enlaza las texturas de la instancia en el contexto grafico actual.
MaterialParams & getParams()
Describe el estado fijo compartido por una o mas instancias de material.
Definition Material.h:23
ShaderProgram * getShader() const
Definition Material.h:32
BlendMode getBlendMode() const
Definition Material.h:37
RasterizerState * getRasterizerState() const
Definition Material.h:33
SamplerState * getSamplerState() const
Definition Material.h:35
MaterialDomain getDomain() const
Definition Material.h:36
DepthStencilState * getDepthStencilState() const
Definition Material.h:34
void destroy()
Libera el recurso ID3D11RasterizerState.
void render(DeviceContext &deviceContext)
Aplica el Rasterizer State al contexto de dispositivo.
HRESULT init(Device device)
Inicializa el Rasterizer State.
Contenedor temporal con los elementos visibles de un frame.
Definition RenderScene.h:20
Skybox * skybox
Skybox activo para el frame actual.
Definition RenderScene.h:31
std::vector< RenderObject > transparentObjects
Objetos transparentes ordenables por distancia.
Definition RenderScene.h:29
std::vector< LightData > directionalLights
Luces direccionales activas en la escena.
Definition RenderScene.h:30
std::vector< RenderObject > opaqueObjects
Objetos opacos listos para renderizar.
Definition RenderScene.h:28
void render(DeviceContext &deviceContext, unsigned int StartSlot, unsigned int NumSamplers)
Asigna el Sampler State a la etapa de Pixel Shader.
ID3D11VertexShader * m_VertexShader
Vertex Shader compilado y creado en GPU.
void render(DeviceContext &deviceContext)
Aplica el Vertex Shader, Pixel Shader e Input Layout al pipeline.
HRESULT init(Device &device, const std::string &fileName, LayoutBuilder layoutBuilder)
Inicializa el programa de shaders desde un archivo HLSL.
void destroy()
Libera todos los recursos asociados (shaders, blobs e input layout).
void render(DeviceContext &deviceContext)
Definition Skybox.cpp:117
HRESULT init(Device &device, const std::string &textureName, ExtensionType extensionType)
Inicializa una textura cargada desde archivo.
Definition Texture.cpp:182
void destroy()
Libera los recursos de la textura.
Definition Texture.cpp:327
ID3D11ShaderResourceView * m_textureFromImg
Vista de la textura como recurso de shader.
Definition Texture.h:170
EU::Vector3 LightColor
Definition RenderTypes.h:76
XMFLOAT4X4 View
Definition RenderTypes.h:69
EU::Vector3 CameraPos
Definition RenderTypes.h:72
XMFLOAT4X4 Projection
Definition RenderTypes.h:70
XMFLOAT4X4 LightViewProjection
Definition RenderTypes.h:71
EU::Vector3 LightDir
Definition RenderTypes.h:74
float AlphaCutoff
Definition RenderTypes.h:93
XMFLOAT4 BaseColor
Definition RenderTypes.h:87
float NormalScale
Definition RenderTypes.h:91
float EmissiveStrength
Definition RenderTypes.h:92
XMFLOAT4X4 World
Definition RenderTypes.h:82
EU::Vector3 color
Definition RenderTypes.h:46
EU::Vector3 direction
Definition RenderTypes.h:49
float intensity
Definition RenderTypes.h:47
float emissiveStrength
Definition RenderTypes.h:63
XMFLOAT4 baseColor
Definition RenderTypes.h:58
float distanceToCamera
Describe una porcion renderizable de una malla con sus buffers asociados.
Definition Mesh.h:15