var
v1,v2,v3,vn:TVector3_single;
vs1, vs2, vs3: TVector3_single;
vline:array[1..2] of TVector3_single;
begin
...
v1.data[0]:=xp[i];
v1.data[1]:=yp[i,j];
v1.data[2]:=zp[j];
v2.data[0]:=xp[i];
v2.data[1]:=yp[i,j+1];
v2.data[2]:=zp[j+1];
v3.data[0]:=xp[i+1];
v3.data[1]:=yp[i+1,j];
v3.data[2]:=zp[j];
WorldToScreen(v1.data[0], v1.data[1], v1.data[2], vs1.data[0], vs1.data[1], vs1.data[2]);
WorldToScreen(v2.data[0], v2.data[1], v2.data[2], vs2.data[0], vs2.data[1], vs2.data[2]);
WorldToScreen(v3.data[0], v3.data[1], v3.data[2], vs3.data[0], vs3.data[1], vs3.data[2]);
vline[1]:=Vector_sub(vs2,vs1);
vline[2]:=Vector_sub(vs3,vs1);
vn:=vector_crossproduct(vline[1],vline[2]);
vn:=vector_normalise(vn);
glNormal3f(-vn.data[0],-vn.data[1],-vn.data[2]);
...