62 lines
1.4 KiB
C++
62 lines
1.4 KiB
C++
#ifndef DEFERREDPIPELINE_H
|
|
#define DEFERREDPIPELINE_H
|
|
|
|
#include "pipeline.h"
|
|
#include "framebuffer.h"
|
|
#include <unordered_map>
|
|
|
|
class Shader;
|
|
class Camera;
|
|
|
|
class GBuffer : public FrameBuffer
|
|
{
|
|
public:
|
|
enum Buffers { NORMAL, DIFFUSE, SPECULAR, POSITION, DEPTH, NB_BUFFERS };
|
|
GBuffer(int width, int height);
|
|
void bindTextures();
|
|
void unbindTextures();
|
|
};
|
|
|
|
class LightingBuffer : public FrameBuffer
|
|
{
|
|
public:
|
|
LightingBuffer(int width, int height);
|
|
};
|
|
|
|
class DeferredPipeline : public Pipeline
|
|
{
|
|
Camera *m_camera;
|
|
|
|
int m_width;
|
|
int m_height;
|
|
|
|
// shaders
|
|
std::vector<unsigned int> m_meshTypes;
|
|
std::vector<unsigned int> m_lightTypes;
|
|
|
|
std::unordered_map<unsigned int, Shader*> m_meshShaders;
|
|
std::unordered_map<unsigned int, Shader*> m_lightShaders;
|
|
|
|
ShaderSource *m_gBufferSource;
|
|
ShaderSource *m_lightingSource;
|
|
Shader *m_postEffectsShader;
|
|
|
|
// framebuffers
|
|
GBuffer *m_gBuffer;
|
|
LightingBuffer *m_lightingBuffer;
|
|
const FrameBuffer *m_renderTarget;
|
|
|
|
public:
|
|
DeferredPipeline();
|
|
|
|
void setCamera(Camera *camera) { m_camera = camera; }
|
|
void setSources(ShaderSource *gBufferSource, ShaderSource *lightingSource, Shader *postEffectsShader);
|
|
void setRenderTarget(const FrameBuffer *fbo) { m_renderTarget = fbo; }
|
|
void refreshScene(Scene *scene);
|
|
|
|
virtual void renderGL(Scene *scene);
|
|
virtual void resizeGL(int w, int h);
|
|
};
|
|
|
|
#endif // DEFERREDPIPELINE_H
|