From 0a23c7fba9ce57a77246b807ba76a802311a6862 Mon Sep 17 00:00:00 2001 From: Mathias Paulin <mathias.paulin@irit.fr> Date: Thu, 11 Mar 2021 18:02:44 +0100 Subject: [PATCH] Fix passes coherency wrt wireframe --- src/libRender/RadiumNBR/NodeBasedRenderer.cpp | 7 ++++++- src/libRender/RadiumNBR/Passes/GeomPrepass.cpp | 5 +++-- .../RadiumNBR/Passes/TransparencyPass.cpp | 2 +- .../RadiumNBR/Passes/WireframePass.cpp | 18 +++++++++--------- .../RadiumNBR/Passes/WireframePass.hpp | 5 +++-- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp index 4791790..fd28a8a 100644 --- a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp +++ b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp @@ -241,16 +241,20 @@ void NodeBasedRenderer::initPasses() { m_zPrePass->activate(); m_renderPasses.emplace_back( m_aoPass ); m_aoPass->activate(); + m_renderPasses.emplace_back( m_emissivityPass ); m_emissivityPass->activate(); + m_renderPasses.emplace_back( m_envlightPass ); m_envlightPass->activate(); + m_renderPasses.emplace_back( m_locallightPass ); m_locallightPass->activate(); m_renderPasses.emplace_back( m_transparencyPass ); m_transparencyPass->activate(); m_renderPasses.emplace_back( m_volumelightPass ); m_volumelightPass->activate(); + m_renderPasses.emplace_back( m_wireframePass ); // Add intermediate textures to the texture explorer @@ -524,7 +528,8 @@ void NodeBasedRenderer::setEnvMap( const std::string& files ) { auto e = std::make_shared<EnvMap>( files, t, true ); m_clearPass->setEnvMap( e ); m_envlightPass->setEnvMap( e ); - m_envlightPass->activate(); + // activate the envmap pass only if wireframe is inactive ? + if ( !m_wireframePass->isActive() ) { m_envlightPass->activate(); } m_volumelightPass->setEnvMap( e ); m_hasEnvMap = true; } diff --git a/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp b/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp index 1c8a7c0..6ac1716 100644 --- a/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp +++ b/src/libRender/RadiumNBR/Passes/GeomPrepass.cpp @@ -111,11 +111,12 @@ void GeomPrePass::execute( const Ra::Engine::Data::ViewingParameters& viewParams GL_ASSERT( glDepthFunc( GL_LESS ) ); GL_ASSERT( glDisable( GL_BLEND ) ); - + glPolygonOffset( 1.1f, 1.f ); + glEnable( GL_POLYGON_OFFSET_FILL ); for ( const auto& ro : *m_objectsToRender ) { ro->render( m_passParams, viewParams, passIndex() ); } - // Beware of the state left by the pass + // Beware of the state left by the pass : Polygon offset must be enable after this for rendering coherency } bool GeomPrePass::buildRenderTechnique( const Ra::Engine::Rendering::RenderObject* ro, diff --git a/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp b/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp index 7edcc0f..d28871c 100644 --- a/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp +++ b/src/libRender/RadiumNBR/Passes/TransparencyPass.cpp @@ -152,7 +152,7 @@ void TransparencyPass::execute( const Ra::Engine::Data::ViewingParameters& viewP GL_ASSERT( glClearBufferfv( GL_COLOR, 0, clearZeros.data() ) ); GL_ASSERT( glClearBufferfv( GL_COLOR, 1, clearOnes.data() ) ); GL_ASSERT( glDepthMask( GL_FALSE ) ); - GL_ASSERT( glDepthFunc( GL_LESS ) ); + GL_ASSERT( glDepthFunc( GL_LEQUAL ) ); GL_ASSERT( glEnable( GL_DEPTH_TEST ) ); GL_ASSERT( glEnable( GL_BLEND ) ); diff --git a/src/libRender/RadiumNBR/Passes/WireframePass.cpp b/src/libRender/RadiumNBR/Passes/WireframePass.cpp index 051e768..ce32ad5 100644 --- a/src/libRender/RadiumNBR/Passes/WireframePass.cpp +++ b/src/libRender/RadiumNBR/Passes/WireframePass.cpp @@ -168,21 +168,19 @@ void WireframePass::execute( const Ra::Engine::Data::ViewingParameters& viewPara GL_ASSERT( glColorMask( GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE ) ); GL_ASSERT( glEnable( GL_DEPTH_TEST ) ); - GL_ASSERT( glDepthFunc( GL_LEQUAL ) ); + GL_ASSERT( glDepthFunc( GL_LESS ) ); GL_ASSERT( glEnable( GL_BLEND ) ); #ifdef ADVANCED_WIREFRAME_SHADER glBlendEquationSeparate( GL_FUNC_ADD, GL_FUNC_ADD ); glBlendFuncSeparate( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO ); - glPolygonOffset( -4.f, -2.f ); - glEnable( GL_POLYGON_OFFSET_FILL ); - + // To prevent z-fighting, remove polygon offset + glDisable( GL_POLYGON_OFFSET_FILL ); #else - GL_ASSERT( glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ) ); + glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); glEnable( GL_LINE_SMOOTH ); glLineWidth( 1.f ); - glPolygonOffset( -1.1f, -0.1f ); - glEnable( GL_POLYGON_OFFSET_LINE ); + glDisable( GL_POLYGON_OFFSET_LINE ); #endif for ( const auto& ro : *m_objectsToRender ) @@ -209,10 +207,12 @@ void WireframePass::execute( const Ra::Engine::Data::ViewingParameters& viewPara #endif } #ifdef ADVANCED_WIREFRAME_SHADER - glDisable( GL_POLYGON_OFFSET_FILL ); + // need to maintain global state invariant + glEnable( GL_POLYGON_OFFSET_FILL ); #else glPolygonMode( GL_FRONT_AND_BACK, GL_FILL ); - glDisable( GL_POLYGON_OFFSET_LINE ); + // do we need to enable this ? it is not part of the invariant ... + // glEnable( GL_POLYGON_OFFSET_LINE ); #endif GL_ASSERT( glDisable( GL_BLEND ) ); } diff --git a/src/libRender/RadiumNBR/Passes/WireframePass.hpp b/src/libRender/RadiumNBR/Passes/WireframePass.hpp index f2f8f3e..df0ca9b 100644 --- a/src/libRender/RadiumNBR/Passes/WireframePass.hpp +++ b/src/libRender/RadiumNBR/Passes/WireframePass.hpp @@ -3,8 +3,9 @@ #include <Core/Utils/Color.hpp> -//#define ADVANCED_WIREFRAME -//#define ADVANCED_WIREFRAME_SHADER +// This is the default. The two way of rendering wireframe is kept for illustration only +#define ADVANCED_WIREFRAME +#define ADVANCED_WIREFRAME_SHADER #ifdef ADVANCED_WIREFRAME #include <Engine/Data/DisplayableObject.hpp> #endif -- GitLab