Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/ShadowMap.cpp
Show First 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | |||||
ShadowMap::~ShadowMap() | ShadowMap::~ShadowMap() | ||||
{ | { | ||||
if (m->Texture) | if (m->Texture) | ||||
glDeleteTextures(1, &m->Texture); | glDeleteTextures(1, &m->Texture); | ||||
if (m->DummyTexture) | if (m->DummyTexture) | ||||
glDeleteTextures(1, &m->DummyTexture); | glDeleteTextures(1, &m->DummyTexture); | ||||
if (m->Framebuffer) | if (m->Framebuffer) | ||||
pglDeleteFramebuffersEXT(1, &m->Framebuffer); | glDeleteFramebuffersEXT(1, &m->Framebuffer); | ||||
delete m; | delete m; | ||||
} | } | ||||
/////////////////////////////////////////////////////////////////////////////////////////////////// | /////////////////////////////////////////////////////////////////////////////////////////////////// | ||||
// Force the texture/buffer/etc to be recreated, particularly when the renderer's | // Force the texture/buffer/etc to be recreated, particularly when the renderer's | ||||
// size has changed | // size has changed | ||||
void ShadowMap::RecreateTexture() | void ShadowMap::RecreateTexture() | ||||
{ | { | ||||
if (m->Texture) | if (m->Texture) | ||||
glDeleteTextures(1, &m->Texture); | glDeleteTextures(1, &m->Texture); | ||||
if (m->DummyTexture) | if (m->DummyTexture) | ||||
glDeleteTextures(1, &m->DummyTexture); | glDeleteTextures(1, &m->DummyTexture); | ||||
if (m->Framebuffer) | if (m->Framebuffer) | ||||
pglDeleteFramebuffersEXT(1, &m->Framebuffer); | glDeleteFramebuffersEXT(1, &m->Framebuffer); | ||||
m->Texture = 0; | m->Texture = 0; | ||||
m->DummyTexture = 0; | m->DummyTexture = 0; | ||||
m->Framebuffer = 0; | m->Framebuffer = 0; | ||||
// (Texture will be constructed in next SetupFrame) | // (Texture will be constructed in next SetupFrame) | ||||
} | } | ||||
▲ Show 20 Lines • Show All 209 Lines • ▼ Show 20 Lines | void ShadowMapInternals::CreateTexture() | ||||
} | } | ||||
if (DummyTexture) | if (DummyTexture) | ||||
{ | { | ||||
glDeleteTextures(1, &DummyTexture); | glDeleteTextures(1, &DummyTexture); | ||||
DummyTexture = 0; | DummyTexture = 0; | ||||
} | } | ||||
if (Framebuffer) | if (Framebuffer) | ||||
{ | { | ||||
pglDeleteFramebuffersEXT(1, &Framebuffer); | glDeleteFramebuffersEXT(1, &Framebuffer); | ||||
Framebuffer = 0; | Framebuffer = 0; | ||||
} | } | ||||
// save the caller's FBO | // save the caller's FBO | ||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &SavedViewFBO); | glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &SavedViewFBO); | ||||
pglGenFramebuffersEXT(1, &Framebuffer); | glGenFramebuffersEXT(1, &Framebuffer); | ||||
if (g_Renderer.m_ShadowMapSize != 0) | if (g_Renderer.m_ShadowMapSize != 0) | ||||
{ | { | ||||
// non-default option to override the size | // non-default option to override the size | ||||
Width = Height = g_Renderer.m_ShadowMapSize; | Width = Height = g_Renderer.m_ShadowMapSize; | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | #else | ||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | ||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | ||||
#endif | #endif | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// bind to framebuffer object | // bind to framebuffer object | ||||
glBindTexture(GL_TEXTURE_2D, 0); | glBindTexture(GL_TEXTURE_2D, 0); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer); | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0); | ||||
if (g_Renderer.m_Options.m_ShadowAlphaFix) | if (g_Renderer.m_Options.m_ShadowAlphaFix) | ||||
{ | { | ||||
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0); | glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0); | ||||
} | } | ||||
else | else | ||||
{ | { | ||||
#if CONFIG2_GLES | #if CONFIG2_GLES | ||||
#warning TODO: figure out whether the glDrawBuffer/glReadBuffer stuff is needed, since it is not supported by GLES | #warning TODO: figure out whether the glDrawBuffer/glReadBuffer stuff is needed, since it is not supported by GLES | ||||
#else | #else | ||||
glDrawBuffer(GL_NONE); | glDrawBuffer(GL_NONE); | ||||
#endif | #endif | ||||
} | } | ||||
#if !CONFIG2_GLES | #if !CONFIG2_GLES | ||||
glReadBuffer(GL_NONE); | glReadBuffer(GL_NONE); | ||||
#endif | #endif | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, SavedViewFBO); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, SavedViewFBO); | ||||
if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | if (status != GL_FRAMEBUFFER_COMPLETE_EXT) | ||||
{ | { | ||||
LOGWARNING("Framebuffer object incomplete: 0x%04X", status); | LOGWARNING("Framebuffer object incomplete: 0x%04X", status); | ||||
// 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_Renderer.m_Options.m_Shadows = false; | g_Renderer.m_Options.m_Shadows = false; | ||||
} | } | ||||
Show All 10 Lines | void ShadowMap::BeginRender() | ||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &m->SavedViewFBO); | glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &m->SavedViewFBO); | ||||
// Calc remaining shadow matrices | // Calc remaining shadow matrices | ||||
m->CalcShadowMatrices(); | m->CalcShadowMatrices(); | ||||
{ | { | ||||
PROFILE("bind framebuffer"); | PROFILE("bind framebuffer"); | ||||
glBindTexture(GL_TEXTURE_2D, 0); | glBindTexture(GL_TEXTURE_2D, 0); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m->Framebuffer); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m->Framebuffer); | ||||
} | } | ||||
// clear buffers | // clear buffers | ||||
{ | { | ||||
PROFILE("clear depth texture"); | PROFILE("clear depth texture"); | ||||
// In case we used m_ShadowAlphaFix, we ought to clear the unused | // In case we used m_ShadowAlphaFix, we ought to clear the unused | ||||
// color buffer too, else Mali 400 drivers get confused. | // color buffer too, else Mali 400 drivers get confused. | ||||
// Might as well clear stencil too for completeness. | // Might as well clear stencil too for completeness. | ||||
Show All 29 Lines | |||||
void ShadowMap::EndRender() | void ShadowMap::EndRender() | ||||
{ | { | ||||
glDisable(GL_SCISSOR_TEST); | glDisable(GL_SCISSOR_TEST); | ||||
g_Renderer.SetViewCamera(m->SavedViewCamera); | g_Renderer.SetViewCamera(m->SavedViewCamera); | ||||
{ | { | ||||
PROFILE("unbind framebuffer"); | PROFILE("unbind framebuffer"); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m->SavedViewFBO); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m->SavedViewFBO); | ||||
} | } | ||||
const SViewPort vp = { 0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight() }; | const SViewPort vp = { 0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight() }; | ||||
g_Renderer.SetViewport(vp); | g_Renderer.SetViewport(vp); | ||||
glColorMask(1,1,1,1); | glColorMask(1,1,1,1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 185 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator