Shader mm_contour - Customizable offset to calculate the correction to avoid z-fighting (MESA driver needs bigger one)

This commit is contained in:
enricoturri1966 2022-04-07 12:59:11 +02:00
parent 0995cfc658
commit a4435d214f
8 changed files with 21 additions and 3 deletions

View File

@ -2,6 +2,7 @@
uniform mat4 view_model_matrix; uniform mat4 view_model_matrix;
uniform mat4 projection_matrix; uniform mat4 projection_matrix;
uniform float offset;
attribute vec3 v_position; attribute vec3 v_position;
@ -9,6 +10,6 @@ void main()
{ {
// Add small epsilon to z to solve z-fighting between painted triangles and contour lines. // Add small epsilon to z to solve z-fighting between painted triangles and contour lines.
vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0);
clip_position.z -= 0.00001 * abs(clip_position.w); clip_position.z -= offset * abs(clip_position.w);
gl_Position = clip_position; gl_Position = clip_position;
} }

View File

@ -2,6 +2,7 @@
uniform mat4 view_model_matrix; uniform mat4 view_model_matrix;
uniform mat4 projection_matrix; uniform mat4 projection_matrix;
uniform float offset;
in vec3 v_position; in vec3 v_position;
@ -9,6 +10,6 @@ void main()
{ {
// Add small epsilon to z to solve z-fighting between painted triangles and contour lines. // Add small epsilon to z to solve z-fighting between painted triangles and contour lines.
vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0); vec4 clip_position = projection_matrix * view_model_matrix * vec4(v_position, 1.0);
clip_position.z -= 0.00001 * abs(clip_position.w); clip_position.z -= offset * abs(clip_position.w);
gl_Position = clip_position; gl_Position = clip_position;
} }

View File

@ -1,9 +1,11 @@
#version 110 #version 110
uniform float offset;
void main() void main()
{ {
// Add small epsilon to z to solve z-fighting between painted triangles and contour lines. // Add small epsilon to z to solve z-fighting between painted triangles and contour lines.
vec4 clip_position = gl_ModelViewProjectionMatrix * gl_Vertex; vec4 clip_position = gl_ModelViewProjectionMatrix * gl_Vertex;
clip_position.z -= 0.00001 * abs(clip_position.w); clip_position.z -= offset * abs(clip_position.w);
gl_Position = clip_position; gl_Position = clip_position;
} }

View File

@ -9,6 +9,7 @@
#include "slic3r/GUI/format.hpp" #include "slic3r/GUI/format.hpp"
#include "slic3r/GUI/GUI_ObjectList.hpp" #include "slic3r/GUI/GUI_ObjectList.hpp"
#include "slic3r/GUI/NotificationManager.hpp" #include "slic3r/GUI/NotificationManager.hpp"
#include "slic3r/GUI/OpenGLManager.hpp"
#include "libslic3r/PresetBundle.hpp" #include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/UndoRedo.hpp"
@ -627,6 +628,7 @@ void TriangleSelectorMmGui::render(ImGuiWrapper *imgui)
auto *contour_shader = wxGetApp().get_shader("mm_contour"); auto *contour_shader = wxGetApp().get_shader("mm_contour");
contour_shader->start_using(); contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
m_paint_contour.render(); m_paint_contour.render();
contour_shader->stop_using(); contour_shader->stop_using();
} }

View File

@ -8,6 +8,7 @@
#include "slic3r/GUI/GUI_App.hpp" #include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/Camera.hpp" #include "slic3r/GUI/Camera.hpp"
#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Plater.hpp"
#include "slic3r/GUI/OpenGLManager.hpp"
#include "slic3r/Utils/UndoRedo.hpp" #include "slic3r/Utils/UndoRedo.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "libslic3r/PresetBundle.hpp" #include "libslic3r/PresetBundle.hpp"
@ -967,6 +968,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui)
auto *contour_shader = wxGetApp().get_shader("mm_contour"); auto *contour_shader = wxGetApp().get_shader("mm_contour");
contour_shader->start_using(); contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
m_paint_contour.render(); m_paint_contour.render();
contour_shader->stop_using(); contour_shader->stop_using();
} }
@ -1362,6 +1364,7 @@ void TriangleSelectorGUI::render_paint_contour()
if (contour_shader != nullptr) { if (contour_shader != nullptr) {
contour_shader->start_using(); contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
#if ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_GL_SHADERS_ATTRIBUTES
const Camera& camera = wxGetApp().plater()->get_camera(); const Camera& camera = wxGetApp().plater()->get_camera();
contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix); contour_shader->set_uniform("view_model_matrix", camera.get_view_matrix() * matrix);

View File

@ -7,6 +7,7 @@
#include "slic3r/GUI/NotificationManager.hpp" #include "slic3r/GUI/NotificationManager.hpp"
#include "slic3r/GUI/Plater.hpp" #include "slic3r/GUI/Plater.hpp"
#include "slic3r/GUI/format.hpp" #include "slic3r/GUI/format.hpp"
#include "slic3r/GUI/OpenGLManager.hpp"
#include "libslic3r/AppConfig.hpp" #include "libslic3r/AppConfig.hpp"
#include "libslic3r/Model.hpp" #include "libslic3r/Model.hpp"
#include "libslic3r/QuadricEdgeCollapse.hpp" #include "libslic3r/QuadricEdgeCollapse.hpp"
@ -758,6 +759,7 @@ void GLGizmoSimplify::on_render()
if (m_show_wireframe) { if (m_show_wireframe) {
auto *contour_shader = wxGetApp().get_shader("mm_contour"); auto *contour_shader = wxGetApp().get_shader("mm_contour");
contour_shader->start_using(); contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
#if ENABLE_GL_SHADERS_ATTRIBUTES #if ENABLE_GL_SHADERS_ATTRIBUTES
contour_shader->set_uniform("view_model_matrix", view_model_matrix); contour_shader->set_uniform("view_model_matrix", view_model_matrix);
contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix()); contour_shader->set_uniform("projection_matrix", camera.get_projection_matrix());

View File

@ -65,6 +65,11 @@ const std::string& OpenGLManager::GLInfo::get_renderer() const
return m_renderer; return m_renderer;
} }
bool OpenGLManager::GLInfo::is_mesa() const
{
return boost::icontains(m_version, "mesa");
}
int OpenGLManager::GLInfo::get_max_tex_size() const int OpenGLManager::GLInfo::get_max_tex_size() const
{ {
if (!m_detected) if (!m_detected)

View File

@ -40,6 +40,8 @@ public:
const std::string& get_vendor() const; const std::string& get_vendor() const;
const std::string& get_renderer() const; const std::string& get_renderer() const;
bool is_mesa() const;
int get_max_tex_size() const; int get_max_tex_size() const;
float get_max_anisotropy() const; float get_max_anisotropy() const;