TiledLightRenderer::TiledLightRenderer(DeferredRenderer& deferred, bool hdr) : LightContextRenderer(deferred) { _tileCount = deferred.resolution() / TILE_SIZE; if(deferred.resolution().x() % TILE_SIZE.x() != 0) _tileCount.x()++; if(deferred.resolution().y() % TILE_SIZE.y() != 0) _tileCount.y()++; ShaderCompiler shader(ShaderCompiler::COMPUTE_SHADER); shader.setSource(StringUtils::readFile("shader/tiledLightShader.cs")); auto optShader = Shader::linkComputeShader(shader.compile({})); if(!optShader.hasValue()) { LOG("shader/tiledLightShader.cs error:\n", shader.error()); LOG("Link erorr:", Shader::lastLinkError()); } else _computeShader = optShader.value(); _computeShader->bind(); _nbLightUniformId = _computeShader->uniformLocation("nbLight"); Texture::GenTexParam param; param.format = Texture::RGB16; param.nbLevels = 1; param.size = uivec3(256,256,1); float* dat = new float[256*256*3]; std::ifstream inDat("shader/brdf_256.dat", std::ios_base::binary); inDat.read((char*)dat, sizeof(float)*256*256*3); _processedBrdf = Texture::genTexture2D(param, dat, 3); delete[] dat; }
void CinderDeferredRenderingApp::draw() { mDeferredRenderer.renderFullScreenQuad(RENDER_MODE); if (mShowParams) params::InterfaceGl::draw(); }
void DeferredRenderingApp::draw() { mDeferredRenderer.renderFullScreenQuad(RENDER_MODE); if (mShowParams) { mParams.draw(); } }
void renderScene() { // // camera // gCam.mFront = glm::vec3(gCam.mDir.x, 0.0f, gCam.mDir.z); gCam.mRight = glm::vec3(-gCam.mFront.z, 0.0f, gCam.mFront.x); gModelViewMatrix = glm::lookAt(gCam.mTarget - gCam.mDir*gCam.mZoom, gCam.mTarget, glm::vec3(0.0f, 1.0f, 0.0f)); gRenderer.beginGeometryStage(gProjectionMatrix); GLint mvLoc = gRenderer.geometryStageProgram()->getUniformLocation("modelviewMatrix"); GLint normLoc = gRenderer.geometryStageProgram()->getUniformLocation("normalMatrix"); geometryUtils::TransformState ts = geometryUtils::TransformState(mvLoc, normLoc, &gModelViewMatrix); ts.setState(); gScene.render(ts); gRenderer.endGeometryStage(); gRenderer.finalStage(gModelViewMatrix, gLights); gRenderer.displayTex(DeferredRenderer::ttColor, glm::vec4(0.8f, 0.8f, 0.15, 0.15)); gRenderer.displayTex(DeferredRenderer::ttNormal, glm::vec4(0.8f, 0.5f, 0.15, 0.15)); gRenderer.displayTex(DeferredRenderer::ttPos, glm::vec4(0.8f, 0.2f, 0.15, 0.15)); }
void ssaoApp::update() { mCam = mMayaCam.getCamera(); mDeferredRenderer.mCam = &mCam; float base = getElapsedSeconds(); vector<Light_PS*>::iterator it = mDeferredRenderer.getCubeLightsRef()->begin(); for(it; it != mDeferredRenderer.getCubeLightsRef()->end(); ++it) { Vec3f v = (*it)->getPos(); v.y = (40 + (sin(base) * 30.f)); (*it)->setPos(v); base += 1.f; } }
bool initApp() { glEnable(GL_DEPTH_TEST); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); srand((unsigned int)time(NULL)); if (gScene.init() == false) return false; if (gRenderer.init() == false) return false; for (int i = 0; i < NUM_LIGHTS; ++i) { float col = (float)(rand())/(float)RAND_MAX; float col2 = (float)(rand())/(float)RAND_MAX; float rad = (float)(rand())/(float)RAND_MAX; float speed = (float)(rand())/(float)RAND_MAX; gLights.push_back(DeferredLight(col, col2, col*col2, col, col, col2, col*100.0f)); gLightAngles.push_back(glm::vec4(5.0f+rad*20.0f, 5.0f+col*20.0f, col2*5.0f, speed+0.5f)); } // // tweaks // gCam.mTarget = glm::vec3(0.0f, 0.0f, 0.0f); gCam.mDir = glm::vec3(0.0f, -0.5f, -1.0f); TwAddVarRW(gMainTweakBar, "camera dir", TW_TYPE_DIR3F, &gCam.mDir.x, ""); gCam.mZoom = 7.0f; TwAddVarRW(gMainTweakBar, "zoom", TW_TYPE_FLOAT, &gCam.mZoom, "min=0.1 max=30.0 step=0.05"); gAnimate = true; TwAddVarRW(gMainTweakBar, "animate", TW_TYPE_BOOLCPP, &gAnimate, ""); return true; }
void DeferredRenderingApp::setup() { //!!test texture for diffuse texture mEarthTex = gl::Texture( loadImage( loadResource( RES_TEX_EARTH ) ) ); gl::disableVerticalSync(); //so I can get a true representation of FPS (if higher than 60 anyhow :/) RENDER_MODE = DeferredRenderer::SHOW_FINAL_VIEW; mParams = params::InterfaceGl( "3D_Scene_Base", Vec2i( 225, 125 ) ); mParams.addParam( "Framerate", &mCurrFramerate, "", true ); mParams.addParam( "Selected Light Index", &mCurrLightIndex); mParams.addParam( "Show/Hide Params", &mShowParams, "key=x"); mParams.addSeparator(); mCurrFramerate = 0.0f; mShowParams = true; //set up camera mCam.setPerspective( 45.0f, getWindowAspectRatio(), 0.1f, 10000.0f ); mCam.lookAt(CAM_POSITION_INIT * 1.5f, Vec3f::zero(), Vec3f(0.0f, 1.0f, 0.0f) ); mCam.setCenterOfInterestPoint(Vec3f::zero()); mMayaCam.setCurrentCam(mCam); //create functions pointers to send to deferred renderer boost::function<void(gl::GlslProg*)> fRenderShadowCastersFunc = boost::bind( &DeferredRenderingApp::drawShadowCasters, this, boost::lambda::_1 ); boost::function<void(gl::GlslProg*)> fRenderNotShadowCastersFunc = boost::bind( &DeferredRenderingApp::drawNonShadowCasters, this, boost::lambda::_1 ); boost::function<void(void)> fRenderOverlayFunc = boost::bind( &DeferredRenderingApp::drawOverlay, this ); boost::function<void(void)> fRenderParticlesFunc = boost::bind( &DeferredRenderingApp::drawDepthParticles, this ); //NULL value represents the opportunity to a function pointer to an "overlay" method. Basically only basic textures can be used and it is overlayed onto the final scene. //see example of such a function (from another project) commented out at the bottom of this class ... mDeferredRenderer.setup( fRenderShadowCastersFunc, fRenderNotShadowCastersFunc, NULL, NULL, &mCam, Vec2i(APP_RES_HORIZONTAL, APP_RES_VERTICAL), 1024, true, true ); //no overlay or "particles" //mDeferredRenderer.setup( fRenderShadowCastersFunc, fRenderNotShadowCastersFunc, fRenderOverlayFunc, NULL, &mMayaCam, Vec2i(APP_RES_HORIZONTAL, APP_RES_VERTICAL), 1024, true, true ); //overlay enabled //mDeferredRenderer.setup( fRenderShadowCastersFunc, fRenderNotShadowCastersFunc, fRenderOverlayFunc, fRenderParticlesFunc, &mMayaCam, Vec2i(APP_RES_HORIZONTAL, APP_RES_VERTICAL), 1024, true, true ); //overlay and "particles" enabled -- not working yet //have these cast point light shadows mDeferredRenderer.addCubeLight( Vec3f(-2.0f, 4.0f, 6.0f), Color(0.10f, 0.69f, 0.93f) * LIGHT_BRIGHTNESS_DEFAULT, true); //blue mDeferredRenderer.addCubeLight( Vec3f(4.0f, 6.0f, -4.0f), Color(0.94f, 0.15f, 0.23f) * LIGHT_BRIGHTNESS_DEFAULT, true); //red //add a bunch of lights for(int i = 0; i < NUM_LIGHTS; i++) { int randColIndex = Rand::randInt(5); Color randCol; switch( randColIndex ) { case 0: randCol = Color(0.99f, 0.67f, 0.23f); //orange break; case 1: randCol = Color(0.97f, 0.24f, 0.85f); //pink break; case 2: randCol = Color(0.00f, 0.93f, 0.30f); //green break; case 3: randCol = Color(0.98f, 0.96f, 0.32f); //yellow break; case 4: randCol = Color(0.10f, 0.69f, 0.93f); //blue break; case 5: randCol = Color(0.94f, 0.15f, 0.23f); //red break; }; mDeferredRenderer.addCubeLight( Vec3f(Rand::randFloat(-1000.0f, 1000.0f),Rand::randFloat(0.0f, 50.0f),Rand::randFloat(-1000.0f, 1000.0f)), randCol * LIGHT_BRIGHTNESS_DEFAULT, false, true); } mCurrLightIndex = 0; }
void DeferredRenderingApp::keyDown( KeyEvent event ) { float lightMovInc = 0.1f; switch ( event.getCode() ) { //switch between render views case KeyEvent::KEY_0: {RENDER_MODE = DeferredRenderer::SHOW_FINAL_VIEW;} break; case KeyEvent::KEY_1: {RENDER_MODE = DeferredRenderer::SHOW_DIFFUSE_VIEW;} break; case KeyEvent::KEY_2: {RENDER_MODE = DeferredRenderer::SHOW_NORMALMAP_VIEW;} break; case KeyEvent::KEY_3: {RENDER_MODE = DeferredRenderer::SHOW_DEPTH_VIEW;} break; case KeyEvent::KEY_4: {RENDER_MODE = DeferredRenderer::SHOW_POSITION_VIEW;} break; case KeyEvent::KEY_5: {RENDER_MODE = DeferredRenderer::SHOW_ATTRIBUTE_VIEW;} break; case KeyEvent::KEY_6: {RENDER_MODE = DeferredRenderer::SHOW_SSAO_VIEW;} break; case KeyEvent::KEY_7: {RENDER_MODE = DeferredRenderer::SHOW_SSAO_BLURRED_VIEW;} break; case KeyEvent::KEY_8: {RENDER_MODE = DeferredRenderer::SHOW_LIGHT_VIEW;} break; case KeyEvent::KEY_9: {RENDER_MODE = DeferredRenderer::SHOW_SHADOWS_VIEW;} break; //change which cube you want to control case 269: { //minus key if( mDeferredRenderer.getNumCubeLights() > 0) { --mCurrLightIndex; if ( mCurrLightIndex < 0) mCurrLightIndex = mDeferredRenderer.getNumCubeLights() - 1; } } break; case 61: { if( mDeferredRenderer.getNumCubeLights() > 0) { //plus key ++mCurrLightIndex; if ( mCurrLightIndex > mDeferredRenderer.getNumCubeLights() - 1) mCurrLightIndex = 0; } } break; //move selected cube light case KeyEvent::KEY_UP: { if ( mDeferredRenderer.getNumCubeLights() > 0) { if(event.isShiftDown()) { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(0.0f, lightMovInc, 0.0f )); } else { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(0.0f, 0.0f, lightMovInc)); } } } break; case KeyEvent::KEY_DOWN: { if ( mDeferredRenderer.getNumCubeLights() > 0) { if(event.isShiftDown()) { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(0.0f, -lightMovInc, 0.0f )); } else { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(0.0f, 0.0, -lightMovInc)); } } } break; case KeyEvent::KEY_LEFT: { if ( mDeferredRenderer.getNumCubeLights() > 0) { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(lightMovInc, 0.0, 0.0f)); } } break; case KeyEvent::KEY_RIGHT: { if ( mDeferredRenderer.getNumCubeLights() > 0) { mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->setPos( mDeferredRenderer.getCubeLightsRef()->at(mCurrLightIndex)->getPos() + Vec3f(-lightMovInc, 0.0, 0.0f)); } } break; case KeyEvent::KEY_ESCAPE: { //never know when you need to quit quick exit(1); } break; default: break; } }
void ssaoApp::setup() { gl::disableVerticalSync(); RENDER_MODE = DeferredRenderer::SHOW_FINAL_VIEW; //set up camera mCam.setPerspective( 45.0f, getWindowAspectRatio(), 0.1f, 10000.0f ); Vec3f camPos( -14.0f, 7.0f, -14.0f ); mCam.lookAt(camPos * 1.5f, Vec3f::zero(), Vec3f(0.0f, 1.0f, 0.0f) ); mCam.setCenterOfInterestPoint(Vec3f::zero()); mMayaCam.setCurrentCam(mCam); //create functions pointers to send to deferred renderer boost::function<void(gl::GlslProg*)> fRenderShadowCastersFunc = boost::bind( &ssaoApp::drawShadowCasters, this, boost::lambda::_1 ); boost::function<void(gl::GlslProg*)> fRenderNotShadowCastersFunc = boost::bind( &ssaoApp::drawNonShadowCasters, this, boost::lambda::_1 ); boost::function<void(void)> fRenderOverlayFunc = boost::bind( &ssaoApp::drawOverlay, this ); mDeferredRenderer.setup( fRenderShadowCastersFunc, fRenderNotShadowCastersFunc, NULL, NULL, &mCam, Vec2i(1024, 768), 1024, true, true ); //no overlay or "particles" //have these cast point light shadows mDeferredRenderer.addCubeLight( Vec3f(-2.0f, 4.0f, 6.0f), Color(0.10f, 0.69f, 0.93f) * LIGHT_BRIGHTNESS_DEFAULT, true); //blue mDeferredRenderer.addCubeLight( Vec3f(4.0f, 6.0f, -4.0f), Color(0.94f, 0.15f, 0.23f) * LIGHT_BRIGHTNESS_DEFAULT, true); //red //add a bunch of lights for(int i = 0; i < 10; i++) { for(int j = 0; j < 10; j++) { int randColIndex = Rand::randInt(5); Color randCol; switch( randColIndex ) { case 0: randCol = Color(0.99f, 0.67f, 0.23f); //orange break; case 1: randCol = Color(0.97f, 0.24f, 0.85f); //pink break; case 2: randCol = Color(0.00f, 0.93f, 0.30f); //green break; case 3: randCol = Color(0.98f, 0.96f, 0.32f); //yellow break; case 4: randCol = Color(0.10f, 0.69f, 0.93f); //blue break; case 5: randCol = Color(0.94f, 0.15f, 0.23f); //red break; }; mDeferredRenderer.addCubeLight( Vec3f( i * 20, 30, j * 20), randCol * LIGHT_BRIGHTNESS_DEFAULT, false, true); } } mCurrLightIndex = 0; float size = 3000; plane.appendVertex(Vec3f(size, -1,-size)); plane.appendColorRgba(ColorA(255,255,255,255)); plane.appendNormal(Vec3f(.0f, 1.0f, 0.0f)); plane.appendVertex(Vec3f(-size, -1,-size)); plane.appendColorRgba(ColorA(255,255,255,255)); plane.appendNormal(Vec3f(.0f, 1.0f, 0.0f)); plane.appendVertex(Vec3f(-size, -1, size)); plane.appendColorRgba(ColorA(255,255,255,255)); plane.appendNormal(Vec3f(.0f, 1.0f, 0.0f)); plane.appendVertex(Vec3f(size, -1, size)); plane.appendColorRgba(ColorA(255,255,255,255)); plane.appendNormal(Vec3f(.0f, 1.0f, 0.0f)); uint indices[6] = {0,1,2,2,3,0}; plane.appendIndices(&indices[0], 6); gl::VboMesh::Layout layout; shadowPlane = gl::VboMesh::create(plane); TriMesh bunnyMesh; ObjLoader loader( loadResource(RES_BUNNY) ); loader.load( &bunnyMesh ); bunny = gl::VboMesh(bunnyMesh); }
void ssaoApp::draw() { mDeferredRenderer.renderFullScreenQuad(RENDER_MODE); }
void CinderDeferredRenderingApp::setup() { //!!test texture for diffuse texture mEarthTex = gl::Texture( loadImage( loadResource( RES_EARTH_TEX ) ) ); gl::disableVerticalSync(); //so I can get a true representation of FPS (if higher than 60 anyhow :/) #if defined( CINDER_MAC ) //setAlwaysOnTop(true); //the easy but inconvenient way to have fullscreen but not have app have complete control AppleUtilities::autohideMenuBar(); //a better but more complicated way to do the above #endif RENDER_MODE = DeferredRenderer::SHOW_FINAL_VIEW; mParams = params::InterfaceGl( "3D_Scene_Base", Vec2i( 225, 125 ) ); mParams.addParam( "Framerate", &mCurrFramerate, "", true ); mParams.addParam( "Selected Light Index", &mCurrLightIndex); mParams.addParam( "Show/Hide Params", &mShowParams, "key=x"); mParams.addSeparator(); mCurrFramerate = 0.0f; mShowParams = true; //set up camera CameraPersp initialCam; initialCam.setPerspective( 45.0f, getWindowAspectRatio(), 0.1, 10000 ); initialCam.lookAt(CAM_POSITION_INIT * 1.5f, Vec3f::zero(), Vec3f(0.0f, 1.0f, 0.0f) ); initialCam.setCenterOfInterestPoint(Vec3f::zero()); mMayaCam.setCurrentCam( initialCam ); //create functions pointers to send to deferred renderer boost::function<void(gl::GlslProg*)> fRenderShadowCastersFunc; boost::function<void(gl::GlslProg*)> fRenderNotShadowCastersFunc; fRenderShadowCastersFunc = boost::bind(&CinderDeferredRenderingApp::drawShadowCasters, this, boost::lambda::_1 ); fRenderNotShadowCastersFunc = boost::bind(&CinderDeferredRenderingApp::drawNonShadowCasters, this, boost::lambda::_1 ); //setting up deferred renderer ... mDeferredRenderer.setup( fRenderShadowCastersFunc, fRenderNotShadowCastersFunc, &mMayaCam ); //have these cast point light shadows mDeferredRenderer.addCubeLight( Vec3f(-2.0f, 4.0f, 6.0f), Vec3f(0.10f, 0.69f, 0.93f) * LIGHT_BRIGHTNESS, true); //blue mDeferredRenderer.addCubeLight( Vec3f(4.0f, 6.0f, -4.0f), Vec3f(0.94f, 0.15f, 0.23f) * LIGHT_BRIGHTNESS, true); //red // mDeferredRenderer.addCubeLight( Vec3f(-10.0f, 8.0f, 12.0f), Vec3f(0.99f, 0.67f, 0.23f) * LIGHT_BRIGHTNESS, true); //orange // mDeferredRenderer.addCubeLight( Vec3f(6.0f, 10.0f, -10.0f), Vec3f(0.97f, 0.24f, 0.85f) * LIGHT_BRIGHTNESS, true); //pink // mDeferredRenderer.addCubeLight( Vec3f(-8.0f, 12.0f, -8.0f), Vec3f(0.00f, 0.93f, 0.30f) * LIGHT_BRIGHTNESS, true); //green // mDeferredRenderer.addCubeLight( Vec3f(12.0f, 8.0f, 14.0f), Vec3f(0.98f, 0.96f, 0.32f) * LIGHT_BRIGHTNESS, true); //yellow //add a bunch of lights for(int i = 0; i < NUM_LIGHTS; i++) { int randColIndex = Rand::randInt(5); Vec3f randCol; switch( randColIndex ) { case 0: randCol = Vec3f(0.99f, 0.67f, 0.23f); //orange break; case 1: randCol = Vec3f(0.97f, 0.24f, 0.85f); //pink break; case 2: randCol = Vec3f(0.00f, 0.93f, 0.30f); //green break; case 3: randCol = Vec3f(0.98f, 0.96f, 0.32f); //yellow break; case 4: randCol = Vec3f(0.10f, 0.69f, 0.93f); //blue break; case 5: randCol = Vec3f(0.94f, 0.15f, 0.23f); //red break; }; mDeferredRenderer.addCubeLight( Vec3f(Rand::randFloat(-1000.0f, 1000.0f), Rand::randFloat(0.0f, 50.0f), Rand::randFloat(-1000.0f, 1000.0f)), randCol * LIGHT_BRIGHTNESS); } mCurrLightIndex = 0; }