1
0
forked from 0ad/0ad

Renderer simplification: Remove non-FBO shadow mode.

This was SVN commit r9189.
This commit is contained in:
Ykkrosh 2011-04-06 22:08:51 +00:00
parent a1eb830f2c
commit 1866c2d3b7
6 changed files with 29 additions and 98 deletions

View File

@ -32,7 +32,6 @@ CStrW g_CursorName = L"test";
bool g_NoGLS3TC = false;
bool g_NoGLAutoMipmap = false;
bool g_NoGLVBO = false;
bool g_NoGLFramebufferObject = false;
bool g_Shadows = false;
bool g_FancyWater = false;
@ -72,7 +71,6 @@ static void LoadGlobals()
CFG_GET_USER_VAL("nos3tc", Bool, g_NoGLS3TC);
CFG_GET_USER_VAL("noautomipmap", Bool, g_NoGLAutoMipmap);
CFG_GET_USER_VAL("novbo", Bool, g_NoGLVBO);
CFG_GET_USER_VAL("noframebufferobject", Bool, g_NoGLFramebufferObject);
CFG_GET_USER_VAL("shadows", Bool, g_Shadows);
CFG_GET_USER_VAL("fancywater", Bool, g_FancyWater);
CFG_GET_USER_VAL("renderpath", String, g_RenderPath);

View File

@ -39,9 +39,6 @@ extern bool g_NoGLAutoMipmap;
// don't use VBOs. (RC: that was necessary on laptop Radeon cards)
extern bool g_NoGLVBO;
// disable FBO extension in case the driver is flaky
extern bool g_NoGLFramebufferObject;
//-----------------------------------------------------------------------------
// flag to switch on shadows

View File

@ -569,7 +569,6 @@ static void InitRenderer()
// set renderer options from command line options - NOVBO must be set before opening the renderer
g_Renderer.SetOptionBool(CRenderer::OPT_NOVBO,g_NoGLVBO);
g_Renderer.SetOptionBool(CRenderer::OPT_NOFRAMEBUFFEROBJECT,g_NoGLFramebufferObject);
g_Renderer.SetOptionBool(CRenderer::OPT_SHADOWS,g_Shadows);
g_Renderer.SetOptionBool(CRenderer::OPT_FANCYWATER,g_FancyWater);
g_Renderer.SetRenderPath(CRenderer::GetRenderPathByName(g_RenderPath));

View File

