Changeset View
Standalone View
source/renderer/Renderer.cpp
Context not available. | |||||
m_Options.m_ShadowAlphaFix = true; | m_Options.m_ShadowAlphaFix = true; | ||||
m_Options.m_ARBProgramShadow = true; | m_Options.m_ARBProgramShadow = true; | ||||
m_Options.m_ShadowPCF = false; | m_Options.m_ShadowPCF = false; | ||||
m_Options.m_ShadowPCSS = false; | |||||
m_Options.m_Particles = false; | m_Options.m_Particles = false; | ||||
m_Options.m_Silhouettes = false; | m_Options.m_Silhouettes = false; | ||||
m_Options.m_PreferGLSL = false; | m_Options.m_PreferGLSL = false; | ||||
Context not available. | |||||
m->globalContext.Add(str_USE_SHADOW, str_1); | m->globalContext.Add(str_USE_SHADOW, str_1); | ||||
if (m_Caps.m_ARBProgramShadow && m_Options.m_ARBProgramShadow) | if (m_Caps.m_ARBProgramShadow && m_Options.m_ARBProgramShadow) | ||||
m->globalContext.Add(str_USE_FP_SHADOW, str_1); | m->globalContext.Add(str_USE_FP_SHADOW, str_1); | ||||
if (m_Options.m_ShadowPCF) | if (m_Options.m_ShadowPCF && !m_Options.m_ShadowPCSS) | ||||
StanUnsubmitted Not Done Inline ActionsStan: ```lang=cpp
if (m_Options.m_ShadowPCF)
{
m->globalContext.Add(!m_Options.m_ShadowPCSS ? | |||||
m->globalContext.Add(str_USE_SHADOW_PCF, str_1); | m->globalContext.Add(str_USE_SHADOW_PCF, str_1); | ||||
if (m_Options.m_ShadowPCF && m_Options.m_ShadowPCSS) | |||||
m->globalContext.Add(str_USE_SHADOW_PCSS, str_1); | |||||
#if !CONFIG2_GLES | #if !CONFIG2_GLES | ||||
m->globalContext.Add(str_USE_SHADOW_SAMPLER, str_1); | m->globalContext.Add(str_USE_SHADOW_SAMPLER, str_1); | ||||
#endif | #endif | ||||
Context not available. | |||||
if (m_Options.m_Postproc) | if (m_Options.m_Postproc) | ||||
m->postprocManager.Initialize(); | m->postprocManager.Initialize(); | ||||
m->shadow.RecreateTexture(); | |||||
return true; | return true; | ||||
} | } | ||||
Context not available. | |||||
// resize renderer view | // resize renderer view | ||||
void CRenderer::Resize(int width, int height) | void CRenderer::Resize(int width, int height) | ||||
{ | { | ||||
m_Width = width; | |||||
m_Height = height; | |||||
Not Done Inline ActionsAny reason this was moved ? Stan: Any reason this was moved ? | |||||
// need to recreate the shadow map object to resize the shadow texture | // need to recreate the shadow map object to resize the shadow texture | ||||
Not Done Inline ActionsCaps Stan: Caps | |||||
m->shadow.RecreateTexture(); | m->shadow.RecreateTexture(); | ||||
m_Width = width; | |||||
m_Height = height; | |||||
m->postprocManager.Resize(); | m->postprocManager.Resize(); | ||||
m_WaterManager->Resize(); | m_WaterManager->Resize(); | ||||
Context not available. | |||||
case OPT_SHADOWPCF: | case OPT_SHADOWPCF: | ||||
m_Options.m_ShadowPCF = value; | m_Options.m_ShadowPCF = value; | ||||
MakeShadersDirty(); | MakeShadersDirty(); | ||||
if (m_Options.m_ShadowPCSS) m->shadow.RecreateTexture(); | |||||
Done Inline ActionsNext line wraitii: Next line | |||||
Not Done Inline Actions@wraitii @vladislavbelov In the coding conventions should switch case with multiple statements have brackets ? We seem to do that consistently on message handling code. Stan: @wraitii @vladislavbelov In the coding conventions should switch case with multiple… | |||||
break; | break; | ||||
case OPT_SHADOWPCSS: | |||||
m_Options.m_ShadowPCSS = value; | |||||
MakeShadersDirty(); | |||||
m->shadow.RecreateTexture(); | |||||
break; | |||||
case OPT_PARTICLES: | case OPT_PARTICLES: | ||||
m_Options.m_Particles = value; | m_Options.m_Particles = value; | ||||
break; | break; | ||||
Context not available. | |||||
break; | break; | ||||
case OPT_POSTPROC: | case OPT_POSTPROC: | ||||
m_Options.m_Postproc = value; | m_Options.m_Postproc = value; | ||||
m->postprocManager.Resize(); | |||||
break; | break; | ||||
case OPT_DOF: | |||||
m_Options.m_DOF = value; | |||||
m->postprocManager.RefreshShaders(); | |||||
Done Inline ActionsWhy not MakeShadersDirty? vladislavbelov: Why not `MakeShadersDirty`? | |||||
Done Inline ActionsFair enough. aeonios: Fair enough. | |||||
break; | |||||
case OPT_DISPLAYFRUSTUM: | case OPT_DISPLAYFRUSTUM: | ||||
m_Options.m_DisplayFrustum = value; | m_Options.m_DisplayFrustum = value; | ||||
break; | break; | ||||
Context not available. | |||||
return m_Options.m_WaterShadows; | return m_Options.m_WaterShadows; | ||||
case OPT_SHADOWPCF: | case OPT_SHADOWPCF: | ||||
return m_Options.m_ShadowPCF; | return m_Options.m_ShadowPCF; | ||||
case OPT_SHADOWPCSS: | |||||
return m_Options.m_ShadowPCSS; | |||||
case OPT_PARTICLES: | case OPT_PARTICLES: | ||||
return m_Options.m_Particles; | return m_Options.m_Particles; | ||||
case OPT_PREFERGLSL: | case OPT_PREFERGLSL: | ||||
Context not available. | |||||
return m_Options.m_SmoothLOS; | return m_Options.m_SmoothLOS; | ||||
case OPT_POSTPROC: | case OPT_POSTPROC: | ||||
return m_Options.m_Postproc; | return m_Options.m_Postproc; | ||||
case OPT_DOF: | |||||
return m_Options.m_DOF; | |||||
case OPT_DISPLAYFRUSTUM: | case OPT_DISPLAYFRUSTUM: | ||||
return m_Options.m_DisplayFrustum; | return m_Options.m_DisplayFrustum; | ||||
default: | default: | ||||
Context not available. | |||||
else | else | ||||
{ | { | ||||
// Render terrain and models | // Render terrain and models | ||||
RenderModels(context, CULL_REFLECTIONS); | |||||
Done Inline ActionsWhat's the reason for reordering here (and below)? wraitii: What's the reason for reordering here (and below)? | |||||
Done Inline ActionsImproving early-z rejection. Doing so reduces the number of fragments generated and thus the number of wasted shadow samples. aeonios: Improving early-z rejection. Doing so reduces the number of fragments generated and thus the… | |||||
ogl_WarnIfError(); | |||||
RenderPatches(context, CULL_REFLECTIONS); | RenderPatches(context, CULL_REFLECTIONS); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
RenderModels(context, CULL_REFLECTIONS); | |||||
ogl_WarnIfError(); | |||||
RenderTransparentModels(context, CULL_REFLECTIONS, TRANSPARENT, true); | RenderTransparentModels(context, CULL_REFLECTIONS, TRANSPARENT, true); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
} | } | ||||
Context not available. | |||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
// Render terrain and models | // Render terrain and models | ||||
RenderPatches(context, CULL_REFRACTIONS); | |||||
ogl_WarnIfError(); | |||||
RenderModels(context, CULL_REFRACTIONS); | RenderModels(context, CULL_REFRACTIONS); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
RenderTransparentModels(context, CULL_REFRACTIONS, TRANSPARENT_OPAQUE, false); | RenderTransparentModels(context, CULL_REFRACTIONS, TRANSPARENT_OPAQUE, false); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
RenderPatches(context, CULL_REFRACTIONS); | |||||
Done Inline ActionsIt's not good to render after transparent models. vladislavbelov: It's not good to render after transparent models. | |||||
Done Inline ActionsAh crap, this was leftovers from some other experiments I was doing. Needs to be reverted. aeonios: Ah crap, this was leftovers from some other experiments I was doing. Needs to be reverted. | |||||
ogl_WarnIfError(); | |||||
glDisable(GL_SCISSOR_TEST); | glDisable(GL_SCISSOR_TEST); | ||||
Context not available. | |||||
} | } | ||||
} | } | ||||
// Render submitted terrain patches and models | |||||
RenderModels(context, cullGroup); | |||||
Done Inline ActionsIt looks a performance hit too. vladislavbelov: It looks a performance hit too. | |||||
Done Inline ActionsActually no, because opaque models will add to the depth buffer, which will later trigger early z rejection for the terrain drawn under it, reducing fragment load and improving performance. Rendering terrain before the skybox is a similar optimization. Sadly very few models actually use full opacity rendering, afaik only gaia critters do pretty much. I did this to try to reduce unnecessary shadow samples, which is important for making PCSS usable. aeonios: Actually no, because opaque models will add to the depth buffer, which will later trigger early… | |||||
ogl_WarnIfError(); | |||||
RenderPatches(context, cullGroup); | |||||
ogl_WarnIfError(); | |||||
if (m_Options.m_ShowSky) | if (m_Options.m_ShowSky) | ||||
{ | { | ||||
m->skyManager.RenderSky(); | m->skyManager.RenderSky(); | ||||
} | } | ||||
// render submitted patches and models | // Render the occluding parts of alpha-blended objects. | ||||
RenderPatches(context, cullGroup); | RenderTransparentModels(context, cullGroup, TRANSPARENT_OPAQUE, false); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// render debug-related terrain overlays | // Render debug-related terrain overlays | ||||
ITerrainOverlay::RenderOverlaysBeforeWater(); | ITerrainOverlay::RenderOverlaysBeforeWater(); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// render other debug-related overlays before water (so they can be seen when underwater) | // Render other debug-related overlays before water (so they can be seen when underwater) | ||||
m->overlayRenderer.RenderOverlaysBeforeWater(); | m->overlayRenderer.RenderOverlaysBeforeWater(); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
RenderModels(context, cullGroup); | |||||
ogl_WarnIfError(); | |||||
// render water | // render water | ||||
if (m_WaterManager->m_RenderWater && g_Game && waterScissor.GetVolume() > 0) | if (m_WaterManager->m_RenderWater && g_Game && waterScissor.GetVolume() > 0) | ||||
{ | { | ||||
// render transparent stuff, but only the solid parts that can occlude block water | |||||
RenderTransparentModels(context, cullGroup, TRANSPARENT_OPAQUE, false); | |||||
ogl_WarnIfError(); | |||||
m->terrainRenderer.RenderWater(context, cullGroup, &m->shadow); | m->terrainRenderer.RenderWater(context, cullGroup, &m->shadow); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// render transparent stuff again, but only the blended parts that overlap water | |||||
RenderTransparentModels(context, cullGroup, TRANSPARENT_BLEND, false); | |||||
ogl_WarnIfError(); | |||||
} | } | ||||
else | |||||
{ | |||||
// render transparent stuff, so it can overlap models/terrain | |||||
RenderTransparentModels(context, cullGroup, TRANSPARENT, false); | |||||
ogl_WarnIfError(); | |||||
} | |||||
// render debug-related terrain overlays | // Render the transparent parts of alpha-blended objects. | ||||
RenderTransparentModels(context, cullGroup, TRANSPARENT_BLEND, false); | |||||
ogl_WarnIfError(); | |||||
// Render debug-related terrain overlays | |||||
ITerrainOverlay::RenderOverlaysAfterWater(cullGroup); | ITerrainOverlay::RenderOverlaysAfterWater(cullGroup); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// render some other overlays after water (so they can be displayed on top of water) | // Render some other overlays after water (so they can be displayed on top of water) | ||||
m->overlayRenderer.RenderOverlaysAfterWater(); | m->overlayRenderer.RenderOverlaysAfterWater(); | ||||
ogl_WarnIfError(); | ogl_WarnIfError(); | ||||
// particles are transparent so render after water | // Particles are transparent so render after water | ||||
if (m_Options.m_Particles) | if (m_Options.m_Particles) | ||||
{ | { | ||||
RenderParticles(cullGroup); | RenderParticles(cullGroup); | ||||
Context not available. |