| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #include <boost/lexical_cast.hpp>
- #include "Hdr.h"
- #include "Renderer.h"
- #include "RendererInitializer.h"
- //======================================================================================================================
- // initFbos =
- //======================================================================================================================
- void Hdr::initFbos(Fbo& fbo, Texture& fai, int internalFormat)
- {
- int width = renderingQuality * r.getWidth();
- int height = renderingQuality * r.getHeight();
- // create FBO
- fbo.create();
- fbo.bind();
- // inform in what buffers we draw
- fbo.setNumOfColorAttachements(1);
- // create the texes
- fai.createEmpty2D(width, height, internalFormat, GL_RGB, GL_FLOAT);
- fai.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- fai.setTexParameter(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- // attach
- glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fai.getGlId(), 0);
- // test if success
- if(!fbo.isGood())
- FATAL("Cannot create deferred shading post-processing stage HDR passes FBO");
- // unbind
- fbo.unbind();
- }
- //======================================================================================================================
- // init =
- //======================================================================================================================
- void Hdr::init(const RendererInitializer& initializer)
- {
- enabled = initializer.pps.hdr.enabled;
- if(!enabled)
- return;
- renderingQuality = initializer.pps.hdr.renderingQuality;
- blurringDist = initializer.pps.hdr.blurringDist;
- initFbos(toneFbo, pass0Fai, GL_RGB);
- initFbos(pass1Fbo, pass1Fai, GL_RGB);
- initFbos(pass2Fbo, fai, GL_RGB);
- fai.setTexParameter(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // init shaders
- toneSProg.loadRsrc("shaders/PpsHdr.glsl");
- toneProgFaiUniVar = toneSProg->findUniVar("fai");
- const char* SHADER_FILENAME = "shaders/GaussianBlurGeneric.glsl";
- string pps = "#define HPASS\n#define COL_RGB\n";
- string prefix = "HRGB";
- pass1SProg.loadRsrc(ShaderProg::createSrcCodeToCache(SHADER_FILENAME, pps.c_str(), prefix.c_str()).c_str());
- pass1SProgFaiUniVar = pass1SProg->findUniVar("img");
- pps = "#define VPASS\n#define COL_RGB\n";
- prefix = "VRGB";
- pass2SProg.loadRsrc(ShaderProg::createSrcCodeToCache(SHADER_FILENAME, pps.c_str(), prefix.c_str()).c_str());
- pass2SProgFaiUniVar = pass2SProg->findUniVar("img");
- }
- #include "App.h"
- //======================================================================================================================
- // runPass =
- //======================================================================================================================
- void Hdr::run()
- {
- int w = renderingQuality * r.getWidth();
- int h = renderingQuality * r.getHeight();
- Renderer::setViewport(0, 0, w, h);
- glDisable(GL_BLEND);
- glDisable(GL_DEPTH_TEST);
- // pass 0
- toneFbo.bind();
- toneSProg->bind();
- r.is.fai.setRepeat(false);
- toneProgFaiUniVar->setTexture(r.pps.prePassFai, 0);
- Renderer::drawQuad(0);
- Vec2 imgSize(w, h);
- for(uint i=0; i<2; i++)
- {
- // hpass
- pass1Fbo.bind();
- pass1SProg->bind();
- if(i == 0)
- {
- pass1SProgFaiUniVar->setTexture(pass0Fai, 0);
- }
- else
- {
- pass1SProgFaiUniVar->setTexture(fai, 0);
- }
- pass1SProg->findUniVar("imgSize")->setVec2(&imgSize);
- pass1SProg->findUniVar("blurringDist")->setFloat(blurringDist);
- Renderer::drawQuad(0);
- // vpass
- pass2Fbo.bind();
- pass2SProg->bind();
- pass2SProgFaiUniVar->setTexture(pass1Fai, 0);
- pass2SProg->findUniVar("imgSize")->setVec2(&imgSize);
- pass2SProg->findUniVar("blurringDist")->setFloat(blurringDist);
- Renderer::drawQuad(0);
- }
- // end
- Fbo::unbind();
- }
|