Beispiel #1
0
void BayBridgeApp::drawFbo()
{
	mFboRaw->bindFramebuffer();
	gl::clear(Color::black());
	gl::setMatrices(mCamera);
	drawBridge(vec3(0), 0.0f);
	mBridge.Draw();
	mFboRaw->unbindFramebuffer();

	////////////////////////////////////////////////////
	mFboHiPass->bindFramebuffer();
	mFboRaw->bindTexture(0);
	mShaderHiPass->bind();
	gl::enableAlphaBlending();
	gl::clear(ColorA::zero());
	gl::setMatricesWindow(getWindowSize());
	gl::drawSolidRect(Rectf({vec2(0), getWindowSize()}));
	gl::disableAlphaBlending();
	mFboRaw->unbindTexture(0);
	mFboHiPass->unbindFramebuffer();

	////////////////////////////////////////////////////
	mFboBlurU->bindFramebuffer();
	mFboHiPass->bindTexture(0);
	mShaderBlur->bind();
	mShaderBlur->uniform("uBlurAxis", vec2(1.0, 0.0));
	mShaderBlur->uniform("uBlurStrength", 2.0f);
	mShaderBlur->uniform("uBlurSize", 1.0f);
	gl::clear(ColorA::zero());
	gl::setMatricesWindow(getWindowSize());
	gl::drawSolidRect(Rectf({ vec2(0), getWindowSize() }));
	mFboHiPass->unbindTexture(0);
	mFboBlurU->unbindFramebuffer();

	////////////////////////////////////////////////////
	mFboBlurV->bindFramebuffer();
	mFboBlurU->bindTexture(0);
	mShaderBlur->bind();
	mShaderBlur->uniform("uBlurAxis", vec2(0.0, 1.0));
	mShaderBlur->uniform("uBlurStrength", 2.0f);
	mShaderBlur->uniform("uBlurSize", 2.0f);
	gl::clear(ColorA::zero());
	gl::setMatricesWindow(getWindowSize());
	gl::drawSolidRect(Rectf({ vec2(0), getWindowSize() }));
	mFboBlurU->unbindTexture(0);
	mFboBlurV->unbindFramebuffer();
}
void MotionBlurFboApp::draw()
{
	gl::viewport( vec2(), mAccumFbo->getSize() );

	if( ! mPaused ) {
		// make 'mAccumFbo' the active framebuffer
		gl::ScopedFramebuffer fbScp( mAccumFbo );
		// clear out both of our FBOs
		gl::clear( Color::black() );
		gl::color( 1, 1, 1, 1 );

		// iterate all the sub-frames
		double startTime = getElapsedSeconds();
		for( int i = 0; i < SUBFRAMES; ++i ) {
			// draw the Cube's sub-frame into mFbo
			gl::enableDepth();
			gl::enableAlphaBlending();
			mFbo->bindFramebuffer();
			gl::clear();
			gl::enableDepth();
			gl::setMatrices( mCam );
			updateCubeRotation( startTime + i / (float)SUBFRAMES );
			gl::multModelMatrix( mCubeRotation );
			mBatch->draw();
			
			// now add this frame to the accumulation FBO
			mAccumFbo->bindFramebuffer();
			gl::setMatricesWindow( mAccumFbo->getSize() );
			gl::enableAdditiveBlending();
			gl::enableDepth( false );
			gl::draw( mFbo->getColorTexture() );
		}
	}
	
	gl::disableDepthRead();
	gl::disableAlphaBlending();
	// set the color to be 1/SUBFRAMES, which divides the HDR image by the number of sub-frames we rendered
	gl::color( 1.0f / SUBFRAMES, 1.0f / SUBFRAMES, 1.0f / SUBFRAMES, 1 );
	gl::setMatricesWindow( getWindowSize() );
	gl::draw( mAccumFbo->getColorTexture() );
}