aboutsummaryrefslogtreecommitdiff
path: root/scatterplot.cpp
diff options
context:
space:
mode:
authorSamuel Fadel <samuel@nihil.ws>2023-06-04 18:47:27 +0200
committerSamuel Fadel <samuel@nihil.ws>2023-06-04 18:47:27 +0200
commitba028ae4dbbf93a461c9c9474889d04e640f64e0 (patch)
treed4af4d02403f706d10b1f9de901c899edd85c196 /scatterplot.cpp
parentfb23c8d47f6dcef429423256d8dddcc0f7184fc4 (diff)
More fixes to rendering, same as original except for point outlines.
Diffstat (limited to 'scatterplot.cpp')
-rw-r--r--scatterplot.cpp47
1 files changed, 43 insertions, 4 deletions
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<Shader>(
@@ -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);