deferred pipeline now handles 2D mesh as gui objects
This commit is contained in:
parent
78a2720a82
commit
cfa3859cba
@ -86,6 +86,9 @@ DeferredPipeline::DeferredPipeline() :
|
|||||||
m_lightingSource = new ShaderSource();
|
m_lightingSource = new ShaderSource();
|
||||||
m_lightingSource->setSource(shaderMap["shaders/lighting.vert.glsl"], ShaderSource::VERTEX);
|
m_lightingSource->setSource(shaderMap["shaders/lighting.vert.glsl"], ShaderSource::VERTEX);
|
||||||
m_lightingSource->setSource(shaderMap["shaders/lighting.frag.glsl"], ShaderSource::FRAGMENT);
|
m_lightingSource->setSource(shaderMap["shaders/lighting.frag.glsl"], ShaderSource::FRAGMENT);
|
||||||
|
m_mesh2DSource = new ShaderSource();
|
||||||
|
m_mesh2DSource->setSource(shaderMap["shaders/gui.vert.glsl"], ShaderSource::VERTEX);
|
||||||
|
m_mesh2DSource->setSource(shaderMap["shaders/gui.frag.glsl"], ShaderSource::FRAGMENT);
|
||||||
std::string vertSource = shaderMap["shaders/posteffects.vert.glsl"];
|
std::string vertSource = shaderMap["shaders/posteffects.vert.glsl"];
|
||||||
std::string fragSource = shaderMap["shaders/posteffects.frag.glsl"];
|
std::string fragSource = shaderMap["shaders/posteffects.frag.glsl"];
|
||||||
m_postEffectsShader = new Shader(vertSource, fragSource);
|
m_postEffectsShader = new Shader(vertSource, fragSource);
|
||||||
@ -95,8 +98,9 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
{
|
{
|
||||||
if(m_renderTarget == NULL)
|
if(m_renderTarget == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// GEOMETRY PASS
|
// GEOMETRY PASS
|
||||||
|
std::vector<GeometryNode*> mesh2D;
|
||||||
m_gBuffer->bindFBO();
|
m_gBuffer->bindFBO();
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glDepthFunc(GL_LESS);
|
glDepthFunc(GL_LESS);
|
||||||
@ -109,12 +113,17 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
for(SceneIterator<GeometryNode*>* geometryIt = scene->getGeometry();
|
for(SceneIterator<GeometryNode*>* geometryIt = scene->getGeometry();
|
||||||
geometryIt->isValid(); geometryIt->next())
|
geometryIt->isValid(); geometryIt->next())
|
||||||
{
|
{
|
||||||
|
|
||||||
GeometryNode* node = geometryIt->getItem();
|
GeometryNode* node = geometryIt->getItem();
|
||||||
Shader *shader = m_meshShaders[node->mesh->getFlags()];
|
unsigned int type = node->mesh->getFlags();
|
||||||
|
if(type & (1 << Mesh::MESH_2D))
|
||||||
|
{
|
||||||
|
mesh2D.push_back(node);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Shader *shader = m_mesh3DShaders[node->mesh->getFlags()];
|
||||||
if(shader == NULL)
|
if(shader == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "no shader to render this geometry, please use refreshScene to generate the shader\n");
|
fprintf(stderr, "no shader to render this 3D geometry, please call refreshScene to generate the shader\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
shader->bind();
|
shader->bind();
|
||||||
@ -148,7 +157,7 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
Shader *shader = m_lightShaders[light->getFlags()];
|
Shader *shader = m_lightShaders[light->getFlags()];
|
||||||
if(shader == NULL)
|
if(shader == NULL)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "no shader to render this light, please use refreshScene to generate the shader\n");
|
fprintf(stderr, "no shader to render this light, please call refreshScene to generate the shader\n");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
shader->bind();
|
shader->bind();
|
||||||
@ -168,15 +177,32 @@ void DeferredPipeline::renderGL(Scene *scene)
|
|||||||
}
|
}
|
||||||
m_gBuffer->unbindTextures();
|
m_gBuffer->unbindTextures();
|
||||||
|
|
||||||
// post effects pass
|
// POST EFFECTS PASS
|
||||||
m_renderTarget->bindFBO();
|
m_renderTarget->bindFBO();
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
m_lightingBuffer->getTexture(0)->bind(0);
|
m_lightingBuffer->getTexture(0)->bind(0);
|
||||||
m_postEffectsShader->bind();
|
m_postEffectsShader->bind();
|
||||||
m_postEffectsShader->bindInteger(m_postEffectsShader->getLocation("lightBuffer"), 0);
|
m_postEffectsShader->bindInteger(m_postEffectsShader->getLocation("lightBuffer"), 0);
|
||||||
// TODO : send uniforms
|
|
||||||
SparrowRenderer::drawQuad();
|
SparrowRenderer::drawQuad();
|
||||||
m_lightingBuffer->getTexture(0)->unbind();
|
m_lightingBuffer->getTexture(0)->unbind();
|
||||||
|
|
||||||
|
// 2D GUI PASS
|
||||||
|
glClear(GL_DEPTH_BUFFER_BIT);
|
||||||
|
for(GeometryNode* node : mesh2D)
|
||||||
|
{
|
||||||
|
Shader *shader = m_mesh2DShaders[node->mesh->getFlags()];
|
||||||
|
if(shader == NULL)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "no shader to render this 2D geometry, please call refreshScene to generate the shader\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
shader->bind();
|
||||||
|
|
||||||
|
shader->bindMat4(shader->getLocation("orthoMatrix"), m_orthoMatrix);
|
||||||
|
shader->bindMat4(shader->getLocation("transformMatrix"), node->modelMatrix);
|
||||||
|
// draw geometry
|
||||||
|
node->mesh->draw(shader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredPipeline::resizeGL(int w, int h)
|
void DeferredPipeline::resizeGL(int w, int h)
|
||||||
@ -193,9 +219,10 @@ void DeferredPipeline::resizeGL(int w, int h)
|
|||||||
}
|
}
|
||||||
m_gBuffer = new GBuffer(w, h);
|
m_gBuffer = new GBuffer(w, h);
|
||||||
m_lightingBuffer = new LightingBuffer(w, h);
|
m_lightingBuffer = new LightingBuffer(w, h);
|
||||||
|
m_orthoMatrix = glm::ortho(0.f, float(m_width), float(m_height), 0.f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DeferredPipeline::setSources(ShaderSource *gBufferSource, ShaderSource *lightingSource, Shader *postEffectsShader)
|
void DeferredPipeline::setSources(ShaderSource *gBufferSource, ShaderSource *lightingSource, ShaderSource *guiSource, Shader *postEffectsShader)
|
||||||
{
|
{
|
||||||
if(m_gBufferSource != NULL)
|
if(m_gBufferSource != NULL)
|
||||||
delete m_gBufferSource;
|
delete m_gBufferSource;
|
||||||
@ -203,6 +230,9 @@ void DeferredPipeline::setSources(ShaderSource *gBufferSource, ShaderSource *lig
|
|||||||
if(m_lightingSource != NULL)
|
if(m_lightingSource != NULL)
|
||||||
delete m_lightingSource;
|
delete m_lightingSource;
|
||||||
m_lightingSource = lightingSource;
|
m_lightingSource = lightingSource;
|
||||||
|
if(m_mesh2DSource != NULL)
|
||||||
|
delete m_mesh2DSource;
|
||||||
|
m_mesh2DSource = guiSource;
|
||||||
if(m_postEffectsShader != NULL)
|
if(m_postEffectsShader != NULL)
|
||||||
delete m_postEffectsShader;
|
delete m_postEffectsShader;
|
||||||
m_postEffectsShader = postEffectsShader;
|
m_postEffectsShader = postEffectsShader;
|
||||||
@ -210,13 +240,18 @@ void DeferredPipeline::setSources(ShaderSource *gBufferSource, ShaderSource *lig
|
|||||||
|
|
||||||
void DeferredPipeline::refreshScene(Scene *scene)
|
void DeferredPipeline::refreshScene(Scene *scene)
|
||||||
{
|
{
|
||||||
for(auto it : m_meshShaders)
|
for(auto it : m_mesh3DShaders)
|
||||||
delete it.second;
|
delete it.second;
|
||||||
m_meshShaders.clear();
|
m_mesh3DShaders.clear();
|
||||||
m_meshTypes.clear();
|
m_meshTypes.clear();
|
||||||
scene->getMeshTypes(m_meshTypes);
|
scene->getMeshTypes(m_meshTypes);
|
||||||
for(unsigned int type : m_meshTypes)
|
for(unsigned int type : m_meshTypes)
|
||||||
m_meshShaders[type] = m_gBufferSource->compile(type, 0);
|
{
|
||||||
|
if(type & (1 << Mesh::MESH_2D))
|
||||||
|
m_mesh2DShaders[type] = m_mesh2DSource->compile(type, 0);
|
||||||
|
else
|
||||||
|
m_mesh3DShaders[type] = m_gBufferSource->compile(type, 0);
|
||||||
|
}
|
||||||
|
|
||||||
for(auto it : m_lightShaders)
|
for(auto it : m_lightShaders)
|
||||||
delete it.second;
|
delete it.second;
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "pipeline.h"
|
#include "pipeline.h"
|
||||||
#include "framebuffer.h"
|
#include "framebuffer.h"
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <glm/mat4x4.hpp>
|
||||||
|
|
||||||
class Shader;
|
class Shader;
|
||||||
class Camera;
|
class Camera;
|
||||||
@ -30,16 +31,20 @@ class DeferredPipeline : public Pipeline
|
|||||||
int m_width;
|
int m_width;
|
||||||
int m_height;
|
int m_height;
|
||||||
|
|
||||||
|
glm::mat4 m_orthoMatrix;
|
||||||
|
|
||||||
// shaders
|
// shaders
|
||||||
std::vector<unsigned int> m_meshTypes;
|
std::vector<unsigned int> m_meshTypes;
|
||||||
std::vector<unsigned int> m_lightTypes;
|
std::vector<unsigned int> m_lightTypes;
|
||||||
|
|
||||||
std::unordered_map<unsigned int, Shader*> m_meshShaders;
|
std::unordered_map<unsigned int, Shader*> m_mesh3DShaders;
|
||||||
std::unordered_map<unsigned int, Shader*> m_lightShaders;
|
std::unordered_map<unsigned int, Shader*> m_lightShaders;
|
||||||
|
std::unordered_map<unsigned int, Shader*> m_mesh2DShaders;
|
||||||
|
|
||||||
ShaderSource *m_gBufferSource;
|
ShaderSource *m_gBufferSource;
|
||||||
ShaderSource *m_lightingSource;
|
ShaderSource *m_lightingSource;
|
||||||
Shader *m_postEffectsShader;
|
ShaderSource *m_mesh2DSource;
|
||||||
|
Shader *m_postEffectsShader; // TODELETE
|
||||||
|
|
||||||
// framebuffers
|
// framebuffers
|
||||||
GBuffer *m_gBuffer;
|
GBuffer *m_gBuffer;
|
||||||
@ -50,7 +55,7 @@ public:
|
|||||||
DeferredPipeline();
|
DeferredPipeline();
|
||||||
|
|
||||||
void setCamera(Camera *camera) { m_camera = camera; }
|
void setCamera(Camera *camera) { m_camera = camera; }
|
||||||
void setSources(ShaderSource *gBufferSource, ShaderSource *lightingSource, Shader *postEffectsShader);
|
void setSources(ShaderSource *gBufferSource, ShaderSource *lightingSource, ShaderSource *guiSource, Shader *postEffectsShader);
|
||||||
void setRenderTarget(const FrameBuffer *fbo) { m_renderTarget = fbo; }
|
void setRenderTarget(const FrameBuffer *fbo) { m_renderTarget = fbo; }
|
||||||
void refreshScene(Scene *scene);
|
void refreshScene(Scene *scene);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user