Project 3: Rendering to textures: Water

The purpose of this project is to gain experience with rendering to textures using OPENGL framebuffer objects. FBOs will be used to render real-time reflective and refractive water.

1. Scene

Imagine a scene with standing water. It might be an ocean, lake, pond, puddle, pool, tub, toilet, sink, Stargate, bird bath, or martini glass. Create this scene in 3D. Model it, find it, or compose it from existing objects as you like. The OBJ module may be of some assistance. Wings3D, Blender, Meshlab, etc are there to help you. It is recommended that you use what you learned from Project 2, using GLSL to create interesting and realistic surfaces and illumination.

2. Water

Render one or more bodies of water into your scene. Use framebuffer objects to render reflection and refraction textures as described in the lecture notes. Use the Fresnel equation to mix these textures. Animate the surface of the water in some fashion (texture transformation, etc), giving ripples and waves.

3. Extra

As always, you may do whatever you like to meet your lagniappe requirement, though I suggest creating an enhancement to your water renderer. Try implementing a special case for when the view point is under the water, correctly handling the inverted refraction and reflection there. Consider the underwater “caustic” effect. Also, a fog effect can be used to fade the color of underwater geometry over distance, lending murkiness to the water. If you're feeling ambitious, make the water surface interactive and let the user click the mouse to make ripples.

4. Document

Once again, make a web site documenting your work completely. Include screenshots of your scene and water. Include all source code and assets necessary to reproduce the project in a ZIP archive. Describe everything you've done and explain how it works in detail. Use your documentation to convince your instructor that you understand what you've presented instead of having simply copied it from a web site.