void MotionBlurVelocityBufferApp::dilateVelocity() { gl::ScopedFramebuffer fbo( mVelocityDilationBuffer ); gl::ScopedViewport viewport( ivec2( 0, 0 ), mVelocityDilationBuffer->getSize() ); gl::ScopedMatrices matrices; gl::setMatricesWindowPersp( mVelocityDilationBuffer->getSize() ); { // downsample velocity into tilemax gl::ScopedTextureBind tex( mGBuffer->getTexture2d( G_VELOCITY ), 0 ); gl::ScopedGlslProg prog( mTileProg ); gl::drawBuffer( DILATE_TILE_MAX ); mTileProg->uniform( "uVelocityMap", 0 ); mTileProg->uniform( "uTileSize", mTileSize ); gl::drawSolidRect( mVelocityDilationBuffer->getBounds() ); } { // build max neighbors from tilemax gl::ScopedTextureBind tex( mVelocityDilationBuffer->getTexture2d( DILATE_TILE_MAX ), 0 ); gl::ScopedGlslProg prog( mNeighborProg ); gl::drawBuffer( DILATE_NEIGHBOR_MAX ); mNeighborProg->uniform( "uTileMap", 0 ); gl::drawSolidRect( mVelocityDilationBuffer->getBounds() ); } }
void SMAA::apply( gl::FboRef destination, gl::FboRef source ) { gl::ScopedFramebuffer fbo( destination ); gl::ScopedViewport viewport( 0, 0, destination->getWidth(), destination->getHeight() ); gl::ScopedMatrices matrices; gl::setMatricesWindow( destination->getSize() ); // Make sure our source is linearly interpolated. GLenum minFilter = source->getFormat().getColorTextureFormat().getMinFilter(); GLenum magFilter = source->getFormat().getColorTextureFormat().getMagFilter(); bool filterChanged = ( minFilter != GL_LINEAR || magFilter != GL_LINEAR ); if( filterChanged ) { source->getColorTexture()->setMinFilter( GL_LINEAR ); source->getColorTexture()->setMagFilter( GL_LINEAR ); } // Perform SMAA anti-aliasing. gl::clear( ColorA( 0, 0, 0, 0 ) ); draw( source->getColorTexture(), destination->getBounds() ); // Restore texture parameters. if( filterChanged ) { source->getColorTexture()->setMinFilter( minFilter ); source->getColorTexture()->setMagFilter( magFilter ); } }
void ciApp::draw() { auto viewport = getWindowBounds(); gl::clear(); { auto rect = Rectf(fbo->getBounds()).getCenteredFit(viewport, false); gl::draw(fbo->getColorTexture(), rect); } if (is_debug_visible) { params->draw(); const gl::ScopedColor scpColor(Color::white()); auto tex = getInfoTexture(getAverageFps(), time_step, elapsed_time, time_value); ivec2 pos(20, getWindowHeight() - tex->getHeight() - 20); gl::draw(tex, pos); } }
void FXAA::apply( const gl::FboRef &destination, const gl::FboRef &source ) { gl::ScopedFramebuffer fbo( destination ); gl::ScopedViewport viewport( 0, 0, destination->getWidth(), destination->getHeight() ); gl::ScopedMatrices matrices; gl::setMatricesWindow( destination->getSize(), false ); // Make sure our source is linearly interpolated. GLenum minFilter = source->getFormat().getColorTextureFormat().getMinFilter(); GLenum magFilter = source->getFormat().getColorTextureFormat().getMagFilter(); source->getColorTexture()->setMinFilter( GL_LINEAR ); source->getColorTexture()->setMagFilter( GL_LINEAR ); // Perform FXAA anti-aliasing. gl::clear( ColorA( 0, 0, 0, 0 ) ); draw( source->getColorTexture(), destination->getBounds() ); // Restore texture parameters. source->getColorTexture()->setMinFilter( minFilter ); source->getColorTexture()->setMagFilter( magFilter ); }
void MotionBlurVelocityBufferApp::drawVelocityBuffers() { gl::ScopedGlslProg prog( mVelocityRenderProg ); gl::ScopedModelMatrix matrix; gl::setDefaultShaderVars(); float width = 200.0f; float height = width / Rectf( mVelocityDilationBuffer->getBounds() ).getAspectRatio(); Rectf rect( 0.0f, 0.0f, width, height ); gl::ScopedTextureBind velTex( mGBuffer->getTexture2d( G_VELOCITY ), 0 ); gl::translate( getWindowWidth() - width - 10.0f, 10.0f ); gl::drawSolidRect( rect ); gl::ScopedTextureBind tileTex( mVelocityDilationBuffer->getTexture2d( DILATE_TILE_MAX ), 0 ); gl::translate( 0.0f, height + 10.0f ); gl::drawSolidRect( rect ); gl::ScopedTextureBind neigborTex( mVelocityDilationBuffer->getTexture2d( DILATE_NEIGHBOR_MAX ), 0 ); gl::translate( 0.0f, height + 10.0f ); gl::drawSolidRect( rect ); }
void TextParticlesApp::drawTextToFbo() { { vec2 size = mTextFbo->getSize(); gl::ScopedFramebuffer scpFbo( mTextFbo ); gl::clear( ColorA( 0 , 0, 0, 0 ) ); gl::ScopedViewport scpVp( ivec2(), size ); gl::ScopedMatrices scpMtrx; gl::ScopedColor scpCol( 1, 1, 1); vec2 stringSize = mTextureFont->measureString( mString ); float descent = mTextureFont->getDescent(); float ascent = mTextureFont->getAscent(); mTextSize = stringSize + vec2( 0, descent ); // OPTIONALLY, draw the text metrics /* // string size - RED gl::color(1, 0, 0); gl::drawSolidRect( Rectf( -10, 0, stringSize.x + 10.0, stringSize.y ) ); // ascent - CYAN gl::color(0, 1, 1); gl::drawSolidRect( Rectf( 0, stringSize.y - ascent, stringSize.x, ascent ) ); // descent - YELLOW gl::color(1, 1, 0); gl::drawSolidRect( Rectf( 0, stringSize.y-descent, stringSize.x, stringSize.y ) ); // above ascent gl::color( 0, 1, 0 ); gl::drawSolidRect( Rectf( 0, 0, stringSize.x, stringSize.y-ascent ) );*/ // DRAW string to FBO gl::color(1, 1, 1); mTextureFont->drawString( mString, vec2( 0, stringSize.y - descent ) ); } // GET Texture from FBO mTextSurf = Surface( mTextFbo->readPixels8u( mTextFbo->getBounds() ) ); }
vec4 GpuParrallelReductionApp::findMindMax() { // init the programs, fbo and texture used for the parrallel reduction static gl::FboRef sReductionFbo, sReadFbo; static gl::Texture2dRef sReductionTexture0; static gl::GlslProgRef sReductionProg, sCopyProg; auto startingSize = mFbo->getSize() / 2; if( !sReductionFbo || sReductionFbo->getSize() != startingSize ) { sReductionTexture0 = gl::Texture2d::create( startingSize.x, startingSize.y, gl::Texture2d::Format().minFilter( GL_NEAREST_MIPMAP_NEAREST ).magFilter( GL_NEAREST ).mipmap().immutableStorage() ); sReductionFbo = gl::Fbo::create( startingSize.x, startingSize.y, gl::Fbo::Format() .attachment( GL_COLOR_ATTACHMENT0, sReductionTexture0 ) .disableDepth() ); sReductionProg = gl::GlslProg::create( loadAsset( "minMax.vert" ), loadAsset( "minMax.frag" ) ); } // start reduction profiling static auto sTimer0 = gl::QueryTimeSwapped::create(); sTimer0->begin(); // attach the main level of the texture gl::ScopedFramebuffer scopedFbo( sReductionFbo ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sReductionTexture0->getId(), 0 ); // start by blitting the main fbo into the reduction one mFbo->blitTo( sReductionFbo, mFbo->getBounds(), sReductionFbo->getBounds(), GL_NEAREST ); // bind the reduction program and texture and disable blending gl::ScopedMatrices scopedMatrices; gl::ScopedGlslProg scopedGlsl( sReductionProg ); gl::ScopedBlend scopedBlend( false ); gl::ScopedTextureBind scopedTexBind0( sReductionTexture0, 0 ); sReductionProg->uniform( "uTex0", 0 ); // iterate trough each mipmap level int numMipMaps = gl::Texture2d::requiredMipLevels( startingSize.x, startingSize.y, 0 ); for( int level = 1; level < numMipMaps; ++level ) { // attach the current mipmap level to the framebuffer and limit texture sampling to the previous level glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, level - 1 ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level - 1 ); glFramebufferTexture2D( GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sReductionTexture0->getId(), level ); // get the current mipmap size and update uniforms vec2 size = gl::Texture2d::calcMipLevelSize( level, sReductionFbo->getWidth(), sReductionFbo->getHeight() ); sReductionProg->uniform( "uInvSize", vec2( 1.0f ) / vec2( size ) ); // render a fullscreen quad gl::ScopedViewport scopedViewport( ivec2( 0 ), size ); gl::setMatricesWindow( size.x, size.y ); gl::drawSolidRect( Rectf( vec2( 0.0f ), vec2( size ) ) ); } // stop reduction profiling sTimer0->end(); mReductionTime = sTimer0->getElapsedMilliseconds(); // start readback profiling static auto sTimer1 = gl::QueryTimeSwapped::create(); sTimer1->begin(); // read back to the cpu and find the max value vec4 max( 0.0f ); ivec2 readSize = gl::Texture2d::calcMipLevelSize( numMipMaps - 1, startingSize.x, startingSize.y ); Surface8u surface( readSize.x, readSize.y, true ); glGetTexImage( sReductionTexture0->getTarget(), numMipMaps - 1, GL_RGBA, GL_UNSIGNED_BYTE, surface.getData() ); auto it = surface.getIter(); while( it.line() ) { while( it.pixel() ) { max = glm::max( max, vec4( it.r(), it.g(), it.b(), it.a() ) ); } } // stop readback profiling sTimer1->end(); mReadBackTime = sTimer1->getElapsedMilliseconds(); return max; }