Refactored shadow framebuffer creation and binding
parent
2ff722eee6
commit
741d5c75ba
|
@ -4015,42 +4015,15 @@ void CEngine::RenderShadowMap()
|
||||||
// If no shadow map texture exists, create it
|
// If no shadow map texture exists, create it
|
||||||
if (m_shadowMap.id == 0)
|
if (m_shadowMap.id == 0)
|
||||||
{
|
{
|
||||||
FramebufferParams params;
|
m_shadowMap = m_device->CreateDepthTexture(
|
||||||
params.width = m_offscreenShadowRenderingResolution;
|
m_offscreenShadowRenderingResolution,
|
||||||
params.height = m_offscreenShadowRenderingResolution;
|
m_offscreenShadowRenderingResolution,
|
||||||
params.depth = 32;
|
32);
|
||||||
params.colorAttachment = FramebufferParams::AttachmentType::None;
|
|
||||||
params.depthAttachment = FramebufferParams::AttachmentType::Texture;
|
|
||||||
|
|
||||||
CFramebuffer* framebuffer = m_device->CreateFramebuffer("shadow", params);
|
GetLogger()->Info("Created shadow map texture: %dx%d, depth %d\n",
|
||||||
if (framebuffer == nullptr)
|
m_shadowMap.size.x, m_shadowMap.size.y, 32);
|
||||||
{
|
|
||||||
GetLogger()->Error("Could not create shadow mapping framebuffer, disabling dynamic shadows\n");
|
|
||||||
m_shadowMapping = false;
|
|
||||||
m_offscreenShadowRendering = false;
|
|
||||||
m_qualityShadows = false;
|
|
||||||
CProfiler::StopPerformanceCounter(PCNT_RENDER_SHADOW_MAP);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
m_shadowMap.id = framebuffer->GetDepthTexture();
|
|
||||||
m_shadowMap.size = { params.width, params.height };
|
|
||||||
|
|
||||||
GetLogger()->Info("Created shadow map texture: %dx%d, depth %d\n", params.width, params.height, params.depth);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// change state to rendering shadow maps
|
|
||||||
m_device->SetColorMask(false, false, false, false);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, true);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, true);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_BLENDING, false);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_LIGHTING, false);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_FOG, false);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
|
||||||
m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true);
|
|
||||||
m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.5f);
|
|
||||||
m_device->SetViewport(0, 0, m_shadowMap.size.x, m_shadowMap.size.y);
|
|
||||||
|
|
||||||
auto renderer = m_device->GetShadowRenderer();
|
auto renderer = m_device->GetShadowRenderer();
|
||||||
renderer->Begin();
|
renderer->Begin();
|
||||||
renderer->SetShadowMap(m_shadowMap);
|
renderer->SetShadowMap(m_shadowMap);
|
||||||
|
@ -4172,9 +4145,6 @@ void CEngine::RenderShadowMap()
|
||||||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
||||||
m_device->SetCullMode(CULL_CW);
|
m_device->SetCullMode(CULL_CW);
|
||||||
|
|
||||||
m_device->GetFramebuffer("default")->Bind();
|
|
||||||
//m_device->GetFramebuffer("shadow")->Unbind();
|
|
||||||
|
|
||||||
// restore default state
|
// restore default state
|
||||||
m_device->SetViewport(0, 0, m_size.x, m_size.y);
|
m_device->SetViewport(0, 0, m_size.x, m_size.y);
|
||||||
|
|
||||||
|
|
|
@ -550,6 +550,13 @@ void CGL33ShadowRenderer::Begin()
|
||||||
|
|
||||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||||
glPolygonOffset(2.0f, 8.0f);
|
glPolygonOffset(2.0f, 8.0f);
|
||||||
|
|
||||||
|
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||||
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
glDepthMask(GL_TRUE);
|
||||||
|
|
||||||
|
glDisable(GL_BLEND);
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGL33ShadowRenderer::End()
|
void CGL33ShadowRenderer::End()
|
||||||
|
@ -560,6 +567,8 @@ void CGL33ShadowRenderer::End()
|
||||||
glDisable(GL_POLYGON_OFFSET_FILL);
|
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||||
glPolygonOffset(0.0f, 0.0f);
|
glPolygonOffset(0.0f, 0.0f);
|
||||||
|
|
||||||
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
|
|
||||||
m_device->Restore();
|
m_device->Restore();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue