<- previous index next ->
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 ->