From ba028ae4dbbf93a461c9c9474889d04e640f64e0 Mon Sep 17 00:00:00 2001 From: Samuel Fadel Date: Sun, 4 Jun 2023 18:47:27 +0200 Subject: More fixes to rendering, same as original except for point outlines. --- scatterplot.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) (limited to 'scatterplot.cpp') diff --git a/scatterplot.cpp b/scatterplot.cpp index a7194e8..64859b3 100644 --- a/scatterplot.cpp +++ b/scatterplot.cpp @@ -6,6 +6,9 @@ #include "colormap.h" #include "continuouscolorscale.h" +// Samples used in multisampling for rendering +static const size_t NUM_SAMPLES = 8; + // Glyphs settings static const Color DEFAULT_GLYPH_COLOR(255, 255, 255); static const float DEFAULT_GLYPH_SIZE = 8.0f; @@ -66,6 +69,7 @@ out vec4 FragColor; void main() { + gl_FragDepth = gl_PrimitiveID / 3000; FragColor = color; // FragColor = vec4(1.0); } @@ -113,6 +117,7 @@ out vec4 FragColor; void main() { + gl_FragDepth = gl_PrimitiveID / 2000; FragColor = vec4(0.0, 0.0, 0.0, 1.0); } )EOF"; @@ -166,6 +171,7 @@ Scatterplot::Scatterplot() , m_shouldUpdateMaterials(false) { glGenFramebuffers(1, &m_FBO); + glGenFramebuffers(1, &m_outFBO); glGenBuffers(1, &m_pointsVBO); glGenBuffers(1, &m_valuesVBO); @@ -179,9 +185,11 @@ Scatterplot::Scatterplot() glBindBuffer(GL_ARRAY_BUFFER, m_valuesVBO); glEnableVertexAttribArray(1); glVertexAttribPointer(1, 1, GL_FLOAT, GL_FALSE, 0, nullptr); - glVertexAttribDivisor(1, 1); + // glVertexAttribDivisor(1, 1); glBindVertexArray(0); + glGenTextures(1, &m_depthTex); + glGenTextures(1, &m_tex); glGenTextures(1, &m_outTex); m_shader = std::make_unique( @@ -208,6 +216,22 @@ void Scatterplot::setSize(size_t width, size_t height) m_width = width; m_height = height; + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_tex); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, + GL_RGBA, m_width, m_height, GL_TRUE); + // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); + + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, m_depthTex); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, NUM_SAMPLES, + GL_DEPTH_COMPONENT, m_width, m_height, GL_TRUE); + glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); + glBindTexture(GL_TEXTURE_2D, m_outTex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, m_width, m_height, 0, GL_RGBA, GL_FLOAT, 0); @@ -386,7 +410,9 @@ void Scatterplot::draw() glBindFramebuffer(GL_FRAMEBUFFER, m_FBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, m_outTex, 0); + GL_TEXTURE_2D_MULTISAMPLE, m_tex, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, + GL_TEXTURE_2D_MULTISAMPLE, m_depthTex, 0); glViewport(0, 0, m_width, m_height); m_shader->use(); @@ -398,24 +424,37 @@ void Scatterplot::draw() glBindTexture(GL_TEXTURE_2D, m_colormapTex); m_shader->setUniform("colormap", 0); + glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); // glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBindVertexArray(m_VAO); glDrawArrays(GL_POINTS, 0, m_points.size()); m_shader->release(); // Swap out shaders to draw outline + glLineWidth(GLYPH_OUTLINE_WIDTH); m_shaderOutline->use(); m_shaderOutline->setUniform("transform", m_transform); m_shaderOutline->setUniform("size", m_glyphSize / m_width); m_shaderOutline->setUniform("colormap", 0); glDrawArrays(GL_POINTS, 0, m_points.size()); - glBindVertexArray(0); m_shaderOutline->release(); + glLineWidth(1.0f); + glDisable(GL_DEPTH_TEST); + + glBindFramebuffer(GL_FRAMEBUFFER, m_outFBO); + glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, m_outTex, 0); + + glBindFramebuffer(GL_READ_FRAMEBUFFER, m_FBO); + glBindFramebuffer(GL_DRAW_FRAMEBUFFER, m_outFBO); + glBlitFramebuffer(0, 0, m_width, m_height, + 0, 0, m_width, m_height, + GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT, GL_NEAREST); /* GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER); -- cgit v1.2.3