Если вы не хотите использовать второй проход запроса окклюзии, вы можете попробовать выполнить выборку из Z-буфера для сравнения с вашей контрольной точкой.
Поскольку вы добавляете текст рядом с точкой, возьмите нормализованное значение буфера Z (скажем, с помощью gluProject) точки, а затем сравните это значение с выборочным значением Z-буфера (используя glReadPixels) в этой точке. Если ваша точка находится позади (больше) значения глубины, которое вы выбрали, ваша точка должна быть закрыта, и вы можете не рисовать текст.
Это, конечно, требует отрисовки всей геометрии перед текстом, но это не должно быть проблемой.
Пример кода:
// Assumed to already hold 3D coordinates of point
GLdouble point3DX, point3DY, point3DZ;
// Project 3D point coordinates to 2D
GLdouble point2DX, point2DY, point2DZ; // 2D coordinates of point
gluProject( point3DX, point3DY, point3DZ,
mMatrix, pMatrix, vMatrix, // MVP matrices
&point2DX, &point2DY, &point2DZ);
// Read depth buffer at 2D coordinates obtained from above
GLfloat bufDepth = 0.0;
glReadPixels( static_cast<GLint>( point2DX ), static_cast<GLint>( point2DY ), // Cast 2D coordinates to GLint
1, 1, // Reading one pixel
GL_DEPTH_COMPONENT, GL_FLOAT,
&bufDepth);
// Compare depth from buffer to 2D coordinate "depth"
GLdouble EPSILON = 0.0001; // Define your own epsilon
if (fabs(bufDepth - point2DZ) < EPSILON)
// 3D point is not occluded
else
// 3D point is occluded by something