2011-01-27 6 views
0

OpenGL에서 gluOrtho 관점에서 본 3D 장면을 렌더링했습니다. 내 응용 프로그램에서는 볼륨 100x70x60mm (1000x700x600 픽셀)의 큐브 앞면을보고 있습니다. 이 큐브 안에서 나는 가운데에 정확히 앉아서 큐브를 채 웁니다 (반경 300 픽셀).OpenGL - 특정 깊이의 픽셀 색상

이제 입방체 내의 특정 지점에서 (3D로) 픽셀의 색상 값을 읽고 싶습니다. 즉, 말 포인트 (100,100, -200)가 파란색인지 빈 (검정)인지 알고 싶습니다.

glReadPixels는 2D 색상 추출 만 허용하고 DEPTH_COMPONENT로 시도했지만 바이트 형식으로 반환해야하는 것이 확실하지 않습니다. 이 둘을 결합하는 방법이 있습니까? 내가 놓친 게 있니?

는 어떤 도움이나 조언 나는 자바와 JOGL 이클립스를 사용하고

건배를 감사.

+0

OpenGL 3D 공간에는 '픽셀'이라는 것이 없습니다. 아무렇지도 않습니다. 화면에는 직사각형 픽셀 만 있습니다. – jondinham

답변

1

당신은이 오해 때문에 처음으로 가을이 아니므로 가능한 가장 둔한 방법이라고 말하면됩니다. OpenGL은 그런 식으로 작동하지 않습니다. OpenGL은 결코 객체 나 복잡한 장면을 다루지 않습니다! OpenGL이 알고있는 유일한 것은 프레임 버퍼, 셰이더 및 단일 삼각형입니다. 대개 삼각형으로 구성된 객체를 그릴 때마다 OpenGL은 한 번에 각 삼각형을 볼 수 있습니다. 그리고 무언가가 프레임 버퍼로 보내지면 이전에 있었던 것은 잃어 버리게됩니다.

렌더 된 장면을 부분으로 분해하는 래스터 라이저 (OpenGL처럼)의 개념에 기반한 알고리즘이 있습니다. 깊이 껍질이 그 중 하나입니다.

4

이것은 OpenGL의 컨텍스트에서 수행 할 수 없습니다. 응용 프로그램의 데이터 구조와 함께 작동하는 일종의 장면 그래프 나 다른 공간 분할 체계가 필요합니다.

이유는 간단합니다. 프레임 버퍼는 각 픽셀 위치에서 눈에 가장 가까운 조각의 색과 깊이 만 저장합니다 (일반 GL_LESS 깊이 함수라고 가정). Z 버퍼에 저장된 깊이 값은 각 후속 프래그먼트가 기존 프래그먼트보다 눈에 더 가깝거나 멀리 있는지 여부를 판별하는 데 사용됩니다. 따라서 새 프래그먼트가 기존 또는 기존 프래그먼트를 대체해야하는지 여부를 결정합니다. 프레임 버퍼는 깊이 테스트에서 가장 최근의 승자로부터의 색상 및 깊이 값만 저장하며 해당 픽셀 위치에 매핑 된 전체 조각 세트는 저장하지 않습니다. 사실, 필요한 경우 그래픽 메모리의 양을 제한 할 방법이 없습니다.

+0

고마워, 그것이 내가 두려워했던 것이다. Scence Graphing을 사용하는 Java3D를 사용해 볼 수도 있습니다. 더 많은 학습이 끝납니다! –

+0

장면 그래프를 사용하면 장면 그래프가 순수한 추상 표현이므로 "색상"이 숫자 값일뿐입니다. Java3D는 OpenGL보다 덜 유용합니다. 당신이해야 할 일은 그 장면을 깊이있는 부분으로 껍질을 벗기는 것입니다. 본질적으로 장면에 광선을 투영하고, 교차하는 오브젝트를보고 각 오브젝트의 교차점의 표면 특성을 결정해야합니다. 내부/외부 결정은 삼각형 메쉬에서 더욱 어렵습니다.이를 위해 일부 공간 세분화를 수행해야합니다. BSP 트리를 만드는 것. – datenwolf

+0

나의 무지를 사과하지만 어떻게 장면 그래프를 만들까요? OpenGL이이를 어느 정도 지원합니까, 아니면 좀 더 다른 접근 방식이 필요합니까? –

관련 문제