Skip to content

Commit

Permalink
WIP buggy multisample code
Browse files Browse the repository at this point in the history
  • Loading branch information
nmwsharp committed Feb 14, 2020
1 parent 213e160 commit 0e73922
Show file tree
Hide file tree
Showing 15 changed files with 182 additions and 84 deletions.
28 changes: 19 additions & 9 deletions include/polyscope/render/engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ enum class FilterMode { Nearest = 0, Linear };
enum class TextureFormat { RGB8 = 0, RGBA8, RG16F, RGB16F, RGBA16F, RGBA32F, RGB32F, R32F };
enum class RenderBufferType { Color, ColorAlpha, Depth, Float4 };
enum class DepthMode { Less, LEqual, LEqualReadOnly, Disable };
enum class BlendMode { Over, OverNoWrite, Disable }; // TODO what to call these...
enum class BlendMode { Over, OverNoWrite, Zero, Disable }; // TODO what to call these...

namespace render {

Expand All @@ -63,6 +63,9 @@ class TextureBuffer {
// void fillTextureData2D(std::string name, unsigned char* texData, unsigned int width, unsigned int height,
// bool withAlpha = true, bool useMipMap = false, bool repeat = false);

// Limited support for multisampled buffers
bool isMultisample = false;

virtual void* getNativeHandle() = 0; // used to interop with external things, e.g. ImGui

protected:
Expand Down Expand Up @@ -116,7 +119,7 @@ class FrameBuffer {

virtual void setDrawBuffers() = 0;

// Specify the viewport coordinates
// Specify the viewport coordinates
virtual void setViewport(int startX, int startY, unsigned int sizeX, unsigned int sizeY);

// Resizes textures and renderbuffers if different from current size.
Expand All @@ -133,8 +136,8 @@ class FrameBuffer {

// Buffers
int nColorBuffers = 0;
std::vector<std::shared_ptr<RenderBuffer>> renderBuffers;
std::vector<std::shared_ptr<TextureBuffer>> textureBuffers;
std::vector<std::shared_ptr<RenderBuffer>> renderBuffersColor, renderBuffersDepth;
std::vector<std::shared_ptr<TextureBuffer>> textureBuffersColor, textureBuffersDepth;
};

// == Shaders
Expand Down Expand Up @@ -274,12 +277,15 @@ class Engine {
virtual bool bindSceneBuffer();
virtual void resizeSceneBuffer(int width, int height);
virtual void setSceneBufferViewport(int xStart, int yStart, int sizeX, int sizeY);
virtual void lightSceneBuffer(); // tonemap and gamma correct, render to active framebuffer
void renderBackground(); // respects background setting
glm::vec4 getSceneBufferViewport();
virtual void lightSceneBuffer(); // tonemap and gamma correct, render to active buffer
virtual void blitFinalSceneToScreen() = 0;
void renderBackground(); // respects background setting

// Manage render state
virtual void setDepthMode(DepthMode newMode = DepthMode::Less) = 0;
virtual void setBlendMode(BlendMode newMode = BlendMode::Over) = 0;
virtual void setColorMask(std::array<bool, 4> mask = {true, true, true, true}) = 0;

// Helpers
void allocateGlobalBuffersAndPrograms(); // called once during startup
Expand Down Expand Up @@ -326,6 +332,9 @@ class Engine {
virtual std::shared_ptr<TextureBuffer> generateTextureBuffer(TextureFormat format, unsigned int sizeX_,
unsigned int sizeY_,
float* data) = 0; // 2d
virtual std::shared_ptr<TextureBuffer> generateTextureBufferMultisample(TextureFormat format, unsigned int sizeX_,
unsigned int sizeY_,
unsigned int nSamples) = 0; // 2d

// create render buffers
virtual std::shared_ptr<RenderBuffer> generateRenderBuffer(RenderBufferType type, unsigned int sizeX_,
Expand All @@ -339,11 +348,11 @@ class Engine {
DrawMode dm, unsigned int nPatchVertices = 0) = 0;

// === The frame buffers used in the rendering pipeline
std::shared_ptr<FrameBuffer> sceneBuffer;
std::shared_ptr<FrameBuffer> sceneBuffer, sceneBufferFinal;
std::shared_ptr<FrameBuffer> pickFramebuffer;

// Main buffers for rendering
std::shared_ptr<TextureBuffer> sceneColor;
std::shared_ptr<TextureBuffer> sceneColor, sceneColorFinal;
std::shared_ptr<RenderBuffer> sceneDepth, pickColorBuffer, pickDepthBuffer;

// General-use programs used by the engine
Expand All @@ -353,14 +362,15 @@ class Engine {
// Options
BackgroundView background = BackgroundView::None;

// TODO make these persistent?
float exposure = 0.9;
float whiteLevel = 0.7;
float gamma = 2.2;

protected:
// TODO Manage a cache of compiled shaders?

int ssaaFactor = 1;

// Helpers
std::vector<glm::vec3> screenTrianglesCoords(); // two triangles which cover the screen
std::vector<glm::vec4> distantCubeCoords(); // cube with vertices at infinity
Expand Down
11 changes: 7 additions & 4 deletions include/polyscope/render/opengl/gl_engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ class GLTextureBuffer : public TextureBuffer {
// create a 2D texture from data
GLTextureBuffer(TextureFormat format, unsigned int sizeX_, unsigned int sizeY_, unsigned char* data = nullptr);
GLTextureBuffer(TextureFormat format, unsigned int sizeX_, unsigned int sizeY_, float* data);
GLTextureBuffer(TextureFormat format, unsigned int sizeX_, unsigned int sizeY_, unsigned int nSamples);

~GLTextureBuffer() override;

Expand All @@ -67,10 +68,10 @@ class GLTextureBuffer : public TextureBuffer {
void setFilterMode(FilterMode newMode) override;
void* getNativeHandle() override;


void bind();
TextureBufferHandle getHandle() const { return handle; }


protected:
TextureBufferHandle handle;
};
Expand Down Expand Up @@ -121,7 +122,6 @@ class GLFrameBuffer : public FrameBuffer {

protected:
FrameBufferHandle handle;

};


Expand Down Expand Up @@ -251,10 +251,12 @@ class GLEngine : public Engine {
void bindDisplay() override;
void swapDisplayBuffers() override;
std::vector<unsigned char> readDisplayBuffer() override;
void blitFinalSceneToScreen() override;

// Manage render state
void setDepthMode(DepthMode newMode = DepthMode::Less) override;
void setBlendMode(BlendMode newMode = BlendMode::Over) override;
void setColorMask(std::array<bool, 4> mask = {true, true, true, true}) override;

// === Windowing and framework things
void makeContextCurrent() override;
Expand Down Expand Up @@ -283,6 +285,9 @@ class GLEngine : public Engine {
unsigned char* data = nullptr) override; // 2d
std::shared_ptr<TextureBuffer> generateTextureBuffer(TextureFormat format, unsigned int sizeX_, unsigned int sizeY_,
float* data) override; // 2d
std::shared_ptr<TextureBuffer> generateTextureBufferMultisample(TextureFormat format, unsigned int sizeX_,
unsigned int sizeY_,
unsigned int nSamples) override; // 2d

// create render buffers
std::shared_ptr<RenderBuffer> generateRenderBuffer(RenderBufferType type, unsigned int sizeX_,
Expand All @@ -298,8 +303,6 @@ class GLEngine : public Engine {
protected:
// Helpers

// Internal members
std::vector<FrameBufferHandle> activeRenderBufferStack;

// Internal windowing and engine details
GLFWwindow* mainWindow = nullptr;
Expand Down
1 change: 0 additions & 1 deletion include/polyscope/view.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ glm::mat4 getCameraViewMatrix();
glm::mat4 getCameraPerspectiveMatrix();
glm::vec3 getCameraWorldPosition();
void getCameraFrame(glm::vec3& lookDir, glm::vec3& upDir, glm::vec3& rightDir);
glm::vec4 getViewport();


// Flight-related
Expand Down
4 changes: 2 additions & 2 deletions src/curve_network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,15 @@ void CurveNetwork::setCurveNetworkNodeUniforms(render::ShaderProgram& p) {
glm::mat4 P = view::getCameraPerspectiveMatrix();
glm::mat4 Pinv = glm::inverse(P);
p.setUniform("u_invProjMatrix", glm::value_ptr(Pinv));
p.setUniform("u_viewport", view::getViewport());
p.setUniform("u_viewport", render::engine->getSceneBufferViewport());
p.setUniform("u_pointRadius", getRadius());
}
void CurveNetwork::setCurveNetworkEdgeUniforms(render::ShaderProgram& p) {
glm::mat4 P = view::getCameraPerspectiveMatrix();
glm::mat4 Pinv = glm::inverse(P);
p.setUniform("u_invProjMatrix", glm::value_ptr(Pinv));
p.setUniform("u_viewport", view::getViewport());
p.setUniform("u_viewport", render::engine->getSceneBufferViewport());
p.setUniform("u_radius", getRadius());
}
Expand Down
2 changes: 1 addition & 1 deletion src/curve_network_vector_quantity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ void CurveNetworkVectorQuantity::draw() {
glm::mat4 P = view::getCameraPerspectiveMatrix();
glm::mat4 Pinv = glm::inverse(P);
program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv));
program->setUniform("u_viewport", view::getViewport());
program->setUniform("u_viewport", render::engine->getSceneBufferViewport());
program->draw();
}
Expand Down
2 changes: 1 addition & 1 deletion src/point_cloud.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ void PointCloud::setPointCloudUniforms(render::ShaderProgram& p) {
glm::mat4 Pinv = glm::inverse(P);
p.setUniform("u_pointRadius", pointRadius.get().asAbsolute());
p.setUniform("u_invProjMatrix", glm::value_ptr(Pinv));
p.setUniform("u_viewport", view::getViewport());
p.setUniform("u_viewport", render::engine->getSceneBufferViewport());
}
void PointCloud::draw() {
Expand Down
2 changes: 1 addition & 1 deletion src/point_cloud_vector_quantity.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ void PointCloudVectorQuantity::draw() {
glm::mat4 P = view::getCameraPerspectiveMatrix();
glm::mat4 Pinv = glm::inverse(P);
program->setUniform("u_invProjMatrix", glm::value_ptr(Pinv));
program->setUniform("u_viewport", view::getViewport());
program->setUniform("u_viewport", render::engine->getSceneBufferViewport());

program->draw();
}
Expand Down
7 changes: 4 additions & 3 deletions src/polyscope.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -349,11 +349,13 @@ void renderScene() {
}

drawStructures();

render::engine->sceneBufferFinal->bindForRendering();
render::engine->lightSceneBuffer();
}

void renderSceneToScreen() {
render::engine->bindDisplay();
render::engine->lightSceneBuffer();
render::engine->blitFinalSceneToScreen();
}

void buildPolyscopeGui() {
Expand Down Expand Up @@ -532,7 +534,6 @@ void draw(bool withUI) {

// Build the GUI components
if (withUI) {
// ImGui::ShowDemoWindow();

// The common case, rendering UI and structures
if (contextStack.size() == 1) {
Expand Down
53 changes: 42 additions & 11 deletions src/render/engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,17 @@ void FrameBuffer::setViewport(int startX, int startY, unsigned int sizeX, unsign
}

void FrameBuffer::resizeBuffers(unsigned int newXSize, unsigned int newYSize) {
bind();
for (auto& b : renderBuffers) {
bind();
for (auto& b : renderBuffersColor) {
b->resize(newXSize, newYSize);
}
for (auto& b : textureBuffers) {
for (auto& b : renderBuffersDepth) {
b->resize(newXSize, newYSize);
}
for (auto& b : textureBuffersColor) {
b->resize(newXSize, newYSize);
}
for (auto& b : textureBuffersDepth) {
b->resize(newXSize, newYSize);
}
}
Expand Down Expand Up @@ -88,9 +94,13 @@ void Engine::buildEngineGui() {
ImGui::EndCombo();
}

ImGui::SliderFloat("exposure", &exposure, 0.1, 5.0, "%.3f", 2.);
ImGui::SliderFloat("white level", &whiteLevel, 0.0, 5.0, "%.3f", 2.);
ImGui::SliderFloat("gamma", &gamma, 0.1, 5.0, "%.3f", 2.);
ImGui::Text("Tone mapping");
ImGui::SliderFloat("exposure", &exposure, 0.1, 2.0, "%.3f", 2.);
ImGui::SliderFloat("white level", &whiteLevel, 0.0, 2.0, "%.3f", 2.);
ImGui::SliderFloat("gamma", &gamma, 0.5, 3.0, "%.3f", 2.);

ImGui::Text("Anti-aliasing");
if (ImGui::InputInt("SSAA", &ssaaFactor, 1)) resizeSceneBuffer(view::bufferWidth, view::bufferHeight);

groundPlane.buildGui();
}
Expand All @@ -103,14 +113,20 @@ void Engine::setBackgroundAlpha(float newAlpha) {
// TODO
}

// bool Engine::bindSceneBuffer() { return sceneBuffer->bindForRendering(); }

void Engine::clearSceneBuffer() { sceneBuffer->clear(); }
void Engine::clearSceneBuffer() {
sceneBuffer->clear();
sceneBufferFinal->clear();
}

void Engine::resizeSceneBuffer(int width, int height) { sceneBuffer->resizeBuffers(width, height); }
void Engine::resizeSceneBuffer(int width, int height) {
sceneBuffer->resizeBuffers(ssaaFactor * width, ssaaFactor * height);
sceneBufferFinal->resizeBuffers(ssaaFactor * width, ssaaFactor * height);
}

void Engine::setSceneBufferViewport(int xStart, int yStart, int sizeX, int sizeY) {
sceneBuffer->setViewport(xStart, yStart, sizeX, sizeY);
sceneBuffer->setViewport(ssaaFactor * xStart, ssaaFactor * yStart, ssaaFactor * sizeX, ssaaFactor * sizeY);
sceneBufferFinal->setViewport(ssaaFactor * xStart, ssaaFactor * yStart, ssaaFactor * sizeX, ssaaFactor * sizeY);
}

bool Engine::bindSceneBuffer() { return sceneBuffer->bindForRendering(); }
Expand Down Expand Up @@ -155,7 +171,7 @@ void Engine::allocateGlobalBuffersAndPrograms() {
{ // Scene buffer

// Note that this is basically duplicated in ground_plane.cpp, changes here should probably be reflected there
sceneColor = generateTextureBuffer(TextureFormat::RGBA16F, view::bufferWidth, view::bufferHeight);
sceneColor = generateTextureBufferMultisample(TextureFormat::RGBA16F, view::bufferWidth, view::bufferHeight, 1);
sceneDepth = generateRenderBuffer(RenderBufferType::Depth, view::bufferWidth, view::bufferHeight);

sceneBuffer = generateFrameBuffer();
Expand All @@ -167,6 +183,17 @@ void Engine::allocateGlobalBuffersAndPrograms() {
sceneBuffer->clearAlpha = 0.0;
}

{ // "Final" scene buffer (after lighting)
sceneColorFinal = generateTextureBuffer(TextureFormat::RGBA16F, view::bufferWidth, view::bufferHeight);

sceneBufferFinal = generateFrameBuffer();
sceneBufferFinal->addColorBuffer(sceneColorFinal);
sceneBufferFinal->setDrawBuffers();

sceneBufferFinal->clearColor = glm::vec3{1., 1., 1.};
sceneBufferFinal->clearAlpha = 0.0;
}

{ // Pick buffer
pickColorBuffer = generateRenderBuffer(RenderBufferType::Float4, view::bufferWidth, view::bufferHeight);
pickDepthBuffer = generateRenderBuffer(RenderBufferType::Depth, view::bufferWidth, view::bufferHeight);
Expand Down Expand Up @@ -201,6 +228,10 @@ void Engine::allocateGlobalBuffersAndPrograms() {
}
}

glm::vec4 Engine::getSceneBufferViewport() {
return glm::vec4{0., 0., ssaaFactor * view::bufferWidth, ssaaFactor * view::bufferHeight};
}

std::vector<glm::vec3> Engine::screenTrianglesCoords() {
std::vector<glm::vec3> coords = {{-1.0f, -1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {-1.0f, 1.0f, 0.0f},
{-1.0f, 1.0f, 0.0f}, {1.0f, -1.0f, 0.0f}, {1.0f, 1.0f, 0.0f}};
Expand Down
Loading

0 comments on commit 0e73922

Please sign in to comment.