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 (m_shadowMap.id == 0)
|
||||
{
|
||||
FramebufferParams params;
|
||||
params.width = m_offscreenShadowRenderingResolution;
|
||||
params.height = m_offscreenShadowRenderingResolution;
|
||||
params.depth = 32;
|
||||
params.colorAttachment = FramebufferParams::AttachmentType::None;
|
||||
params.depthAttachment = FramebufferParams::AttachmentType::Texture;
|
||||
m_shadowMap = m_device->CreateDepthTexture(
|
||||
m_offscreenShadowRenderingResolution,
|
||||
m_offscreenShadowRenderingResolution,
|
||||
32);
|
||||
|
||||
CFramebuffer* framebuffer = m_device->CreateFramebuffer("shadow", params);
|
||||
if (framebuffer == nullptr)
|
||||
{
|
||||
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);
|
||||
GetLogger()->Info("Created shadow map texture: %dx%d, depth %d\n",
|
||||
m_shadowMap.size.x, m_shadowMap.size.y, 32);
|
||||
}
|
||||
|
||||
// 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();
|
||||
renderer->Begin();
|
||||
renderer->SetShadowMap(m_shadowMap);
|
||||
|
@ -4172,9 +4145,6 @@ void CEngine::RenderShadowMap()
|
|||
m_device->SetRenderState(RENDER_STATE_CULLING, false);
|
||||
m_device->SetCullMode(CULL_CW);
|
||||
|
||||
m_device->GetFramebuffer("default")->Bind();
|
||||
//m_device->GetFramebuffer("shadow")->Unbind();
|
||||
|
||||
// restore default state
|
||||
m_device->SetViewport(0, 0, m_size.x, m_size.y);
|
||||
|
||||
|
|
|
@ -550,6 +550,13 @@ void CGL33ShadowRenderer::Begin()
|
|||
|
||||
glEnable(GL_POLYGON_OFFSET_FILL);
|
||||
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()
|
||||
|
@ -560,6 +567,8 @@ void CGL33ShadowRenderer::End()
|
|||
glDisable(GL_POLYGON_OFFSET_FILL);
|
||||
glPolygonOffset(0.0f, 0.0f);
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
|
||||
m_device->Restore();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue