2016-05-16 45 views
2

我有一個灰度紋理(8000 * 8000),每個像素的值是一個ID(實際上,這個ID是片段所屬的三角形的ID,我想用這個方法來計算有多少個三角形和哪個三角形在我的場景中可見)。如何使用GLSL計算指定彩色像素的數量?

現在我需要統計有多少個唯一的ID以及它們是什麼。我想用GLSL實現這一點,並儘量減少GPU RAM和RAM之間的數據傳輸。

我想出的最初想法是使用着色器存儲緩衝區,將它綁定到GLSL中的數組,其大小爲totalTriangleNum,然後在着色器中迭代ID紋理,將數組元素增加1等於紋理中的ID。

之後,讀取緩衝區到OpenGL應用程序,並得到我想要的。這是否是一種有效的方式?還是有一些更好的解決方案,比如計算着色器(以及我不熟悉它)或其他東西。

+0

你所描述一樣計算着色器的聲音給我。我不知道你想用什麼其他類型的着色器。 –

+0

@DietrichEpp我只是想使用片段着色器來做到這一點,而我剛剛聽說過計算着色器。 –

+0

片段着色器沒有意義,因爲您沒有進行任何繪製。 –

回答

4

我想用這種方法來計算該三角形多少個三角形是可見的在我的場景)

鑑於你的數據的描述讓我重複說了一下:

您想要確定數據集中有多少個不同的值,以及每個值的出現頻率。

這通常被稱爲Histogram。不幸的是(對於你)生成直方圖是在GPU上不能解決的問題。基本上你必須把你的圖像分成更小和更小的子圖像(BSP,四叉樹等),直到分割成你執行評估的單個像素。然後你回溯傳播子直方圖,基本上在直方圖上執行插入或合併排序。使用GPU生成直方圖仍在積極研究中,因此我建議您閱讀已發佈的學術着作(通常附帶源代碼)。關鍵詞:直方圖,GPU

這一個是由AMD GPU的研究人員做了一個漂亮的紙:https://developer.amd.com/wordpress/media/2012/10/GPUHistogramGeneration_preprint.pdf

+0

感謝您爲我提供有關此問題的一些指導。 –

+1

我不會說在GPU上計算直方圖很困難。一個非常基本的實現是相當平凡的。挑戰只有在試圖儘可能高效時纔會出現,哪裏有各種優化選項,哪種方法效果最好可以取決於硬件。在尋找文獻時,直方圖就是所謂的「減少操作」的一個例子。所有供應商都應該有關於如何最有效地實施這些技術的白皮書。不過,它們可能比OpenGL更加OpenCL。 –

+0

@ReetoKoradi:請注意,我寫了「不平凡解決」,這意味着不同於「困難」。例如,您可以嘗試使用着色器中的循環遍歷所有像素(tivial解決方案),但是您可能會發現這隻會在單個warp/wavefront(即非並行)中執行,並可能會超時。所以你必須改變你的策略,從而變得不平凡。但這並不是一個困難的問題,你不能再以天真的方式去做。 – datenwolf