2009-08-21 6 views
4

, 내가 뭐하는 거지 순서대로 다음OpenGL : 3D (렌더링 된) 점이 다른 3D (렌더링 된) 프리미티브에 의해 폐색되었는지 확인하는 방법은 무엇입니까? 내 OpenGL은 프로그램에서

// Drawing filled polyhedrons 
// Drawing points using GL_POINTS 
// Displaying information for each above point beside it 

(예를 들어 포인트 식별자/수) 포인트 정보를 표시, 나는 3D가 gluProject를 사용하여 좌표를 2D 창으로 점의 좌표 변환(). glRasterPos()과 2D 문자 렌더링 코드를 사용하여 해당 2D 창 위치에 점 식별자를 작성합니다.

렌더링 된 포인트가 다른 프리미티브에 의해 폐색되면 OpenGL 파이프 라인에서 발생하는 자동 폐색 테스트 및 깊이 테스트로 인해 이 아닌이 자동으로 표시됩니다. 그러나이 오 클루 전 정보를 얻지 못했기 때문에 지점 식별자 텍스트가 점 옆에 표시됩니다.

3D (렌더링 된) 점이 다른 3D (렌더링 된) 프리미티브에 의해 가려 졌는지 확인하는 방법은 무엇입니까? 또는 그 옆에 포인트 정보 텍스트를 표시하는 더 좋은 방법이 있습니까 그것이 닫혀 있지 않을 때?

참고 : 추가 렌더링 패스가 필요한 방법에 대해 알고 있습니다. 나는 그것들이 내 목적에 비싸다고 느낍니다.

+0

2 차 시험 외에도 다른 시험을 보았습니까? –

+0

카일 : 나는 여러 번 통과 방법 이외의 것을 생각하지 못했습니다. –

답변

3

폐색 쿼리를 사용하지 않으려면 두 번째 단계에서 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 
+1

Sid Farkus (22780)에게 감사드립니다! 그게 효과가 있었어. 몇 가지 샘플 코드로 대답을 향상 시켰습니다. –

2

z 버퍼에서 읽기는 최신 하드웨어에 아주 아주 느릴 수 있습니다. 이것이 왜 폐색 쿼리가 만들어 졌는지입니다. ARB- 폐색 - 쿼리 확장을 찾으십시오. 결과를 얻기 전에 몇 가지 지연이 있습니다.하지만 실적에 영향을 미치지는 않습니다.

어떤 이유로 든 occlusion 쿼리가 작동하지 않을 경우 다음 폴백 옵션은 GL을 전혀 사용하지 않는 BSP 트리를 사용하여 소프트웨어 광선 교차 교차 작업을 수행하는 것입니다.

+0

occlusion query extension을 지적 해 주셔서 감사합니다.나는 약간의 렌더링의 지연을 감당할 수 없다. 첫 번째 렌더링에서 정답이 필요하다. 그래서 나에게 적합하지 않다. –

+0

오 클루 전 쿼리의 응답을 사용할 수있을 때까지 텍스트 패널 렌더링을 지연 할 수 있습니까? – Alan

+0

Occlusion 쿼리가 지연 될 필요가 없으며 일반적으로 내 경험에 미치지 않습니다. occlusion 쿼리 결과를 검색하기 전에 glFlush()를 호출 할 수 있습니다. 즉, 한 응용 프로그램의 경우에이를 수행하는 방법이며 내 응용 프로그램 (3D 게임)의 프레임 속도에 영향을주지 않고 잘 작동합니다. – karx11erx

2

Alan의 대답에 덧붙여 카메라 위치의 광선을 점으로 투영하고 그것이 어떤 지오메트리와 교차하는지 결정하여 수학적으로 교합을 테스트 할 수 있습니다. 광선 - 물체 교차 테스트를 수행하기 위해 인터넷에 많은 참고 자료가 있습니다 (예 : Object/Object Intersection Page 참조). 많은 지오메트리가 있다면 바운딩 볼륨이나 BSP 트리를 사용하여 작업 속도를 높이는 것이 좋습니다.

보너스로 OpenGL에서 값을 추출하지 않기 때문에 오클 루션 코드가 단위 테스트를 훨씬 쉽게 수행해야합니다.

+0

이 솔루션을 제안 해 주셔서 감사합니다. 이것은 단지 포인트 정보를 표시해야하는 제 경우에는 너무 많은 것입니다. 그러나 이것은 심각한 오 클루 전 테스트를 수행하는 모든 사용자에게 유용합니다. –