- // return if a point in world space is occluded by on-screen geometry
- function PointIsOccluded(p: TVec) : boolean;
- var
- viewport: TVector4i;
- mvmatrix, projmatrix: TMatrix4d;
- winx, winy, winz: GLdouble;
- bufferZ: float;
- begin
- glGetIntegerv (GL_VIEWPORT, addr(viewport));
- glGetDoublev (GL_MODELVIEW_MATRIX, addr(mvmatrix));
- glGetDoublev (GL_PROJECTION_MATRIX, addr(projmatrix));
- // project world space onto screen
- gluProject(p.x, p.y, p.z, mvmatrix, projmatrix, viewport, @winx, @winy, @winz);
- // read back pixel from depth buffer
- glReadPixels(round(winx), round(winy),1,1,GL_DEPTH_COMPONENT, GL_FLOAT, @bufferZ);
- result := bufferZ < winZ;
- end;