2017-02-21 208 views
1

我有一個大的點雲,每個點有{x,y,z,r,g,b}。 我能夠從給定的相機姿態和視角查看點雲,並將其保存到屏幕截圖中。我需要根據此圖像對我的點雲進行更改。OpenGL獲取像素的原始三維座標

如何獲取投影圖像中每個像素的原始座標?

基本上,我不是僅僅投影像素上的每個點,我還想要存儲每個像素的原始位置(或任何其他元數據)。

我想爲每個視圖保存N * M * 3(RGB)+ N * M * 3(座標),而不是僅保存N * M * 3矩陣。 請注意,我每次都需要這些信息,計算開銷不是問題。

回答

0

沒有關於您的設置或要求的更多細節,我會假設您處於現代OpenGL(3.x +)環境中。在這種情況下,您可以簡單地使用額外的渲染目標,並將其他數據存儲在其他(非顏色)目標中。

我假設你的點雲數據正在傳遞給一個頂點(或幾何着色器)。您需要將原始的x,y,z值傳遞給varying的片段着色器。爲片段着色器添加額外的out參數,並將原始座標寫入新的參數out

然後,您將通過使用glBindFragDataLocation將目標綁定到新輸出。想必你已經在用你的色彩輸出做這個了。您的額外目標紋理可能需要爲浮點紋理(如果驅動程序支持,則爲GL_RGB32F)。 「正常」顏色目標(GL_RGBA8)沒有足夠的分辨率。

以「屏幕截圖」,您將保存您的顏色輸出和額外的目標。顏色輸出中的每個像素都對應於附加目標中的相同像素,爲此您可以讀取輸出的原始點的座標。如果您打算使用GPU進行進一步處理,則可以在相同的像素處採樣兩個紋理進行通信。您需要決定如何實現「空」像素(例如那些沒有對象存在的像素)。

您可以複製它以獲取您需要的任何其他元數據,添加和綁定其他目標(假定您的設置支持足夠的這些目標)。您可以擁有的最大輸出數量由GL_MAX_DRAW_BUFFERS定義,但保證至少爲8.