2014-02-24 58 views
1

我正在使用一些標準的GLSL(版本120)頂點和片段着色器來模擬LIDAR。換句話說,不是隻在每個x,y位置(每個像素,通過片段着色器)返回一個顏色,它應該返回顏色和距離。我需要我的GLSL片段着色器來返回距離計算

我想我實際上並不需要所有的顏色位,因爲我真的只想要強度;所以我可以將距離存儲在gl_FragColor.b中,例如,使用.rg作爲強度。但是,我並沒有完全清楚我如何將價值重新拿回來。

是否有一種簡單的方法可以從片段着色器中返回值?我試過varying,但好像片段着色器不能寫gl_FragColor以外的變量。

據我所知,有些人使用GLSL管道進行通用(非圖形)GPU處理,這可能是一個選項 - 除非我仍然想要正常渲染我的對象。

+1

你想將片段着色器輸出*返回給*?主機內存?紋理? – genpfault

+0

我想主機內存。我不太清楚如何回答這個問題。我想只是能夠從緩衝區中獲得價值。我對此的看法越多,將它存儲在顏色通道中似乎越有意義。雖然有一些方法不會干擾色彩存儲? –

回答

2

的OpenGL已經返回經由深度緩衝器這個「距離計算」,雖然這不是線性。您可以簡單地創建一個幀緩衝區對象(FBO),附加顏色和深度緩衝區,渲染它,並且將結果放在深度緩衝區中(儘管您必須撤消深度變換)。如果您熟悉深度計算,這是程序最簡單的選項。

正如您所建議的,另一種方法是將值存儲在顏色緩衝區中。您不必使用主色彩緩衝區,因爲那樣會丟失顏色或渲染兩次。相反,將第二個渲染目標(紋理)附加到FBO(GL_COLOR_ATTACHMENT1),並使用gl_FragData[0]代表正常顏色,gl_FragData[1]代表距離(對於更新的GL版本,您應該在片段着色器中聲明out變量)。這取決於你需要的精度,但你可能想要使距離紋理32位浮動(GL_R32F並寫入gl_FragData[1].r)。
- 這是一個體面的地方開始:http://www.opengl.org/wiki/Framebuffer_Object

是的,GLSL可用於計算目的。特別是使用ARB_image_load_store和nvidia的無圖形圖形。你甚至可以通過計算着色器訪問共享內存(雖然我從來沒有比使用速度慢5倍的速度)。正如@Jherico所說,片段着色器通常輸出到幀緩衝區附件/渲染目標中的一個位置,最近的功能(如圖像單元(ARB_image_load_store))允許您從着色器寫入任意位置。這可能是矯枉過正,但速度較慢,但​​你也可以通過圖像單位將距離寫入緩衝區。

最後,如果您希望數據回到主機(CPU可訪問)一側,請使用glGetTexImage和距離紋理(如果您決定使用圖像單元,則使用glMapBuffer)。

+0

我希望我可以多次投這個答案。謝謝你,謝謝你,謝謝你。 –

1

片段着色器輸出到渲染緩衝區。如果你想使用GPU進行計算並將數據提取回主機內存,你有幾個選項

  • 創建一個幀緩衝區並附加一個紋理來保存你的數據。一旦圖像被渲染,您可以從紋理讀回信息到主機內存中。
  • 使用一個CUDAOpenCLOpenGL compute shader寫存儲器爲任意結合的緩衝液中,並讀回緩衝器內容
+0

你可以添加一個鏈接或類似的東西解釋如何做到這一點?我以前聽過這些答案,但找不到一個好的參考。 –

+0

我已經添加了一些相關文本的鏈接。 – Jherico