2017-02-21 3 views
1

큰 점 구름이 있고 각 점에 {x, y, z, r, g, b}가 있습니다. 주어진 카메라 포즈와 각도에서 점 구름을보고 스크린 샷에 저장할 수 있습니다. 이 이미지를 기반으로 포인트 클라우드를 변경해야합니다.OpenGL은 픽셀의 원래 3 차원 좌표를 얻습니다.

투영 된 이미지의 각 픽셀의 원래 좌표는 어떻게 얻습니까?

기본적으로 픽셀의 각 점을 투영하는 대신 각 픽셀의 원래 위치 (또는 다른 메타 데이터)를 저장하려고합니다.

각보기에 N * M * 3 행렬 대신 N * M * 3 (RGB) + N * M * 3 (좌표)를 저장하려고합니다. 매번이 정보가 필요하며 계산상의 오버 헤드는 문제가되지 않습니다.

답변

0

설치 또는 요구 사항에 대한 세부 정보가 없으면 현대 OpenGL (3.x +) 환경에 있다고 가정합니다. 이 경우 추가 렌더링 대상을 사용하고 추가 데이터를 다른 (색이 아닌) 대상에 저장할 수 있습니다.

여러분의 포인트 클라우드 데이터가 정점 (또는 기하학 셰이더)에 전달된다고 가정합니다. 원래 x, y, z 값을 varying으로 프래그먼트 셰이더에 전달해야합니다. 프래그먼트 쉐이더에 out 파라미터를 추가하고 원래 좌표에 새로운 out 파라미터로 씁니다.

그런 다음 glBindFragDataLocation을 사용하여 대상을 새 출력에 바인딩합니다. 아마 당신은 이미 당신의 컬러 출력으로 이것을하고 있습니다. 추가 타겟 텍스처는 부동 소수점 텍스처 (드라이버가 지원하는 경우 GL_RGB32F) 일 필요가 있습니다. '정상'색상 표 (GL_RGBA8)는 해상도가 충분하지 않습니다.

"스크린 샷"을 찍으면 색상 출력과 추가 대상을 모두 절약 할 수 있습니다. 컬러 출력의 모든 픽셀은 추가 대상의 동일한 픽셀에 해당하므로 출력 할 원래 포인트의 좌표를 읽을 수 있습니다. GPU를 사용하여 추가 처리를 수행하려는 경우 동일한 픽셀에서 두 텍스처를 모두 샘플링하여 통신 할 수 있습니다. '빈'픽셀 (예 : 객체가없는 픽셀)을 구현하는 방법을 결정해야합니다.

필요한 추가 메타 데이터에 대해이를 복제하고 추가 대상을 추가 및 바인딩 할 수 있습니다 (충분한 설정이 해당 대상을 충분히 지원한다고 가정 할 때). 가질 수있는 출력의 최대 수는 GL_MAX_DRAW_BUFFERS으로 정의되지만 최소 8이되도록 보장됩니다.

관련 문제