Add state tracking for depth

pull/796/head
Hleb Valoshka 2020-07-07 20:00:08 +03:00
parent e2bbd838a5
commit 41f6b95c72
8 changed files with 116 additions and 63 deletions

View File

@ -260,14 +260,14 @@ ArrowReferenceMark::render(Renderer* renderer,
if (opacity == 1.0f)
{
// Enable depth buffering
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
renderer->enableDepthTest();
renderer->enableDepthMask();
renderer->disableBlending();
}
else
{
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->enableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
#ifdef USE_HDR
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
@ -292,8 +292,8 @@ ArrowReferenceMark::render(Renderer* renderer,
RenderArrow(vo);
glUseProgram(0);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->disableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
}
@ -344,14 +344,14 @@ AxesReferenceMark::render(Renderer* renderer,
if (opacity == 1.0f)
{
// Enable depth buffering
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
renderer->enableDepthTest();
renderer->enableDepthMask();
renderer->disableBlending();
}
else
{
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->enableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
#ifdef USE_HDR
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
@ -420,8 +420,8 @@ AxesReferenceMark::render(Renderer* renderer,
RenderZ(vo);
glUseProgram(0);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->disableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
}

View File

@ -335,7 +335,7 @@ void Renderer::renderSelectionPointer(const Observer& observer,
#ifdef USE_HDR
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
#endif
glDisable(GL_DEPTH_TEST);
disableDepthTest();
enableBlending();
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

View File

@ -120,8 +120,8 @@ PlanetographicGrid::render(Renderer* renderer,
Vector3d viewNormal = vn.cast<double>();
// Enable depth buffering
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
renderer->enableDepthTest();
renderer->enableDepthMask();
renderer->disableBlending();
Affine3f transform = Translation3f(pos) * qf.conjugate() * Scaling(scale * semiAxes);
@ -248,8 +248,8 @@ PlanetographicGrid::render(Renderer* renderer,
glDisableVertexAttribArray(CelestiaGLProgram::VertexCoordAttributeIndex);
glUseProgram(0);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->disableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
}

View File

@ -655,21 +655,30 @@ GLSL_RenderContext::makeCurrent(const Material& m)
case Material::NormalBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
if (disableDepthWriteOnBlend)
renderer->disableDepthMask();
else
renderer->enableDepthMask();
break;
case Material::AdditiveBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
if (disableDepthWriteOnBlend)
renderer->disableDepthMask();
else
renderer->enableDepthMask();
break;
case Material::PremultipliedAlphaBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(disableDepthWriteOnBlend ? GL_FALSE : GL_TRUE);
if (disableDepthWriteOnBlend)
renderer->disableDepthMask();
else
renderer->enableDepthMask();
break;
default:
renderer->disableBlending();
glDepthMask(GL_TRUE);
renderer->enableDepthMask();
break;
}
}
@ -801,21 +810,21 @@ GLSLUnlit_RenderContext::makeCurrent(const Material& m)
case Material::NormalBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
renderer->disableDepthMask();
break;
case Material::AdditiveBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
glDepthMask(GL_FALSE);
renderer->disableDepthMask();
break;
case Material::PremultipliedAlphaBlend:
renderer->enableBlending();
renderer->setBlendingFactors(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDepthMask(GL_FALSE);
renderer->disableDepthMask();
break;
default:
renderer->disableBlending();
glDepthMask(GL_TRUE);
renderer->enableDepthMask();
break;
}
}

View File

@ -1684,7 +1684,7 @@ void Renderer::draw(const Observer& observer,
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
#endif
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDepthMask(GL_FALSE);
disableDepthMask();
// Render sky grids first--these will always be in the background
enableSmoothLines();
@ -1783,7 +1783,7 @@ void Renderer::draw(const Observer& observer,
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
disableBlending();
glDepthMask(GL_TRUE);
enableDepthMask();
}
void renderPoint(const Renderer &renderer,
@ -1909,7 +1909,7 @@ void Renderer::renderObjectAsPoint(const Vector3f& position,
glareAlpha *= fade;
}
glEnable(GL_DEPTH_TEST);
enableDepthTest();
bool useSprites = starStyle != PointStars;
if (useSprites)
gaussianDiscTex->bind();
@ -1927,7 +1927,7 @@ void Renderer::renderObjectAsPoint(const Vector3f& position,
renderPoint(*this, position, {color, glareAlpha}, glareSize, true, m);
}
glDisable(GL_DEPTH_TEST);
disableDepthTest();
}
}
@ -1967,7 +1967,7 @@ void Renderer::renderEllipsoidAtmosphere(const Atmosphere& atmosphere,
if (prog == nullptr)
return;
glDepthMask(GL_FALSE);
disableDepthMask();
// Gradually fade in the atmosphere if it's thickness on screen is just
// over one pixel.
@ -2641,8 +2641,8 @@ void Renderer::renderObject(const Vector3f& pos,
}
// Enable depth buffering
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
enableDepthTest();
enableDepthMask();
disableBlending();
@ -2936,7 +2936,7 @@ void Renderer::renderObject(const Vector3f& pos,
if (distance - radius < atmosphere->cloudHeight)
glFrontFace(GL_CW);
glDepthMask(GL_FALSE);
disableDepthMask();
cloudTex->bind();
enableBlending();
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -2971,7 +2971,7 @@ void Renderer::renderObject(const Vector3f& pos,
}
glDisable(GL_POLYGON_OFFSET_FILL);
glDepthMask(GL_TRUE);
enableDepthMask();
glFrontFace(GL_CCW);
}
}
@ -2987,7 +2987,7 @@ void Renderer::renderObject(const Vector3f& pos,
if (distance > obj.rings->innerRadius)
{
glDepthMask(GL_FALSE);
disableDepthMask();
renderRings_GLSL(*obj.rings, ri, ls,
radius, 1.0f - obj.semiAxes.y(),
textureResolution,
@ -2997,8 +2997,8 @@ void Renderer::renderObject(const Vector3f& pos,
}
}
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
disableDepthTest();
disableDepthMask();
enableBlending();
}
@ -3401,8 +3401,8 @@ void Renderer::renderPlanet(Body& body,
cityRep = MarkerRepresentation(MarkerRepresentation::X, 3.0f, LocationLabelColor);
genericLocationRep = MarkerRepresentation(MarkerRepresentation::Square, 8.0f, LocationLabelColor);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
enableDepthTest();
disableDepthMask();
disableBlending();
// We need a double precision body-relative position of the
@ -3410,7 +3410,7 @@ void Renderer::renderPlanet(Body& body,
Vector3d posd = body.getPosition(observer.getTime()).offsetFromKm(observer.getPosition());
locationsToAnnotations(body, posd, q);
glDisable(GL_DEPTH_TEST);
disableDepthTest();
}
}
@ -3681,7 +3681,7 @@ void Renderer::renderCometTail(const Body& body,
}
}
glDepthMask(GL_FALSE);
disableDepthMask();
glDisable(GL_CULL_FACE);
enableBlending();
setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
@ -3758,8 +3758,8 @@ void Renderer::renderReferenceMark(const ReferenceMark& refMark,
refMark.render(this, pos, discSizeInPixels, now, m);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
disableDepthTest();
disableDepthMask();
enableBlending();
setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
}
@ -4934,9 +4934,9 @@ void Renderer::renderAnnotations(const vector<Annotation>& annotations,
void
Renderer::renderBackgroundAnnotations(FontStyle fs)
{
glEnable(GL_DEPTH_TEST);
enableDepthTest();
renderAnnotations(backgroundAnnotations, fs);
glDisable(GL_DEPTH_TEST);
disableDepthTest();
clearAnnotations(backgroundAnnotations);
}
@ -4945,7 +4945,7 @@ Renderer::renderBackgroundAnnotations(FontStyle fs)
void
Renderer::renderForegroundAnnotations(FontStyle fs)
{
glDisable(GL_DEPTH_TEST);
disableDepthTest();
renderAnnotations(foregroundAnnotations, fs);
clearAnnotations(foregroundAnnotations);
@ -4974,7 +4974,7 @@ Renderer::renderAnnotations(vector<Annotation>::iterator startIter,
if (font[fs] == nullptr)
return endIter;
glEnable(GL_DEPTH_TEST);
enableDepthTest();
enableBlending();
setBlendingFactors(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -5012,7 +5012,7 @@ Renderer::renderAnnotations(vector<Annotation>::iterator startIter,
}
}
glDisable(GL_DEPTH_TEST);
disableDepthTest();
font[fs]->unbind();
return iter;
@ -5301,6 +5301,42 @@ void Renderer::setBlendingFactors(GLenum sfactor, GLenum dfactor) noexcept
}
}
void Renderer::enableDepthMask() noexcept
{
if (!m_GLState.depthMask)
{
glDepthMask(GL_TRUE);
m_GLState.depthMask = true;
}
}
void Renderer::disableDepthMask() noexcept
{
if (m_GLState.depthMask)
{
glDepthMask(GL_FALSE);
m_GLState.depthMask = false;
}
}
void Renderer::enableDepthTest() noexcept
{
if (!m_GLState.depthTest)
{
glEnable(GL_DEPTH_TEST);
m_GLState.depthTest = true;
}
}
void Renderer::disableDepthTest() noexcept
{
if (m_GLState.depthTest)
{
glDisable(GL_DEPTH_TEST);
m_GLState.depthTest = false;
}
}
constexpr GLenum toGLFormat(Renderer::PixelFormat format)
{
return (GLenum) format;
@ -6001,8 +6037,8 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
// Render orbit paths
if (!orbitPathList.empty())
{
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
enableDepthTest();
disableDepthMask();
#ifdef USE_HDR
setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
#else
@ -6031,7 +6067,7 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
}
disableSmoothLines();
glDepthMask(GL_FALSE);
disableDepthMask();
}
// Render transparent objects in the second pass
@ -6052,7 +6088,7 @@ Renderer::renderSolarSystemObjects(const Observer &observer,
FontNormal);
endObjectAnnotations();
disableSmoothLines();
glDisable(GL_DEPTH_TEST);
disableDepthTest();
}
// reset the depth range

View File

@ -261,6 +261,12 @@ class Renderer
void disableBlending() noexcept;
void setBlendingFactors(GLenum, GLenum) noexcept;
void enableDepthMask() noexcept;
void disableDepthMask() noexcept;
void enableDepthTest() noexcept;
void disableDepthTest() noexcept;
void drawRectangle(const Rect& r, const Eigen::Matrix4f& mvp);
void setRenderRegion(int x, int y, int width, int height, bool withScissor = true);
@ -806,10 +812,12 @@ class Renderer
bool blending : 1;
bool scissor : 1;
bool multisample : 1;
bool depthMask : 1;
bool depthTest : 1;
GLenum sfactor, dfactor; // blending
};
State m_GLState { false, false, false };
State m_GLState { false, false, false, false, false };
private:
typedef std::map<const Orbit*, CurvePlot*> OrbitCache;

View File

@ -338,7 +338,7 @@ void renderGeometry_GLSL(Geometry* geometry,
tsec, renderer, &lightMatrix);
renderer->setViewport(viewport);
#ifdef DEPTH_BUFFER_DEBUG
glDisable(GL_DEPTH_TEST);
renderer->disableDepthTest();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadMatrixf(Ortho2D(0.0f, (float)viewport[2], 0.0f, (float)viewport[3]).data());
@ -373,7 +373,7 @@ void renderGeometry_GLSL(Geometry* geometry,
glPopMatrix();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
renderer->enableDepthTest();
#endif
glDepthRange(range[0], range[1]);
}
@ -652,7 +652,7 @@ renderAtmosphere_GLSL(const RenderInfo& ri,
glFrontFace(GL_CW);
renderer->enableBlending();
glDepthMask(GL_FALSE);
renderer->disableDepthMask();
renderer->setBlendingFactors(GL_ONE, GL_SRC_ALPHA);
g_lodSphere->render(LODSphereMesh::Normals,
@ -661,7 +661,7 @@ renderAtmosphere_GLSL(const RenderInfo& ri,
nullptr);
renderer->disableBlending();
glDepthMask(GL_TRUE);
renderer->enableDepthMask();
glFrontFace(GL_CCW);
glUseProgram(0);
}
@ -926,8 +926,8 @@ void renderGeometryShadow_GLSL(Geometry* geometry,
// Write only to the depth buffer
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_TRUE);
glEnable(GL_DEPTH_TEST);
renderer->enableDepthMask();
renderer->enableDepthTest();
glClear(GL_DEPTH_BUFFER_BIT);
// Render backfaces only in order to reduce self-shadowing artifacts
glCullFace(GL_FRONT);

View File

@ -165,8 +165,8 @@ VisibleRegion::render(Renderer* renderer,
Vector3f semiAxes = m_body.getSemiAxes();
// Enable depth buffering
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
renderer->enableDepthTest();
renderer->enableDepthMask();
renderer->enableBlending();
#ifdef USE_HDR
renderer->setBlendingFactors(GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA);
@ -216,8 +216,8 @@ VisibleRegion::render(Renderer* renderer,
Matrix4f mvp = (*m.projection) * (*m.modelview) * transform.matrix();
renderTerminator(renderer, pos, Color(m_color, opacity), mvp);
glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE);
renderer->disableDepthTest();
renderer->disableDepthMask();
renderer->enableBlending();
renderer->setBlendingFactors(GL_SRC_ALPHA, GL_ONE);
}