inline FramebufferTarget operator << ( DefaultFramebuffer dfb, FramebufferTarget target ) { dfb.Bind(target); return target; }
void Render(double time) { static const ModelMatrixf reflection = ModelMatrixf::Translation(0.0f, -1.0f, 0.0f) * ModelMatrixf::Reflection(false, true, false); auto camera = CamMatrixf::Orbiting( Vec3f(), 4.5, FullCircles(time / 10.0), Degrees(45.0 - SineWave(time / 7.0)*35.0) ); shape_prog.Use(); shape.Bind(); gl.FrontFace(make_shape.FaceWinding()); shape_model_matrix = ModelMatrixf::Translation(0.0f, 1.1f, 0.0f) * ModelMatrixf::RotationX(FullCircles(time / 12.0)); // render into the off-screen framebuffer fbo.Bind(Framebuffer::Target::Draw); gl.Viewport(width/tex_size_div, height/tex_size_div); gl.Clear().ColorBuffer().DepthBuffer(); shape_camera_matrix = camera * reflection; gl.FrontFace(Inverted(make_shape.FaceWinding())); shape_instr.Draw(shape_indices); // render into the on-screen framebuffer dfb.Bind(Framebuffer::Target::Draw); gl.Viewport(width, height); gl.Clear().ColorBuffer().DepthBuffer(); shape_camera_matrix = camera; gl.FrontFace(make_shape.FaceWinding()); shape_instr.Draw(shape_indices); // Render the plane plane_prog.Use(); plane.Bind(); gl.FrontFace(make_plane.FaceWinding()); plane_camera_matrix = camera; plane_model_matrix = ModelMatrixf::Translation(0.0f, -0.5f, 0.0f); plane_instr.Draw(plane_indices); }
void Use(void) { gl.ClearDepth(1.0f); gl.ClearColor(0.8f, 0.8f, 0.8f, 0.0f); gl.Enable(Capability::DepthTest); gl.Enable(Capability::CullFace); gl.CullFace(Face::Back); dfb.Bind(Framebuffer::Target::Draw); gl.Viewport(width, height); prog.Use(); cube.Use(); SetProjection(); }
void Draw(double time, double fade) { // Shadow map shadows_fbo.Bind(FramebufferTarget::Draw); gl.Viewport(shadow_size, shadow_size); gl.Clear().DepthBuffer(); auto light = CamMatrixf::Orbiting( Vec3f(0, side*0.25, 0), side*1.5, Degrees(-time * 27), Degrees(SineWave(time / 19.0)*25 + 45) ); shadow_prog.fade.Set(fade); shadow_prog.camera_matrix.Set(light); shadow_prog.Use(); shadow_vao.Bind(); gl.Enable(Capability::PolygonOffsetFill); cube.Draw(side*side); gl.Disable(Capability::PolygonOffsetFill); gl.Finish(); // On-screen default_fb.Bind(Framebuffer::Target::Draw); gl.Viewport(width, height); gl.Clear().ColorBuffer().DepthBuffer(); auto camera = CamMatrixf::Orbiting( Vec3f(), side*1.1, Degrees(time * 19), Degrees(SineWave(time / 20.0) * 39 + 50) ); display_prog.fade.Set(fade); display_prog.light_pos.Set(light.Position()); display_prog.camera_pos.Set(camera.Position()); display_prog.light_matrix.Set(light); display_prog.camera_matrix.Set(camera); display_prog.Use(); display_vao.Bind(); cube.Draw(side*side); }
void Render(double time) { fbo.Bind(Framebuffer::Target::Draw); gl.Clear().ColorBuffer().DepthBuffer(); main_prog.Use(); cube.Bind(); camera_matrix.Set( CamMatrixf::Orbiting( Vec3f(), 20.5, FullCircles(time / 20.0), Degrees(SineWave(time / 25.0) * 30) ) ); auto i = cube_matrices.begin(), e = cube_matrices.end(); while(i != e) { model_matrix.Set(*i); ambient_color.Set(0.7f, 0.6f, 0.2f); diffuse_color.Set(1.0f, 0.8f, 0.3f); face_instr.Draw(face_indices); ambient_color.Set(0.1f, 0.1f, 0.1f); diffuse_color.Set(0.3f, 0.3f, 0.3f); edge_instr.Draw(edge_indices); ++i; } dfb.Bind(Framebuffer::Target::Draw); gl.Clear().ColorBuffer().DepthBuffer(); dof_prog.Use(); screen.Bind(); focus_depth.Set(0.6 + SineWave(time / 9.0)*0.3); gl.Enable(Capability::Blend); gl.DrawArrays(PrimitiveType::TriangleStrip, 0, 4); gl.Disable(Capability::Blend); }