diff --git a/src/libRender/RadiumNBR/NodeBasedRenderer.cpp b/src/libRender/RadiumNBR/NodeBasedRenderer.cpp index 4791790f5596add3bccdd9fead56ef62c80a5e58..fd28a8a5f798966be57376ff1eeec24609144a31 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 1c8a7c0f8df3a0c98876c7ac83506efb4e3235b9..6ac1716c685cd3716a75787456a88c6e1f433f0c 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 7edcc0fa39cfeeef05b9e4fbeb29590c2cf0f4c6..d28871cedae97787df8ba84e537e4fe945a148da 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 051e768be8580c6f77ce3f10920b9ae99d0cbf4a..ce32ad5c9928bd4f8aa56f7731b8d65b88ebb8f4 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 f2f8f3eba4e6f13f31af3aa38232aa6865bcf776..df0ca9b46e03c563e606f405ac9eee7a7a45b714 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