From 9cfb00970f7d46f1732149d4c50ba3646f038b6c Mon Sep 17 00:00:00 2001 From: Sergey Alexandrov Date: Thu, 11 Feb 2016 22:19:01 +0100 Subject: [PATCH 1/4] Use vtkTextureUnitManager to query the number of available texture units The new OpenGL2 backend does not have vktOpenGLHardwareSupport class which was used before. --- visualization/src/pcl_visualizer.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/visualization/src/pcl_visualizer.cpp b/visualization/src/pcl_visualizer.cpp index dc916744165..007c251a7cf 100644 --- a/visualization/src/pcl_visualizer.cpp +++ b/visualization/src/pcl_visualizer.cpp @@ -84,7 +84,6 @@ #include #include #include -#include #include #include #include @@ -92,6 +91,7 @@ #include #include #include +#include #include #include @@ -3223,19 +3223,18 @@ pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh, #endif vtkSmartPointer actor = vtkSmartPointer::New (); - vtkOpenGLHardwareSupport* hardware = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetHardwareSupport (); - if (!hardware) + vtkTextureUnitManager* tex_manager = vtkOpenGLRenderWindow::SafeDownCast (win_)->GetTextureUnitManager (); + if (!tex_manager) return (false); - bool supported = hardware->GetSupportsMultiTexturing (); // Check if hardware support multi texture - std::size_t texture_units (hardware->GetNumberOfFixedTextureUnits ()); - if ((mesh.tex_materials.size () > 1) && supported && (texture_units > 1)) + int texture_units = tex_manager->GetNumberOfTextureUnits (); + if ((mesh.tex_materials.size () > 1) && (texture_units > 1)) { if (texture_units < mesh.tex_materials.size ()) PCL_WARN ("[PCLVisualizer::addTextureMesh] GPU texture units %d < mesh textures %d!\n", texture_units, mesh.tex_materials.size ()); // Load textures - std::size_t last_tex_id = std::min (mesh.tex_materials.size (), texture_units); + std::size_t last_tex_id = std::min (static_cast (mesh.tex_materials.size ()), texture_units); int tu = vtkProperty::VTK_TEXTURE_UNIT_0; std::size_t tex_id = 0; while (tex_id < last_tex_id) @@ -3279,7 +3278,7 @@ pcl::visualization::PCLVisualizer::addTextureMesh (const pcl::TextureMesh &mesh, } // end of multi texturing else { - if ((mesh.tex_materials.size () > 1) && (!supported || texture_units < 2)) + if ((mesh.tex_materials.size () > 1) && (texture_units < 2)) PCL_WARN ("[PCLVisualizer::addTextureMesh] Your GPU doesn't support multi texturing. " "Will use first one only!\n"); From d0efc67fa0d5f3fb3fb99990a6b2a1967a93c229 Mon Sep 17 00:00:00 2001 From: Sergey Alexandrov Date: Sat, 13 Feb 2016 13:31:54 +0100 Subject: [PATCH 2/4] Add CMake variable and C++ macro VTK_RENDERING_BACKEND_OPENGL_VERSION These can be used at configuration and compilation times to adjust for the currently used backend. --- CMakeLists.txt | 12 +++++++++++- pcl_config.h.in | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 36fc4c92c9c..e5fd763e31f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -361,7 +361,12 @@ option(WITH_VTK "Build VTK-Visualizations" TRUE) if(WITH_VTK AND NOT ANDROID) find_package(VTK) if(VTK_FOUND) - message(STATUS "VTK_MAJOR_VERSION ${VTK_MAJOR_VERSION}") + if(NOT DEFINED VTK_RENDERING_BACKEND) + # On old VTK versions this variable does not exist. In this case it is + # safe to assume OpenGL backend + set(VTK_RENDERING_BACKEND "OpenGL") + endif() + message(STATUS "VTK_MAJOR_VERSION ${VTK_MAJOR_VERSION}, rendering backend: ${VTK_RENDERING_BACKEND}") if (PCL_SHARED_LIBS OR (NOT (PCL_SHARED_LIBS) AND NOT (VTK_BUILD_SHARED_LIBS))) set(VTK_FOUND TRUE) @@ -377,6 +382,11 @@ if(WITH_VTK AND NOT ANDROID) option (VTK_USE_COCOA "Use Cocoa for VTK render windows" ON) MARK_AS_ADVANCED (VTK_USE_COCOA) endif (APPLE) + if(${VTK_RENDERING_BACKEND} STREQUAL "OpenGL") + set(VTK_RENDERING_BACKEND_OPENGL_VERSION "1") + elseif(${VTK_RENDERING_BACKEND} STREQUAL "OpenGL2") + set(VTK_RENDERING_BACKEND_OPENGL_VERSION "2") + endif() set(HAVE_VTK ON) else () set(VTK_FOUND OFF) diff --git a/pcl_config.h.in b/pcl_config.h.in index e4b10b09aeb..3c25a06a09b 100644 --- a/pcl_config.h.in +++ b/pcl_config.h.in @@ -71,3 +71,7 @@ /* Address the cases where on MacOS and OpenGL and GLUT are not frameworks */ #cmakedefine OPENGL_IS_A_FRAMEWORK #cmakedefine GLUT_IS_A_FRAMEWORK + +/* Version of OpenGL used by VTK as rendering backend */ +#define VTK_RENDERING_BACKEND_OPENGL_VERSION ${VTK_RENDERING_BACKEND_OPENGL_VERSION} + From c50c65b042828cfa18765eef7876f896a40a6d1b Mon Sep 17 00:00:00 2001 From: Sergey Alexandrov Date: Sat, 13 Feb 2016 13:59:47 +0100 Subject: [PATCH 3/4] Conditionally compile code that uses vtkVertexBufferObjectMapper This mapper is a performance optimization that is only needed when OpenGL backend is used. The modern OpenGL2 backend uses vertex buffer objects transparently for us. --- .../src/visualization/outofcore_cloud.cpp | 14 ++++++++++++-- visualization/CMakeLists.txt | 18 ++++++++++++++---- visualization/src/interactor_style.cpp | 6 ++++++ visualization/src/pcl_visualizer.cpp | 15 ++++++++++++++- 4 files changed, 46 insertions(+), 7 deletions(-) diff --git a/outofcore/src/visualization/outofcore_cloud.cpp b/outofcore/src/visualization/outofcore_cloud.cpp index eaf490c4b50..b08d30e7816 100644 --- a/outofcore/src/visualization/outofcore_cloud.cpp +++ b/outofcore/src/visualization/outofcore_cloud.cpp @@ -21,7 +21,10 @@ // PCL - visualziation #include + +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 #include +#endif // VTK #include @@ -251,11 +254,18 @@ OutofcoreCloud::render (vtkRenderer* renderer) { vtkSmartPointer cloud_actor = vtkSmartPointer::New (); - vtkSmartPointer mapper = vtkSmartPointer::New (); - CloudDataCacheItem *cloud_data_cache_item = &cloud_data_cache.get(pcd_file); +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 + vtkSmartPointer mapper = vtkSmartPointer::New (); mapper->SetInput (cloud_data_cache_item->item); +#else + vtkSmartPointer mapper = vtkSmartPointer::New (); + // Usually we choose between SetInput and SetInputData based on VTK version. But OpenGL ≥ 2 automatically + // means VTK version is ≥ 6.3 + mapper->SetInputData (cloud_data_cache_item->item); +#endif + cloud_actor->SetMapper (mapper); cloud_actor->GetProperty ()->SetColor (0.0, 0.0, 1.0); cloud_actor->GetProperty ()->SetPointSize (1); diff --git a/visualization/CMakeLists.txt b/visualization/CMakeLists.txt index 26bfd7cc76b..940fc8ef2d9 100644 --- a/visualization/CMakeLists.txt +++ b/visualization/CMakeLists.txt @@ -50,8 +50,6 @@ if(build) src/common/float_image_utils.cpp src/vtk/pcl_image_canvas_source_2d.cpp src/vtk/pcl_context_item.cpp - src/vtk/vtkVertexBufferObject.cxx - src/vtk/vtkVertexBufferObjectMapper.cxx src/vtk/vtkRenderWindowInteractorFix.cpp ) if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6") @@ -67,6 +65,13 @@ if(build) ) endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_GREATER "5.6") + if(VTK_RENDERING_BACKEND_OPENGL_VERSION VERSION_LESS 2) + list(APPEND srcs + "src/vtk/vtkVertexBufferObject.cxx" + "src/vtk/vtkVertexBufferObjectMapper.cxx" + ) + endif() + set(incs "include/pcl/${SUBSYS_NAME}/eigen.h" "include/pcl/${SUBSYS_NAME}/boost.h" @@ -127,11 +132,16 @@ if(build) set(vtk_incs "include/pcl/${SUBSYS_NAME}/vtk/pcl_image_canvas_source_2d.h" "include/pcl/${SUBSYS_NAME}/vtk/pcl_context_item.h" - "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h" "include/pcl/${SUBSYS_NAME}/vtk/vtkRenderWindowInteractorFix.h" - "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h" ) + if(VTK_RENDERING_BACKEND_OPENGL_VERSION VERSION_LESS 2) + list(APPEND vtk_incs + "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObject.h" + "include/pcl/${SUBSYS_NAME}/vtk/vtkVertexBufferObjectMapper.h" + ) + endif() + # on apple, a workaround is used for the cocoa render window interactor if(APPLE) list(APPEND srcs diff --git a/visualization/src/interactor_style.cpp b/visualization/src/interactor_style.cpp index 9e9fdafaf8d..f443b6b48c5 100644 --- a/visualization/src/interactor_style.cpp +++ b/visualization/src/interactor_style.cpp @@ -64,7 +64,9 @@ #include #include +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 #include +#endif #define ORIENT_MODE 0 #define SELECT_MODE 1 @@ -660,6 +662,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown () data->SetPoints (points); data->SetVerts (vertices); // Modify the mapper +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 if (use_vbos_) { vtkVertexBufferObjectMapper* mapper = static_cast(act->actor->GetMapper ()); @@ -668,6 +671,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown () act->actor->SetMapper (mapper); } else +#endif { vtkPolyDataMapper* mapper = static_cast(act->actor->GetMapper ()); #if VTK_MAJOR_VERSION < 6 @@ -704,6 +708,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown () vtkPolyData *data = static_cast(act->actor->GetMapper ()->GetInput ()); data->GetPointData ()->SetScalars (scalars); // Modify the mapper +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 if (use_vbos_) { vtkVertexBufferObjectMapper* mapper = static_cast(act->actor->GetMapper ()); @@ -714,6 +719,7 @@ pcl::visualization::PCLVisualizerInteractorStyle::OnKeyDown () act->actor->SetMapper (mapper); } else +#endif { vtkPolyDataMapper* mapper = static_cast(act->actor->GetMapper ()); mapper->SetScalarRange (minmax); diff --git a/visualization/src/pcl_visualizer.cpp b/visualization/src/pcl_visualizer.cpp index 007c251a7cf..40e516c8456 100644 --- a/visualization/src/pcl_visualizer.cpp +++ b/visualization/src/pcl_visualizer.cpp @@ -63,9 +63,12 @@ #include #include -#include #include +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 +#include +#endif + #include #include #include @@ -1079,6 +1082,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin if (!actor) actor = vtkSmartPointer::New (); +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 if (use_vbos_) { vtkSmartPointer mapper = vtkSmartPointer::New (); @@ -1111,6 +1115,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin actor->SetMapper (mapper); } else +#endif { vtkSmartPointer mapper = vtkSmartPointer::New (); #if VTK_MAJOR_VERSION < 6 @@ -1157,6 +1162,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin if (!actor) actor = vtkSmartPointer::New (); +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 if (use_vbos_) { vtkSmartPointer mapper = vtkSmartPointer::New (); @@ -1189,6 +1195,7 @@ pcl::visualization::PCLVisualizer::createActorFromVTKDataSet (const vtkSmartPoin actor->SetMapper (mapper); } else +#endif { vtkSmartPointer mapper = vtkSmartPointer::New (); #if VTK_MAJOR_VERSION < 6 @@ -2771,6 +2778,7 @@ pcl::visualization::PCLVisualizer::updateColorHandlerIndex (const std::string &i vtkPolyData *data = static_cast(am_it->second.actor->GetMapper ()->GetInput ()); data->GetPointData ()->SetScalars (scalars); // Modify the mapper +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 if (use_vbos_) { vtkVertexBufferObjectMapper* mapper = static_cast(am_it->second.actor->GetMapper ()); @@ -2785,6 +2793,7 @@ pcl::visualization::PCLVisualizer::updateColorHandlerIndex (const std::string &i //style_->setCloudActorMap (cloud_actor_map_); } else +#endif { vtkPolyDataMapper* mapper = static_cast(am_it->second.actor->GetMapper ()); mapper->SetScalarRange (minmax); @@ -4296,8 +4305,12 @@ pcl::visualization::PCLVisualizer::resetStoppedFlag () void pcl::visualization::PCLVisualizer::setUseVbos (bool use_vbos) { +#if VTK_RENDERING_BACKEND_OPENGL_VERSION < 2 use_vbos_ = use_vbos; style_->setUseVbos (use_vbos_); +#else + PCL_WARN ("[PCLVisualizer::setUseVbos] Has no effect when OpenGL version is ≥ 2\n"); +#endif } ////////////////////////////////////////////////////////////////////////////////////////////// From 641fe1b6341d96980e7afc35db19615352ac3f3d Mon Sep 17 00:00:00 2001 From: Sergey Alexandrov Date: Sat, 13 Feb 2016 14:00:17 +0100 Subject: [PATCH 4/4] Update documentation for setUseVbos() function --- .../include/pcl/visualization/interactor_style.h | 8 +++++--- visualization/include/pcl/visualization/pcl_visualizer.h | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/visualization/include/pcl/visualization/interactor_style.h b/visualization/include/pcl/visualization/interactor_style.h index 7cc7210fb90..6b64fc5b944 100644 --- a/visualization/include/pcl/visualization/interactor_style.h +++ b/visualization/include/pcl/visualization/interactor_style.h @@ -157,8 +157,10 @@ namespace pcl void setRendererCollection (vtkSmartPointer &rens) { rens_ = rens; } - /** \brief Pass a pointer to the actor map - * \param[in] use_vbos + /** \brief Use Vertex Buffer Objects renderers. + * This is an optimization for the obsolete OpenGL backend. Modern OpenGL2 backend (VTK ≥ 6.3) uses vertex + * buffer objects by default, transparently for the user. + * \param[in] use_vbos set to true to use VBOs */ inline void setUseVbos (const bool use_vbos) { use_vbos_ = use_vbos; } @@ -282,7 +284,7 @@ namespace pcl /** \brief The maximum resizeable window width/height. */ int max_win_height_, max_win_width_; - /** \brief The maximum resizeable window width/height. */ + /** \brief Boolean that holds whether or not to use the vtkVertexBufferObjectMapper*/ bool use_vbos_; /** \brief Set to true if the grid actor is enabled. */ diff --git a/visualization/include/pcl/visualization/pcl_visualizer.h b/visualization/include/pcl/visualization/pcl_visualizer.h index 418c3c2768c..f62dc986ae8 100644 --- a/visualization/include/pcl/visualization/pcl_visualizer.h +++ b/visualization/include/pcl/visualization/pcl_visualizer.h @@ -1859,6 +1859,8 @@ namespace pcl setSize (int xw, int yw); /** \brief Use Vertex Buffer Objects renderers. + * This is an optimization for the obsolete OpenGL backend. Modern OpenGL2 backend (VTK ≥ 6.3) uses vertex + * buffer objects by default, transparently for the user. * \param[in] use_vbos set to true to use VBOs */ void