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 projection_matrix;
uniform float offset;
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.
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;
}

View file

@ -2,6 +2,7 @@
uniform mat4 view_model_matrix;
uniform mat4 projection_matrix;
uniform float offset;
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.
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;
}

View file

@ -1,9 +1,11 @@
#version 110
uniform float offset;
void main()
{
// Add small epsilon to z to solve z-fighting between painted triangles and contour lines.
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;
}

View file

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

View file

@ -8,6 +8,7 @@
#include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/Camera.hpp"
#include "slic3r/GUI/Plater.hpp"
#include "slic3r/GUI/OpenGLManager.hpp"
#include "slic3r/Utils/UndoRedo.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/PresetBundle.hpp"
@ -967,6 +968,7 @@ void TriangleSelectorGUI::render(ImGuiWrapper* imgui)
auto *contour_shader = wxGetApp().get_shader("mm_contour");
contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
m_paint_contour.render();
contour_shader->stop_using();
}
@ -1362,6 +1364,7 @@ void TriangleSelectorGUI::render_paint_contour()
if (contour_shader != nullptr) {
contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
#if ENABLE_GL_SHADERS_ATTRIBUTES
const Camera& camera = wxGetApp().plater()->get_camera();
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/Plater.hpp"
#include "slic3r/GUI/format.hpp"
#include "slic3r/GUI/OpenGLManager.hpp"
#include "libslic3r/AppConfig.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/QuadricEdgeCollapse.hpp"
@ -758,6 +759,7 @@ void GLGizmoSimplify::on_render()
if (m_show_wireframe) {
auto *contour_shader = wxGetApp().get_shader("mm_contour");
contour_shader->start_using();
contour_shader->set_uniform("offset", OpenGLManager::get_gl_info().is_mesa() ? 0.0005 : 0.00001);
#if ENABLE_GL_SHADERS_ATTRIBUTES
contour_shader->set_uniform("view_model_matrix", view_model_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;
}
bool OpenGLManager::GLInfo::is_mesa() const
{
return boost::icontains(m_version, "mesa");
}
int OpenGLManager::GLInfo::get_max_tex_size() const
{
if (!m_detected)

View file

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