void DxManager::RenderCascadedShadowMap() { if(this->useSun) { D3DXMATRIX wvp; D3DXMatrixIdentity(&wvp); for (int l = 0; l < this->csm->GetNrOfCascadeLevels(); l++) { this->Dx_DeviceContext->OMSetRenderTargets(0, 0, this->csm->GetShadowMapDSV(l)); D3D11_VIEWPORT wp = this->csm->GetShadowMapViewPort(l); this->Dx_DeviceContext->RSSetViewports(1, &wp); this->Dx_DeviceContext->ClearDepthStencilView(this->csm->GetShadowMapDSV(l), D3D11_CLEAR_DEPTH, 1.0f, 0); //Terrain for(int i = 0; i < this->terrains.size(); i++) { //Matrices wvp = this->terrains[i]->GetWorldMatrix() * this->csm->GetViewProjMatrix(l); this->Shader_ShadowMap->SetMatrix("LightWVP", wvp); //Input Assembler this->Dx_DeviceContext->IASetPrimitiveTopology(this->terrains[i]->GetTopology()); //Vertex data Buffer* verts = this->terrains[i]->GetVertexBufferPointer(); Buffer* inds = this->terrains[i]->GetIndexBufferPointer(); if(verts) { inds->Apply(); } if(inds) { verts->Apply(); } //Apply Shader this->Shader_ShadowMap->Apply(0); //Draw if(inds) { this->Dx_DeviceContext->DrawIndexed(inds->GetElementCount(), 0, 0); } else { this->Dx_DeviceContext->Draw(verts->GetElementCount(), 0); } } //Static meshes for(int i = 0; i < this->objects.size(); i++) { if(!this->objects[i]->IsUsingInvisibility()) { MaloW::Array<MeshStrip*>* strips = this->objects[i]->GetStrips(); wvp = this->objects[i]->GetWorldMatrix() * this->csm->GetViewProjMatrix(l); this->Shader_ShadowMap->SetMatrix("LightWVP", wvp); for(int u = 0; u < strips->size(); u++) { Object3D* obj = strips->get(u)->GetRenderObject(); Dx_DeviceContext->IASetPrimitiveTopology(obj->GetTopology()); Buffer* verts = obj->GetVertBuff(); if(verts) verts->Apply(); Buffer* inds = obj->GetIndsBuff(); if(inds) inds->Apply(); Shader_ShadowMap->Apply(0); // draw if(inds) Dx_DeviceContext->DrawIndexed(inds->GetElementCount(), 0, 0); else Dx_DeviceContext->Draw(verts->GetElementCount(), 0); } } } D3DXMATRIX lvp = this->csm->GetViewProjMatrix(l); // For deferred: this->Shader_DeferredLightning->SetResourceAtIndex(l, "CascadedShadowMap", this->csm->GetShadowMapSRV(l)); this->Shader_DeferredLightning->SetStructMemberAtIndexAsMatrix(l, "cascades", "viewProj", lvp); } float PCF_SIZE = (float)this->params.ShadowMapSettings + 1; float PCF_SQUARED = 1 / (PCF_SIZE * PCF_SIZE); this->Shader_DeferredLightning->SetFloat("SMAP_DX", 1.0f / (256.0f * pow(2.0f, this->params.ShadowMapSettings / 2.0f))); this->Shader_DeferredLightning->SetFloat("PCF_SIZE", PCF_SIZE); this->Shader_DeferredLightning->SetFloat("PCF_SIZE_SQUARED", PCF_SQUARED); this->Shader_DeferredLightning->SetFloat("NrOfCascades", (float)this->csm->GetNrOfCascadeLevels()); this->Shader_DeferredLightning->SetFloat4("CascadeLevels", D3DXVECTOR4(this->csm->GetSplitDepth(0), this->csm->GetSplitDepth(1), this->csm->GetSplitDepth(2), this->csm->GetSplitDepth(3))); } }
void DxManager::RenderShadowMap() { // Set sun-settings this->Shader_DeferredLightning->SetBool("UseSun", this->useSun); if(this->useSun) { this->Shader_DeferredLightning->SetStructMemberAsFloat4("sun", "Direction", D3DXVECTOR4(this->sun.direction, 0.0f)); this->Shader_DeferredLightning->SetStructMemberAsFloat4("sun", "LightColor", D3DXVECTOR4(this->sun.lightColor, 0.0f)); this->Shader_DeferredLightning->SetStructMemberAsFloat("sun", "LightIntensity", this->sun.intensity); //Shader_ShadowMap->Apply(0); // Dont know why the f**k this has to be here, but it does, otherwise textures wont be sent when rendering objects. **Texture error** } // If special circle is used if(this->specialCircleParams.x) //if inner radius > 0, then send/set data { this->Shader_DeferredLightning->SetFloat4("dataPPHA", this->specialCircleParams); } // Generate and send shadowmaps to the main-shader if(!this->lights.size()) { for (int l = 0; l < this->lights.size(); l++) { Dx_DeviceContext->OMSetRenderTargets(0, 0, this->lights[l]->GetShadowMapDSV()); D3D11_VIEWPORT wp = this->lights[l]->GetShadowMapViewPort(); Dx_DeviceContext->RSSetViewports(1, &wp); Dx_DeviceContext->ClearDepthStencilView(this->lights[l]->GetShadowMapDSV(), D3D11_CLEAR_DEPTH, 1.0f, 0); //Static meshes for(int i = 0; i < this->objects.size(); i++) { if(!this->objects[i]->IsUsingInvisibility()) { MaloW::Array<MeshStrip*>* strips = this->objects[i]->GetStrips(); D3DXMATRIX wvp = this->objects[i]->GetWorldMatrix() * this->lights[l]->GetViewProjMatrix(); this->Shader_ShadowMap->SetMatrix("LightWVP", wvp); for(int u = 0; u < strips->size(); u++) { Object3D* obj = strips->get(u)->GetRenderObject(); Dx_DeviceContext->IASetPrimitiveTopology(obj->GetTopology()); Buffer* verts = obj->GetVertBuff(); if(verts) verts->Apply(); Shader_ShadowMap->SetBool("textured", false); Buffer* inds = obj->GetIndsBuff(); if(inds) inds->Apply(); Shader_ShadowMap->Apply(0); //Draw if(inds) Dx_DeviceContext->DrawIndexed(inds->GetElementCount(), 0, 0); else Dx_DeviceContext->Draw(verts->GetElementCount(), 0); } } } //Animated meshes for(int i = 0; i < this->animations.size(); i++) { if(!this->animations[i]->IsUsingInvisibility()) { KeyFrame* one = NULL; KeyFrame* two = NULL; float t = 0.0f; this->animations[i]->SetCurrentTime(this->Timer); this->animations[i]->GetCurrentKeyFrames(&one, &two, t); MaloW::Array<MeshStrip*>* stripsOne = one->strips; MaloW::Array<MeshStrip*>* stripsTwo = two->strips; //set shader data (per object) D3DXMATRIX wvp = this->animations[i]->GetWorldMatrix() * this->lights[l]->GetViewProjMatrix(); this->Shader_ShadowMapAnimated->SetMatrix("LightWVP", wvp); this->Shader_ShadowMapAnimated->SetFloat("t", t); for(int u = 0; u < stripsOne->size(); u++) { Object3D* objOne = stripsOne->get(u)->GetRenderObject(); Object3D* objTwo = stripsTwo->get(u)->GetRenderObject(); this->Dx_DeviceContext->IASetPrimitiveTopology(objOne->GetTopology()); Buffer* vertsOne = objOne->GetVertBuff(); Buffer* vertsTwo = objTwo->GetVertBuff(); ID3D11Buffer* vertexBuffers [] = {vertsOne->GetBufferPointer(), vertsTwo->GetBufferPointer()}; UINT strides [] = {sizeof(Vertex), sizeof(Vertex)}; UINT offsets [] = {0, 0}; this->Dx_DeviceContext->IASetVertexBuffers(0, 2, vertexBuffers, strides, offsets); Shader_ShadowMapAnimated->Apply(0); this->Dx_DeviceContext->Draw(vertsOne->GetElementCount(), 0); } } } D3DXMATRIX lvp = this->lights[l]->GetViewProjMatrix(); // Forward //this->Shader_ForwardRendering->SetResourceAtIndex(l, "ShadowMap", this->lights[l]->GetShadowMapSRV()); //this->Shader_ForwardRendering->SetStructMemberAtIndexAsMatrix(l, "lights", "LightViewProj", lvp); //this->Shader_ForwardRendering->SetStructMemberAtIndexAsFloat4(l, "lights", "LightPosition", D3DXVECTOR4(this->lights[l]->GetPosition(), 1)); //this->Shader_ForwardRendering->SetStructMemberAtIndexAsFloat4(l, "lights", "LightColor", D3DXVECTOR4(this->lights[l]->GetColor(), 1)); //this->Shader_ForwardRendering->SetStructMemberAtIndexAsFloat(l, "lights", "LightIntensity", this->lights[l]->GetIntensity()); // For deferred: this->Shader_DeferredLightning->SetResourceAtIndex(l, "ShadowMap", this->lights[l]->GetShadowMapSRV()); this->Shader_DeferredLightning->SetStructMemberAtIndexAsMatrix(l, "lights", "LightViewProj", lvp); this->Shader_DeferredLightning->SetStructMemberAtIndexAsFloat4(l, "lights", "LightPosition", D3DXVECTOR4(this->lights[l]->GetPosition(), 1)); this->Shader_DeferredLightning->SetStructMemberAtIndexAsFloat4(l, "lights", "LightColor", D3DXVECTOR4(this->lights[l]->GetColor(), 1)); this->Shader_DeferredLightning->SetStructMemberAtIndexAsFloat(l, "lights", "LightIntensity", this->lights[l]->GetIntensity()); // For deferred quad: //this->Shader_DeferredQuad->SetResourceAtIndex(l, "ShadowMap", this->lights[l]->GetShadowMapSRV()); //this->Shader_DeferredQuad->SetStructMemberAtIndexAsMatrix(l, "lights", "LightViewProj", lvp); //this->Shader_DeferredQuad->SetStructMemberAtIndexAsFloat4(l, "lights", "LightPosition", D3DXVECTOR4(this->lights[l]->GetPosition(), 1)); //this->Shader_DeferredQuad->SetStructMemberAtIndexAsFloat4(l, "lights", "LightColor", D3DXVECTOR4(this->lights[l]->GetColor(), 1)); //this->Shader_DeferredQuad->SetStructMemberAtIndexAsFloat(l, "lights", "LightIntensity", this->lights[l]->GetIntensity()); } } float PCF_SIZE = (float)this->params.ShadowMapSettings + 1; float PCF_SQUARED = 1 / (PCF_SIZE * PCF_SIZE); /* // Forward this->Shader_ForwardRendering->SetFloat("PCF_SIZE", PCF_SIZE); this->Shader_ForwardRendering->SetFloat("PCF_SIZE_SQUARED", PCF_SQUARED); this->Shader_ForwardRendering->SetFloat("SMAP_DX", 1.0f / (256 * pow(2.0f, this->params.ShadowMapSettings/2))); this->Shader_ForwardRendering->SetFloat("NrOfLights", (float)this->lights.size()); */ // Deferred: this->Shader_DeferredLightning->SetFloat("SMAP_DX", 1.0f / (256.0f * pow(2.0f, this->params.ShadowMapSettings / 2.0f))); this->Shader_DeferredLightning->SetFloat("PCF_SIZE", PCF_SIZE); this->Shader_DeferredLightning->SetFloat("PCF_SIZE_SQUARED", PCF_SQUARED); //this->Shader_DeferredLightning->SetFloat("SMAP_DX", 1.0f / 256.0f); this->Shader_DeferredLightning->SetFloat("NrOfLights", (float)this->lights.size()); /* // for deferred quad: this->Shader_DeferredQuad->SetFloat("PCF_SIZE", PCF_SIZE); this->Shader_DeferredQuad->SetFloat("PCF_SIZE_SQUARED", PCF_SQUARED); this->Shader_DeferredQuad->SetFloat("SMAP_DX", 1.0f / (256 * pow(2.0f, this->params.ShadowMapSettings/2))); this->Shader_DeferredQuad->SetFloat("NrOfLights", (float)this->lights.size()); */ }