2017-05-11 54 views
2

我對圍繞我的網格的邊緣輪廓呈現的計算機視覺任務的亞像素抽樣感興趣。我正在考慮使用MSAA來高效地執行它(但應用程序不適用於抗鋸齒)。我發現使用多重採樣的問題是,爲了從GPU讀取樣本,我只能將幀緩衝區刷新爲非多次採樣,因此我無法恢復單個樣本信息。我的問題是:在CPU中處理單個MSAA樣本

  • 有沒有一種方法來教學貫徹存儲每個樣本(GL_SAMPLE_SHADING)計算的結果,這樣我可以讀取這些樣本帶回CPU片段着色器?我想過使用glSampleID將輸出索引到不同的輸出緩衝區,但不知道這是否可能。也許像OIT使用的鏈表結構(即http://on-demand.gputechconf.com/gtc/2014/presentations/S4385-order-independent-transparency-opengl.pdf)?但是,他們在GPU上執行所有計算,因此我不確定是否可以以任何方式讀取CPU中的鏈接列表數據。

也許MSAA是錯誤的方法,還有其他方法可以這樣做。我想我最後的手段是超級抽樣渲染X次,從而恢復單個樣本,但這似乎是一個非常低效的解決方案。

+0

您是否正在渲染到多采樣幀緩衝區?如果是的話,你可以用'texelfetch()'獲得單個樣本。 – dari

+0

啊我錯過了texefetch,看起來像一個有用的方法。如果我理解正確,那麼我必須:在第一遍中存儲我的着色器計算結果(通過imageStore?)。然後,運行着色器N次(其中N是所用樣本的數量),它只使用texelfetch檢索圖像樣本? – PolMC

+0

您可以按照與普通紋理相同的方式進行渲染。 A用於檢索,可以對片段着色器中的所有樣本進行循環。 – dari

回答

1

您可以編寫計算着色器來讀取樣本並通過imageLoad寫入每個樣本的數據,然後將其寫入SSBOs(FS輸出和image load/store不適合輸出)。在需要閱讀時需要通常的內存障礙同步,但這樣,您可以直接寫入buffer object,而不必使用PBO to read from a texture

最難的部分將會將gl_GlobalInvocationID和其他計算着色器輸入轉換爲SSBO數組中的索引以及imageLoad操作的紋理座標和樣本索引。