Difference between revisions of "Project6Fall14"

From Immersive Visualization Lab Wiki
Jump to: navigation, search
(2. Sky Box (20 Points))
 
(17 intermediate revisions by one user not shown)
Line 5: Line 5:
 
It is due on '''Friday, December 5th at 3:30pm''' and will be discussed in CSB 001 on Monday, December 1st at 5pm.
 
It is due on '''Friday, December 5th at 3:30pm''' and will be discussed in CSB 001 on Monday, December 1st at 5pm.
  
==1. Make a Bezier Patch==
+
==1. Bezier Patch (30 Points)==
  
 
Generate the 16 control points for a cubic Bezier patch. Put them all in the x-z plane (horizontal), since the patch is going to simulate water.
 
Generate the 16 control points for a cubic Bezier patch. Put them all in the x-z plane (horizontal), since the patch is going to simulate water.
Line 15: Line 15:
 
'''Tip:''' You can compute normals as follows: Given the Bezier curve (x(t),y(t),0) in the x/y plane, you first compute the tangent vector (x'(t),y'(t),0). The corresponding 3D normal vector is then (-y'(t),x'(t),0), which you rotate around the y axis similar to the vertices. Don't forget to normalize the normal vectors.
 
'''Tip:''' You can compute normals as follows: Given the Bezier curve (x(t),y(t),0) in the x/y plane, you first compute the tangent vector (x'(t),y'(t),0). The corresponding 3D normal vector is then (-y'(t),x'(t),0), which you rotate around the y axis similar to the vertices. Don't forget to normalize the normal vectors.
  
Enable at least one light source and position it so that it nicely illuminates the patch.  
+
Enable at least one light source and position it so that it nicely illuminates the patch.
  
==2. Animate the Patch==
+
==2. Sky Box (20 Points)==
 
+
Use sine and cosine functions to move the control points of your patch up and down, to simulate a water surface.
+
 
+
==3. Add an Environment==
+
  
 
Embed the water patch in a sky box. A sky box is a large box which is drawn around your entire scene and which your scene is inside of. The walls of the box have pictures of a sky and perhaps imagery at the horizon. Sky boxes are typically cubic, which means that they consist of six square textures for the six sides of a cube. [http://www.f-lohmueller.de/pov_tut/skyboxer/skyboxer_3.htm Here is is a nice collection of textures for sky boxes].  
 
Embed the water patch in a sky box. A sky box is a large box which is drawn around your entire scene and which your scene is inside of. The walls of the box have pictures of a sky and perhaps imagery at the horizon. Sky boxes are typically cubic, which means that they consist of six square textures for the six sides of a cube. [http://www.f-lohmueller.de/pov_tut/skyboxer/skyboxer_3.htm Here is is a nice collection of textures for sky boxes].  
Line 34: Line 30:
 
</pre>
 
</pre>
  
==4. Use Environment Mapping==
+
Use the following settings for your texture after your first <tt>glBindTexture</tt> for correct lighting and filtering settings:
==5. Optional: TBD==
+
 
+
<!--
+
 
+
==2. Texture Your Object (40 Points)==
+
 
+
Take a photograph or find one on-line and drape it onto your surface of revolution. It needs to stretch across its entire surface area, from top to bottom and all the way around, but only on the outside, not the inside of the object.
+
 
+
To familiarize yourself with texture mapping in OpenGL, we provide a [[texture.cpp | sample program]], which loads a PPM file and uses it as a texture for a quad. You can cut and paste code from it into your own project.
+
 
+
Follow these steps:
+
 
+
a) Convert your photograph to the PPM format. The free image processing tool [http://www.irfanview.com IrfanView] will do this for you. ('''5 points''')
+
 
+
b) Read the PPM image and turn it into an OpenGL texture. You can use the code from the above referenced sample program. ('''10 points''')
+
 
+
c) Calculate texture coordinates for each vertex and set them with <tt>glTexCoord2f</tt>. Make sure the texture gets mapped right side up. The image needs to stretch to the entire height of the object and go all the way around it - this means that the texture coordinates at each vertex will need to be fractions of 1. ('''10 points''')
+
 
+
d) Render the surface of revolution with the texture. ('''5 points''')
+
 
+
e) Add support for the 't' key to toggle between the object with and without the texture. ('''5 points''')
+
 
+
f) Make sure your control points still work as before and allow changing the shape of the object. ('''5 points''')
+
 
+
'''Tips:'''
+
 
+
* Use the following settings for your texture after your first <tt>glBindTexture</tt> for correct lighting and filtering settings:
+
  
 
<pre>
 
<pre>
Line 67: Line 36:
 
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 
   glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  
   // Select GL_MODULATE to mix texture with quad color for shading:
+
   // Select GL_MODULATE to mix texture with polygon color for shading:
 
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
 
   glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  
Line 75: Line 44:
 
</pre>
 
</pre>
  
* For the texture coordinates u/v, you can use the curve parameter t at each vertex as the u parameter. The v parameter at each vertex is proportional to the rotation angle around the y axis you applied to get the vertex.
+
To familiarize yourself with texture mapping in OpenGL, we provide a [[texture.cpp | sample program]], which loads a PPM file and uses it as a texture for a quad. If you decide to use one of the above referenced sky box images, you will have to convert them from JPEG to PPM format. The free image processing tool [http://www.irfanview.com IrfanView] for Windows will do this for you.
 +
 
 +
Alternatively, you can use a third party library such as [http://lonesock.net/soil.html SOIL] to natively load JPEG images.
 +
 
 +
==3. Environment Mapping (30 Points)==
 +
 
 +
Add shaders to render your patch with environment mapping (reflection mapping), using the sky box textures as your cubic environment map.
 +
 
 +
Support the 'e' key to turn environment mapping on and off.
 +
 
 +
Useful links with tutorials:
 +
 
 +
* http://www.3dcpptutorials.sk/index.php?id=24
 +
* http://antongerdelan.net/opengl/cubemaps.html
 +
 
 +
==4. Animation (20 Points)==
  
 +
Use sine and cosine functions to move the control points of your patch up and down, to simulate the movements on the surface of water.
  
 +
==5. Optional: Improvements (10 Points)==
  
 +
Each of the following improvements to your algorithm will get you 10 points of extra credit:
  
 +
* Piecewise Bezier patch: instead of just one patch, use four in an array of 2x2 patches, or even more. This way you will have more control points to create more realistic looking waves. Make sure the patches have C1 continuity so that there won't be creases between them.
  
Extra credit:
+
* More realistic water: research refraction mapping and improve your shader to create more realistic looking water. You will need a texture for what is below the water surface, for which you can use the base texture of the sky box, or a different one, for instance with pebbles, rocks, sand, or other lake floor-type imagery.
* Piecewise Bezier patch
+
* more realistic water
+
* use triangle strip and show speedup
+
-->
+

Latest revision as of 11:49, 1 December 2014

Contents

Project 6: Simple Water

This project is on Bezier patches, texturing, and environment mapping with a GLSL shader program. The goal is to create a Bezier patch, make it resemble a water surface with small waves, then put it in a textured environment cube and render its surface with environment mapping.

It is due on Friday, December 5th at 3:30pm and will be discussed in CSB 001 on Monday, December 1st at 5pm.

1. Bezier Patch (30 Points)

Generate the 16 control points for a cubic Bezier patch. Put them all in the x-z plane (horizontal), since the patch is going to simulate water.

Tessellate the patch out of GL_QUADS: use uniform sampling to calculate 3D points on your patch on a regular grid. We suggest using around 100x100 quads to produce a smooth surface.

Connect the points with GL_QUADS in counter-clockwise order to form a surface, and calculate normals. Give the quads a color and material of your choice.

Tip: You can compute normals as follows: Given the Bezier curve (x(t),y(t),0) in the x/y plane, you first compute the tangent vector (x'(t),y'(t),0). The corresponding 3D normal vector is then (-y'(t),x'(t),0), which you rotate around the y axis similar to the vertices. Don't forget to normalize the normal vectors.

Enable at least one light source and position it so that it nicely illuminates the patch.

2. Sky Box (20 Points)

Embed the water patch in a sky box. A sky box is a large box which is drawn around your entire scene and which your scene is inside of. The walls of the box have pictures of a sky and perhaps imagery at the horizon. Sky boxes are typically cubic, which means that they consist of six square textures for the six sides of a cube. Here is is a nice collection of textures for sky boxes.

Draw a cubic sky box around your patch by generating five sides of a cube (all but the bottom - the bottom side will be replaced by your patch) out of large textured GL_QUADS. Position and scale the box so that the patch is at its base, and it snugly hugs the patch.

Make sure single-sided rendering (triangle culling) is enabled with these lines somewhere in your code to ensure the box never occludes your patch:

glEnable(GL_CULL_FACE); 
glCullFace(GL_BACK); 

Use the following settings for your texture after your first glBindTexture for correct lighting and filtering settings:

  // Make sure no bytes are padded:
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  // Select GL_MODULATE to mix texture with polygon color for shading:
  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

  // Use bilinear interpolation:
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

To familiarize yourself with texture mapping in OpenGL, we provide a sample program, which loads a PPM file and uses it as a texture for a quad. If you decide to use one of the above referenced sky box images, you will have to convert them from JPEG to PPM format. The free image processing tool IrfanView for Windows will do this for you.

Alternatively, you can use a third party library such as SOIL to natively load JPEG images.

3. Environment Mapping (30 Points)

Add shaders to render your patch with environment mapping (reflection mapping), using the sky box textures as your cubic environment map.

Support the 'e' key to turn environment mapping on and off.

Useful links with tutorials:

4. Animation (20 Points)

Use sine and cosine functions to move the control points of your patch up and down, to simulate the movements on the surface of water.

5. Optional: Improvements (10 Points)

Each of the following improvements to your algorithm will get you 10 points of extra credit:

  • Piecewise Bezier patch: instead of just one patch, use four in an array of 2x2 patches, or even more. This way you will have more control points to create more realistic looking waves. Make sure the patches have C1 continuity so that there won't be creases between them.
  • More realistic water: research refraction mapping and improve your shader to create more realistic looking water. You will need a texture for what is below the water surface, for which you can use the base texture of the sky box, or a different one, for instance with pebbles, rocks, sand, or other lake floor-type imagery.