| 278 | } |
| 279 | |
| 280 | void ShadowMappingApp::draw() |
| 281 | { |
| 282 | gl::clear( Color( 0.07f, 0.05f, 0.1f ) ); |
| 283 | |
| 284 | // Elapsed time called here: the scene must be absolutely identical on both renders! |
| 285 | float spinAngle = 0.5f * (float) app::getElapsedSeconds(); |
| 286 | |
| 287 | // Offset to help combat surface acne (self-shadowing) |
| 288 | gl::enable( GL_POLYGON_OFFSET_FILL ); |
| 289 | glPolygonOffset( mPolygonOffsetFactor, mPolygonOffsetUnits ); |
| 290 | |
| 291 | // Render scene into shadow map |
| 292 | gl::setMatrices( mLight.camera ); |
| 293 | gl::viewport( mShadowMap->getSize() ); |
| 294 | { |
| 295 | gl::ScopedFramebuffer bindFbo( mShadowMap->getFbo() ); |
| 296 | gl::clear(); |
| 297 | drawScene( spinAngle ); |
| 298 | } |
| 299 | |
| 300 | // Render shadowed scene |
| 301 | gl::setMatrices( mLight.toggleViewpoint ? mLight.camera : mCamera ); |
| 302 | gl::viewport( toPixels( getWindowSize() ) ); |
| 303 | { |
| 304 | gl::ScopedGlslProg bind( mShadowShader ); |
| 305 | gl::ScopedTextureBind texture( mShadowMap->getTexture() ); |
| 306 | |
| 307 | mShadowShader->uniform( "uShadowMap", 0 ); |
| 308 | mShadowShader->uniform( "uShadowMatrix", mLight.camera.getProjectionMatrix() * mLight.camera.getViewMatrix() ); |
| 309 | mShadowShader->uniform( "uShadowTechnique", mShadowTechnique ); |
| 310 | mShadowShader->uniform( "uDepthBias", mDepthBias ); |
| 311 | mShadowShader->uniform( "uOnlyShadowmap", mOnlyShadowmap ); |
| 312 | mShadowShader->uniform( "uRandomOffset", mRandomOffset ); |
| 313 | mShadowShader->uniform( "uNumRandomSamples", mNumRandomSamples ); |
| 314 | mShadowShader->uniform( "uEnableNormSlopeOffset", mEnableNormSlopeOffset ); |
| 315 | mShadowShader->uniform( "uLightPos", vec3( gl::getModelView() * vec4( mLight.viewpoint, 1.0 ) ) ); |
| 316 | |
| 317 | drawScene( spinAngle, mShadowShader ); |
| 318 | } |
| 319 | |
| 320 | gl::disable( GL_POLYGON_OFFSET_FILL ); |
| 321 | |
| 322 | // Render light direction vector |
| 323 | gl::drawVector( mLight.viewpoint, 4.5f * normalize( mLight.viewpoint ) ); |
| 324 | } |
| 325 | |
| 326 | void ShadowMappingApp::keyDown( KeyEvent event ) |
| 327 | { |
no test coverage detected