wiggling around with the whole notion of what a renderer does and what not. Added simple wrapper for GLFWmonitor named display
This commit is contained in:
parent
3cc0fde1e1
commit
9773103a18
13 changed files with 252 additions and 148 deletions
|
@ -2,13 +2,14 @@
|
|||
set(hdrs
|
||||
include/pw/visual/mesh_renderer.hpp
|
||||
include/pw/visual/shader.hpp
|
||||
include/pw/visual/context.hpp
|
||||
include/pw/visual/pipeline.hpp
|
||||
)
|
||||
|
||||
set(srcs
|
||||
src/mesh_renderer.cpp
|
||||
src/shader.cpp
|
||||
src/context.cpp
|
||||
src/pipeline.cpp
|
||||
)
|
||||
|
||||
add_library(pwvisual
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef PW_VISUAL_RENDERER_HPP
|
||||
#define PW_VISUAL_RENDERER_HPP
|
||||
#ifndef PW_VISUAL_MESH_RENDERER_HPP
|
||||
#define PW_VISUAL_MESH_RENDERER_HPP
|
||||
|
||||
#include <pw/core/matrix.hpp>
|
||||
#include <pw/core/mesh.hpp>
|
||||
|
|
13
src/visual/include/pw/visual/pipeline.hpp
Normal file
13
src/visual/include/pw/visual/pipeline.hpp
Normal file
|
@ -0,0 +1,13 @@
|
|||
#ifndef PW_VISUAL_PIPELINE_HPP
|
||||
#define PW_VISUAL_PIPELINE_HPP
|
||||
|
||||
#include <pw/core/matrix.hpp>
|
||||
#include <pw/core/mesh.hpp>
|
||||
|
||||
#include <map>
|
||||
|
||||
namespace pw {
|
||||
|
||||
}
|
||||
|
||||
#endif
|
|
@ -65,114 +65,6 @@ struct mesh_renderer::impl {
|
|||
};
|
||||
|
||||
|
||||
struct renderer {
|
||||
|
||||
sizei _size;
|
||||
|
||||
GLuint _fbo_draw;
|
||||
GLuint _fbo_msaa;
|
||||
|
||||
GLuint rboColorId;
|
||||
GLuint rboDepthId;
|
||||
|
||||
bool create()
|
||||
{
|
||||
int max_msaa;
|
||||
|
||||
// query actual maximum MSAA
|
||||
glGetIntegerv(GL_MAX_SAMPLES,&max_msaa);
|
||||
|
||||
// create a 4x MSAA renderbuffer object for colorbuffer
|
||||
int msaa = 4;
|
||||
|
||||
// msaa = std::clamp(msaa,max_msaa);
|
||||
|
||||
glGenRenderbuffers(1, &rboColorId);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rboColorId);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_RGB8, _size.width, _size.height);
|
||||
|
||||
// create a 4x MSAA renderbuffer object for depthbuffer
|
||||
|
||||
glGenRenderbuffers(1, &rboDepthId);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rboDepthId);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_DEPTH_COMPONENT, _size.width, _size.height);
|
||||
|
||||
// create a 4x MSAA framebuffer object
|
||||
glGenFramebuffers(1, &_fbo_msaa);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _fbo_msaa);
|
||||
|
||||
// attach colorbuffer image to FBO
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||
GL_COLOR_ATTACHMENT0, // 2. color attachment point
|
||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||
rboColorId); // 4. rbo ID
|
||||
|
||||
// attach depthbuffer image to FBO
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||
GL_DEPTH_ATTACHMENT, // 2. depth attachment point
|
||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||
rboDepthId); // 4. rbo ID
|
||||
|
||||
// check FBO status
|
||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
/* We are going to blit into the window (default framebuffer) */
|
||||
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
|
||||
glDrawBuffer (GL_BACK); /* Use backbuffer as color dst. */
|
||||
|
||||
/* Read from your FBO */
|
||||
glBindFramebuffer (GL_READ_FRAMEBUFFER, _fbo_draw );
|
||||
glReadBuffer (GL_COLOR_ATTACHMENT0); /* Use Color Attachment 0 as color src. */
|
||||
|
||||
/* Copy the color and depth buffer from your FBO to the default framebuffer */
|
||||
glBlitFramebuffer (0,0, _size.width, _size.height,
|
||||
0,0, _size.width, _size.height,
|
||||
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
|
||||
GL_NEAREST);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
class pipeline;
|
||||
|
||||
class pass
|
||||
{
|
||||
public:
|
||||
virtual void apply(pipeline& p);
|
||||
};
|
||||
|
||||
class pipeline
|
||||
{
|
||||
|
||||
public:
|
||||
void apply()
|
||||
{
|
||||
for (auto p : _passes) p.apply(*this);
|
||||
}
|
||||
|
||||
protected:
|
||||
std::vector<pass> _passes;
|
||||
};
|
||||
|
||||
|
||||
|
||||
//pipeline >
|
||||
// n*pass
|
||||
// shadow_pass
|
||||
// lighting_pass
|
||||
// mesh_pass
|
||||
// compositor_pass
|
||||
|
||||
//compositor
|
||||
// render to fbo > add a
|
||||
// glBlitFramebuffer .. https://stackoverflow.com/questions/29254574/using-glblitframebuffer-to-display-a-texture
|
||||
|
||||
|
||||
}
|
||||
|
|
124
src/visual/src/pipeline.cpp
Normal file
124
src/visual/src/pipeline.cpp
Normal file
|
@ -0,0 +1,124 @@
|
|||
#include "pw/core/size.hpp"
|
||||
#include "pw/core/matrix.hpp"
|
||||
|
||||
#include "glad/glad.h"
|
||||
|
||||
namespace pw {
|
||||
|
||||
struct pipeline {
|
||||
|
||||
sizei _size;
|
||||
|
||||
GLuint _fbo_draw;
|
||||
GLuint _fbo_msaa;
|
||||
|
||||
GLuint rboColorId;
|
||||
GLuint rboDepthId;
|
||||
|
||||
bool create()
|
||||
{
|
||||
int max_msaa;
|
||||
|
||||
// query actual maximum MSAA
|
||||
glGetIntegerv(GL_MAX_SAMPLES,&max_msaa);
|
||||
|
||||
// create a 4x MSAA renderbuffer object for colorbuffer
|
||||
int msaa = 4;
|
||||
|
||||
// msaa = std::clamp(msaa,max_msaa);
|
||||
|
||||
glGenRenderbuffers(1, &rboColorId);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rboColorId);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_RGB8, _size.width, _size.height);
|
||||
|
||||
// create a 4x MSAA renderbuffer object for depthbuffer
|
||||
|
||||
glGenRenderbuffers(1, &rboDepthId);
|
||||
glBindRenderbuffer(GL_RENDERBUFFER, rboDepthId);
|
||||
glRenderbufferStorageMultisample(GL_RENDERBUFFER, msaa, GL_DEPTH_COMPONENT, _size.width, _size.height);
|
||||
|
||||
// create a 4x MSAA framebuffer object
|
||||
glGenFramebuffers(1, &_fbo_msaa);
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, _fbo_msaa);
|
||||
|
||||
// attach colorbuffer image to FBO
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||
GL_COLOR_ATTACHMENT0, // 2. color attachment point
|
||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||
rboColorId); // 4. rbo ID
|
||||
|
||||
// attach depthbuffer image to FBO
|
||||
glFramebufferRenderbuffer(GL_FRAMEBUFFER, // 1. fbo target: GL_FRAMEBUFFER
|
||||
GL_DEPTH_ATTACHMENT, // 2. depth attachment point
|
||||
GL_RENDERBUFFER, // 3. rbo target: GL_RENDERBUFFER
|
||||
rboDepthId); // 4. rbo ID
|
||||
|
||||
// check FBO status
|
||||
if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void draw()
|
||||
{
|
||||
/* We are going to blit into the window (default framebuffer) */
|
||||
glBindFramebuffer (GL_DRAW_FRAMEBUFFER, 0);
|
||||
glDrawBuffer (GL_BACK); /* Use backbuffer as color dst. */
|
||||
|
||||
/* Read from your FBO */
|
||||
glBindFramebuffer (GL_READ_FRAMEBUFFER, _fbo_draw );
|
||||
glReadBuffer (GL_COLOR_ATTACHMENT0); /* Use Color Attachment 0 as color src. */
|
||||
|
||||
/* Copy the color and depth buffer from your FBO to the default framebuffer */
|
||||
glBlitFramebuffer (0,0, _size.width, _size.height,
|
||||
0,0, _size.width, _size.height,
|
||||
GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT,
|
||||
GL_NEAREST);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//class pipeline;
|
||||
|
||||
//class pass
|
||||
//{
|
||||
//public:
|
||||
// virtual void apply(pipeline& p);
|
||||
//};
|
||||
|
||||
//class pipeline
|
||||
//{
|
||||
|
||||
//public:
|
||||
// void apply()
|
||||
// {
|
||||
// for (auto p : _passes) p.apply(*this);
|
||||
// }
|
||||
|
||||
//protected:
|
||||
// std::vector<pass> _passes;
|
||||
//};
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//pipeline >
|
||||
// n*pass
|
||||
// shadow_pass
|
||||
// lighting_pass
|
||||
// mesh_pass
|
||||
// compositor_pass
|
||||
|
||||
//compositor
|
||||
// render to fbo > add a
|
||||
// glBlitFramebuffer .. https://stackoverflow.com/questions/29254574/using-glblitframebuffer-to-display-a-texture
|
Loading…
Add table
Add a link
Reference in a new issue