Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/ShadowMap.cpp
Show First 20 Lines • Show All 504 Lines • ▼ Show 20 Lines | void ShadowMapInternals::CreateTexture() | ||||
// Since we're using a framebuffer object, the whole texture is available | // Since we're using a framebuffer object, the whole texture is available | ||||
EffectiveWidth = Width; | EffectiveWidth = Width; | ||||
EffectiveHeight = Height; | EffectiveHeight = Height; | ||||
const char* formatName; | const char* formatName; | ||||
Renderer::Backend::Format backendFormat = Renderer::Backend::Format::UNDEFINED; | Renderer::Backend::Format backendFormat = Renderer::Backend::Format::UNDEFINED; | ||||
#if CONFIG2_GLES | #if CONFIG2_GLES | ||||
formatName = "DEPTH_COMPONENT"; | formatName = "Format::D24"; | ||||
backendFormat = Renderer::Backend::Format::D24; | backendFormat = Renderer::Backend::Format::D24; | ||||
#else | #else | ||||
switch (DepthTextureBits) | switch (DepthTextureBits) | ||||
{ | { | ||||
case 16: formatName = "Format::D16"; backendFormat = Renderer::Backend::Format::D16; break; | case 16: formatName = "Format::D16"; backendFormat = Renderer::Backend::Format::D16; break; | ||||
case 24: formatName = "Format::D24"; backendFormat = Renderer::Backend::Format::D24; break; | case 24: formatName = "Format::D24"; backendFormat = Renderer::Backend::Format::D24; break; | ||||
case 32: formatName = "Format::D32"; backendFormat = Renderer::Backend::Format::D32; break; | case 32: formatName = "Format::D32"; backendFormat = Renderer::Backend::Format::D32; break; | ||||
default: formatName = "Format::D24"; backendFormat = Renderer::Backend::Format::D24; break; | default: formatName = "Format::D24"; backendFormat = Renderer::Backend::Format::D24; break; | ||||
Show All 29 Lines | #endif | ||||
samplerDesc.compareEnabled = true; | samplerDesc.compareEnabled = true; | ||||
samplerDesc.compareOp = Renderer::Backend::CompareOp::LESS_OR_EQUAL; | samplerDesc.compareOp = Renderer::Backend::CompareOp::LESS_OR_EQUAL; | ||||
Texture = backendDevice->CreateTexture2D("ShadowMapDepth", | Texture = backendDevice->CreateTexture2D("ShadowMapDepth", | ||||
Renderer::Backend::ITexture::Usage::SAMPLED | | Renderer::Backend::ITexture::Usage::SAMPLED | | ||||
Renderer::Backend::ITexture::Usage::DEPTH_STENCIL_ATTACHMENT, | Renderer::Backend::ITexture::Usage::DEPTH_STENCIL_ATTACHMENT, | ||||
backendFormat, Width, Height, samplerDesc); | backendFormat, Width, Height, samplerDesc); | ||||
const bool useDummyTexture = g_RenderingOptions.GetShadowAlphaFix(); | |||||
Framebuffer = backendDevice->CreateFramebuffer("ShadowMapFramebuffer", | Framebuffer = backendDevice->CreateFramebuffer("ShadowMapFramebuffer", | ||||
g_RenderingOptions.GetShadowAlphaFix() ? DummyTexture.get() : nullptr, Texture.get()); | useDummyTexture ? DummyTexture.get() : nullptr, | ||||
// In case we used m_ShadowAlphaFix, we ought to clear the unused | |||||
// color buffer too, else Mali 400 drivers get confused. | |||||
// Might as well clear stencil too for completeness. | |||||
useDummyTexture | |||||
? Renderer::Backend::AttachmentLoadOp::CLEAR | |||||
: Renderer::Backend::AttachmentLoadOp::DONT_CARE, | |||||
Renderer::Backend::AttachmentStoreOp::DONT_CARE, | |||||
CColor(0.0f, 0.0f, 0.0f, 0.0f), Texture.get(), | |||||
Renderer::Backend::AttachmentLoadOp::DONT_CARE, | |||||
Renderer::Backend::AttachmentStoreOp::STORE); | |||||
if (!Framebuffer) | if (!Framebuffer) | ||||
{ | { | ||||
LOGERROR("Failed to create shadows framebuffer"); | LOGERROR("Failed to create shadows framebuffer"); | ||||
// Disable shadow rendering (but let the user try again if they want). | // Disable shadow rendering (but let the user try again if they want). | ||||
g_RenderingOptions.SetShadows(false); | g_RenderingOptions.SetShadows(false); | ||||
} | } | ||||
} | } | ||||
void ShadowMap::BeginRender( | void ShadowMap::BeginRender( | ||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext) | Renderer::Backend::IDeviceCommandContext* deviceCommandContext) | ||||
{ | { | ||||
deviceCommandContext->SetGraphicsPipelineState( | deviceCommandContext->SetGraphicsPipelineState( | ||||
Renderer::Backend::MakeDefaultGraphicsPipelineStateDesc()); | Renderer::Backend::MakeDefaultGraphicsPipelineStateDesc()); | ||||
{ | |||||
PROFILE("bind framebuffer"); | |||||
ENSURE(m->Framebuffer); | ENSURE(m->Framebuffer); | ||||
deviceCommandContext->BeginFramebufferPass(m->Framebuffer.get()); | deviceCommandContext->BeginFramebufferPass(m->Framebuffer.get()); | ||||
} | |||||
// clear buffers | |||||
{ | |||||
PROFILE("clear depth texture"); | |||||
// In case we used m_ShadowAlphaFix, we ought to clear the unused | |||||
// color buffer too, else Mali 400 drivers get confused. | |||||
// Might as well clear stencil too for completeness. | |||||
deviceCommandContext->ClearFramebuffer(); | |||||
} | |||||
m->SavedViewCamera = g_Renderer.GetSceneRenderer().GetViewCamera(); | m->SavedViewCamera = g_Renderer.GetSceneRenderer().GetViewCamera(); | ||||
} | } | ||||
void ShadowMap::PrepareCamera( | void ShadowMap::PrepareCamera( | ||||
Renderer::Backend::IDeviceCommandContext* deviceCommandContext, const int cascade) | Renderer::Backend::IDeviceCommandContext* deviceCommandContext, const int cascade) | ||||
{ | { | ||||
m->CalculateShadowMatrices(cascade); | m->CalculateShadowMatrices(cascade); | ||||
▲ Show 20 Lines • Show All 132 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator