<- previous    index    next ->

Lecture 24, Data Structures for Rendering

White board lecture. (Notes to follow.)

Why did I choose to use triangles in Lecture 21,
3 point surface, rather than 4 point surface? 
Answer: For efficiency and ease of coding for some renderers.

There are many types of renderers as covered in Lecture 18.
For this lecture I am focusing on a renderer that will use
Phong Specular Lighting and thus requires normals to surfaces
that are interpolated across the surface.

To understand relative efficiency, in this case twice as many
3 point surfaces as four point surfaces for the same object,
both the data structures and the processing must be analyzed.

The data structures, copied from working code, are:


typedef struct {GLfloat x; GLfloat y; GLfloat z;
                GLfloat nx; GLfloat ny; GLfloat nz;} dpts;
static dpts * data_points; /* malloc'd space for vertices */

For example, OpenGL code using normals and vertices:

  glNormal3f(data_points[k-1].nx, data_points[k-1].ny, data_points[k-1].nz);
  glVertex3f(data_points[k-1].x,  data_points[k-1].y,  data_points[k-1].z);

With precomputed normals from:

  for(i=0; i<num_pts; i++)
  {
    /* get &data_points[i].x, &data_points[i].y, &data_points[i].z */
    data_points[i].nx = 0.0; /* normals averaged and normalized */
    data_points[i].ny = 0.0;
    data_points[i].nz = 0.0;
  }

  /* pick up three points, pts, of a polygon */
  for(j=0; j<j; j++)
    v[j] = data_points[kk[j]-1];

  /* compute, normalize and average normals */
  ax = v[2].x - v[1].x;
  ay = v[2].y - v[1].y;
  az = v[2].z - v[1].z;
  bx = v[1].x - v[0].x;
  by = v[1].y - v[0].y;
  bz = v[1].z - v[0].z;
  nx = ay*bz-az*by; /* cross product */
  ny = az*bx-ax*bz;
  nz = ax*by-ay*bx; /* technically, the normal at point [1] */
  s = sqrt(nx*nx+ny*ny+nz*nz);
  nx = nx / s;
  ny = ny / s;
  nz = nz / s;

  for(j=0; j<j; j++)
  {
    data_points[kk[j]-1].nx += nx; /* sum normals */
    data_points[kk[j]-1].ny += ny;
    data_points[kk[j]-1].nz += nz;
  }     

  for(j=3; j<pts; j++)
  {
    /* if more than 3 points, compute normal at every vertex */
    /* repeat 13 lines above for points other than [1]       */
  }


    <- previous    index    next ->

Other links

Go to top