@ -406,7 +406,6 @@ CRenderer::CRenderer()
m_SkipSubmit = false;
m_Options.m_NoVBO = false;
m_Options.m_NoFramebufferObject = false;
m_Options.m_RenderPath = RP_DEFAULT;
m_Options.m_FancyWater = false;
m_Options.m_Shadows = false;
@ -470,8 +469,6 @@ void CRenderer::EnumCaps()
m_Caps.m_VertexShader = false;
m_Caps.m_FragmentShader = false;
m_Caps.m_Shadows = false;
m_Caps.m_DepthTextureShadows = false;
m_Caps.m_FramebufferObject = false;
// now start querying extensions
if (!m_Options.m_NoVBO) {
@ -495,28 +492,10 @@ void CRenderer::EnumCaps()
m_Caps.m_FragmentShader = true;
}
if (ogl_max_tex_units >= 3)
if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", "GL_EXT_framebuffer_object", NULL))
{
// To render shadows plus fog-of-war in a single lighting pass (see
// TerrainRenderer.cpp) we need >= 3 TMUs. Only really ancient hardware
// doesn't support that, so instead of implementing a compatible fallback
// we'll just disable shadows entirely unless there's enough TMUs.
m_Caps.m_Shadows = true;
}
if (0 == ogl_HaveExtensions(0, "GL_ARB_shadow", "GL_ARB_depth_texture", NULL)) {
// According to Delphi3d.net, all relevant graphics chips that support depth textures
// (i.e. Geforce3+, Radeon9500+, even i915) also have >= 4 TMUs, so this restriction
// isn't actually a restriction, and it helps with integrating depth texture
// shadows into rendering paths.
if (ogl_max_tex_units >= 4)
m_Caps.m_DepthTextureShadows = true;
}
if (!m_Options.m_NoFramebufferObject)
{
if (ogl_HaveExtension("GL_EXT_framebuffer_object"))
m_Caps.m_FramebufferObject = true;
m_Caps.m_Shadows = true;
}
}
@ -670,9 +649,6 @@ void CRenderer::SetOptionBool(enum Option opt,bool value)
case OPT_NOVBO:
m_Options.m_NoVBO=value;
break;
case OPT_NOFRAMEBUFFEROBJECT:
m_Options.m_NoFramebufferObject=value;
break;
case OPT_SHADOWS:
m_Options.m_Shadows=value;
ReloadShaders();
@ -693,8 +669,6 @@ bool CRenderer::GetOptionBool(enum Option opt) const
switch (opt) {
case OPT_NOVBO:
return m_Options.m_NoVBO;
case OPT_NOFRAMEBUFFEROBJECT:
return m_Options.m_NoFramebufferObject;
case OPT_SHADOWS:
return m_Options.m_Shadows;
case OPT_FANCYWATER:

View File

@ -80,7 +80,6 @@ public:
enum { NumAlphaMaps=14 };
enum Option {
OPT_NOVBO,
OPT_NOFRAMEBUFFEROBJECT,
OPT_SHADOWS,
OPT_FANCYWATER,
OPT_LODBIAS
@ -126,7 +125,6 @@ public:
// renderer options
struct Options {
bool m_NoVBO;
bool m_NoFramebufferObject;
bool m_Shadows;
bool m_FancyWater;
float m_LodBias;
@ -142,8 +140,6 @@ public:
bool m_VertexShader;
bool m_FragmentShader;
bool m_Shadows;
bool m_DepthTextureShadows;
bool m_FramebufferObject;
};
public:

View File

@ -46,8 +46,7 @@ struct ShadowMapInternals
{
// bit depth for the depth texture
int DepthTextureBits;
// if non-zero, we're using EXT_framebuffer_object for shadow rendering,
// and this is the framebuffer
// the EXT_framebuffer_object framebuffer
GLuint Framebuffer;
// handle of shadow map
GLuint Texture;
@ -299,13 +298,7 @@ void ShadowMapInternals::CreateTexture()
Framebuffer = 0;
}
// Prepare FBO if available
// Note: luminance is not an RGB format, so a luminance texture cannot be used
// as a color buffer
if (g_Renderer.GetCapabilities().m_FramebufferObject)
{
pglGenFramebuffersEXT(1, &Framebuffer);
}
pglGenFramebuffersEXT(1, &Framebuffer);
if (g_Renderer.m_ShadowMapSize != 0)
{
@ -322,18 +315,9 @@ void ShadowMapInternals::CreateTexture()
Width = std::min(Width, (int)ogl_max_tex_size);
Height = std::min(Height, (int)ogl_max_tex_size);
// If we're using a framebuffer object, the whole texture is available; otherwise
// we're limited to the part of the screen buffer that is actually visible
if (Framebuffer)
{
EffectiveWidth = Width;
EffectiveHeight = Height;
}
else
{
EffectiveWidth = std::min(Width, g_Renderer.GetWidth());
EffectiveHeight = std::min(Height, g_Renderer.GetHeight());
}
// Since we're using a framebuffer object, the whole texture is available
EffectiveWidth = Width;
EffectiveHeight = Height;
const char* formatname;
@ -345,8 +329,8 @@ void ShadowMapInternals::CreateTexture()
default: formatname = "DEPTH_COMPONENT"; break;
}
LOGMESSAGE(L"Creating shadow texture (size %dx%d) (format = %hs)%ls",
Width, Height, formatname, Framebuffer ? L" (using EXT_framebuffer_object)" : L"");
LOGMESSAGE(L"Creating shadow texture (size %dx%d) (format = %hs)",
Width, Height, formatname);
if (g_Renderer.m_Options.m_ShadowAlphaFix)
@ -386,37 +370,32 @@ void ShadowMapInternals::CreateTexture()
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// bind to framebuffer object
if (Framebuffer)
glBindTexture(GL_TEXTURE_2D, 0);
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer);
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0);
if (g_Renderer.m_Options.m_ShadowAlphaFix)
{
glBindTexture(GL_TEXTURE_2D, 0);
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, Framebuffer);
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0);
}
else
{
glDrawBuffer(GL_NONE);
}
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, Texture, 0);
glReadBuffer(GL_NONE);
if (g_Renderer.m_Options.m_ShadowAlphaFix)
{
pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, DummyTexture, 0);
}
else
{
glDrawBuffer(GL_NONE);
}
GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
glReadBuffer(GL_NONE);
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
LOGWARNING(L"Framebuffer object incomplete: %04d", status);
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
{
LOGWARNING(L"Framebuffer object incomplete: %04d", status);
pglDeleteFramebuffersEXT(1, &Framebuffer);
Framebuffer = 0;
EffectiveWidth = std::min(Width, g_Renderer.GetWidth());
EffectiveHeight = std::min(Height, g_Renderer.GetHeight());
}
// Disable shadow rendering (but let the user try again if they want)
g_Renderer.m_Options.m_Shadows = false;
}
}
@ -430,7 +409,6 @@ void ShadowMap::BeginRender()
// Calc remaining shadow matrices
m->CalcShadowMatrices();
if (m->Framebuffer)
{
PROFILE("bind framebuffer");
glBindTexture(GL_TEXTURE_2D, 0);
@ -466,21 +444,10 @@ void ShadowMap::EndRender()
{
glDisable(GL_SCISSOR_TEST);
// copy result into shadow map texture
if (m->Framebuffer)
{
PROFILE("unbind framebuffer");
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
else
{
if (!g_Renderer.GetDisableCopyShadow())
{
PROFILE("copy shadow texture");
g_Renderer.BindTexture(0, m->Texture);
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, m->EffectiveWidth, m->EffectiveHeight);
}
}
glViewport(0, 0, g_Renderer.GetWidth(), g_Renderer.GetHeight());