2015-09-17 35 views
3

我做了一些搜索,但是我發現的唯一結果是反鋸齒和背後的機制。除了抗鋸齒之外,我還可以使用多采樣緩衝區嗎?

我想用比抗鋸齒其他的東西多樣品緩衝液。具體來說,我想到的是一種與順序無關的透明度,在每個樣本中存儲不同的顏色和深度值(理想情況下是距離相機最近的N個片段)。

這甚至可能擺在首位?它之前是否已經完成,如果是這樣,怎麼辦?即使有可能,它是否比只分配另外N個幀緩存更有記憶效率?

如果是這樣,這將需要計算着色器或OpenCL的,這很好,我只是好奇,看看它擺在首位是可能的。

這個問題是不特定於OpenGL或DirectX,因爲硬件會在兩種情況下是相同的。

PS。請不要僅僅指向其他與順序無關的透明度方法,這個問題具體是關於多采樣緩衝區是否可用於非典型手段。

+0

我不這麼認爲,除非你可以編程光柵化器。 DX12可能是可能的,但我不知道。這可能使其可用於非反走樣使用。但你的想法似乎仍然不可能。 –

+0

從來沒有嘗試過,但從OpenGL 4.0開始,可以使用'gl_SampleMask'變量[(引用)](https://www.opengl.org/wiki/Built-in_Variable_( GLSL)#Fragment_shader_outputs)。 – BDL

+0

有趣的想法,但我不以任何方式看到這個工作。即使使用來自@BDL的'gl_SampleMask',三角形的邊緣也無法正確處理,因爲您無法寫入未被基元覆蓋的像素。例如,當使用2x2多重採樣並且您的圖元覆蓋4個子像素中的3個時,不能寫入第4個子像素。 – dari

回答

1

最大的問題是,系統是硬編碼使用多重採樣,以及多重採樣,而不是存儲任意數據。

通過使用gl_SampleMask output的,您可以直接片段着色器的結果給多重採樣緩衝的一個特定的樣本。然後,您可以使用着色器執行自定義多重樣本解析,以便執行透明度排序或您計劃在此處執行的任何操作。

理論上當然。然而在實踐中,gl_SampleMask將邏輯地與由該光柵化器爲該片段計算的樣本掩碼相關聯。因此,如果您將gl_SampleMask設置爲寫入片段未涵蓋的特定樣本,則不會寫入任何內容。

對此,您無能爲力。即使明確激活每個樣本片段着色器評估也不會對您有所幫助,因爲系統仍將根據您渲染的幾何圖形計算並使用該遮罩。

所以一般來講,沒有,沒有太多可以使用多級採樣的抗鋸齒之外。