Don't create a color renderbuffer for shadow map
When rendering the shadow map offscreen using framebuffer objects, it's not necessary to create a color renderbuffer. Currently FramebufferParams only lets you choose between a renderbuffer and a texture for both color and depth attachments. This changes that, and now you can ask for a texture, a renderbuffer, or nothing. This improves performance. On my computer, with an 8192x8192 shadow map, this improves overall frame time by 8.0%.1008-fix
parent
94a18e9648
commit
c027b54add
|
@ -41,10 +41,15 @@ struct FramebufferParams
|
||||||
int depth = 16;
|
int depth = 16;
|
||||||
//! Requested number of samples for multisampling
|
//! Requested number of samples for multisampling
|
||||||
int samples = 1;
|
int samples = 1;
|
||||||
//! true requests color texture
|
|
||||||
bool colorTexture = false;
|
enum class AttachmentType
|
||||||
//! true requests depth texture
|
{
|
||||||
bool depthTexture = false;
|
Texture,
|
||||||
|
Renderbuffer,
|
||||||
|
None,
|
||||||
|
};
|
||||||
|
AttachmentType colorAttachment = AttachmentType::Renderbuffer;
|
||||||
|
AttachmentType depthAttachment = AttachmentType::Renderbuffer;
|
||||||
|
|
||||||
//! Loads default values
|
//! Loads default values
|
||||||
void LoadDefault()
|
void LoadDefault()
|
||||||
|
|
|
@ -3786,7 +3786,8 @@ void CEngine::RenderShadowMap()
|
||||||
FramebufferParams params;
|
FramebufferParams params;
|
||||||
params.width = params.height = width;
|
params.width = params.height = width;
|
||||||
params.depth = depth = 32;
|
params.depth = depth = 32;
|
||||||
params.depthTexture = true;
|
params.colorAttachment = FramebufferParams::AttachmentType::None;
|
||||||
|
params.depthAttachment = FramebufferParams::AttachmentType::Texture;
|
||||||
|
|
||||||
CFramebuffer *framebuffer = m_device->CreateFramebuffer("shadow", params);
|
CFramebuffer *framebuffer = m_device->CreateFramebuffer("shadow", params);
|
||||||
if (framebuffer == nullptr)
|
if (framebuffer == nullptr)
|
||||||
|
|
|
@ -55,7 +55,7 @@ bool CGLFramebuffer::Create()
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
|
||||||
|
|
||||||
// create color texture
|
// create color texture
|
||||||
if (m_params.colorTexture)
|
if (m_params.colorAttachment == FramebufferParams::AttachmentType::Texture)
|
||||||
{
|
{
|
||||||
GLint previous;
|
GLint previous;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
||||||
|
@ -76,7 +76,7 @@ bool CGLFramebuffer::Create()
|
||||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0);
|
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0);
|
||||||
}
|
}
|
||||||
// create color renderbuffer
|
// create color renderbuffer
|
||||||
else
|
else if (m_params.colorAttachment == FramebufferParams::AttachmentType::Renderbuffer)
|
||||||
{
|
{
|
||||||
glGenRenderbuffers(1, &m_colorRenderbuffer);
|
glGenRenderbuffers(1, &m_colorRenderbuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer);
|
||||||
|
@ -92,6 +92,10 @@ bool CGLFramebuffer::Create()
|
||||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
glFramebufferRenderbuffer(GL_FRAMEBUFFER,
|
||||||
GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer);
|
GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDrawBuffer(GL_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
GLuint depthFormat = 0;
|
GLuint depthFormat = 0;
|
||||||
|
|
||||||
|
@ -104,7 +108,7 @@ bool CGLFramebuffer::Create()
|
||||||
}
|
}
|
||||||
|
|
||||||
// create depth texture
|
// create depth texture
|
||||||
if (m_params.depthTexture)
|
if (m_params.depthAttachment == FramebufferParams::AttachmentType::Texture)
|
||||||
{
|
{
|
||||||
GLint previous;
|
GLint previous;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
||||||
|
@ -132,7 +136,7 @@ bool CGLFramebuffer::Create()
|
||||||
GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
|
GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||||
}
|
}
|
||||||
// create depth renderbuffer
|
// create depth renderbuffer
|
||||||
else
|
else if (m_params.depthAttachment == FramebufferParams::AttachmentType::Renderbuffer)
|
||||||
{
|
{
|
||||||
glGenRenderbuffers(1, &m_depthRenderbuffer);
|
glGenRenderbuffers(1, &m_depthRenderbuffer);
|
||||||
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer);
|
||||||
|
@ -323,7 +327,7 @@ bool CGLFramebufferEXT::Create()
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_fbo);
|
||||||
|
|
||||||
// create color texture
|
// create color texture
|
||||||
if (m_params.colorTexture)
|
if (m_params.colorAttachment == FramebufferParams::AttachmentType::Texture)
|
||||||
{
|
{
|
||||||
GLint previous;
|
GLint previous;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
||||||
|
@ -346,7 +350,7 @@ bool CGLFramebufferEXT::Create()
|
||||||
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0);
|
GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0);
|
||||||
}
|
}
|
||||||
// create color renderbuffer
|
// create color renderbuffer
|
||||||
else
|
else if (m_params.colorAttachment == FramebufferParams::AttachmentType::Renderbuffer)
|
||||||
{
|
{
|
||||||
glGenRenderbuffersEXT(1, &m_colorRenderbuffer);
|
glGenRenderbuffersEXT(1, &m_colorRenderbuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
||||||
|
@ -363,6 +367,10 @@ bool CGLFramebufferEXT::Create()
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,
|
||||||
GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glDrawBuffer(GL_NONE);
|
||||||
|
}
|
||||||
|
|
||||||
GLuint depthFormat = 0;
|
GLuint depthFormat = 0;
|
||||||
|
|
||||||
|
@ -375,7 +383,7 @@ bool CGLFramebufferEXT::Create()
|
||||||
}
|
}
|
||||||
|
|
||||||
// create depth texture
|
// create depth texture
|
||||||
if (m_params.depthTexture)
|
if (m_params.depthAttachment == FramebufferParams::AttachmentType::Texture)
|
||||||
{
|
{
|
||||||
GLint previous;
|
GLint previous;
|
||||||
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
glGetIntegerv(GL_TEXTURE_BINDING_2D, &previous);
|
||||||
|
@ -403,7 +411,7 @@ bool CGLFramebufferEXT::Create()
|
||||||
GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0);
|
GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0);
|
||||||
}
|
}
|
||||||
// create depth renderbuffer
|
// create depth renderbuffer
|
||||||
else
|
else if (m_params.depthAttachment == FramebufferParams::AttachmentType::Renderbuffer)
|
||||||
{
|
{
|
||||||
glGenRenderbuffersEXT(1, &m_depthRenderbuffer);
|
glGenRenderbuffersEXT(1, &m_depthRenderbuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthRenderbuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthRenderbuffer);
|
||||||
|
|
Loading…
Reference in New Issue