2014-03-25 39 views
1

在多重採樣中,在光柵化過程中,每個像素中有多個採樣點,並決定哪些採樣點構成原始圖像。流水線中的多重採樣

對於像素中的每個樣本,哪些屬性是相同的?我在某處讀到顏色和紋理值相同,但像素中樣本的深度和stensil值不同。但是由於片段着色器是針對每個採樣點執行的,因此它們應該是不同的。

此外,多個樣本何時在流水線中解析,在片段着色器之後?他們是否線性平均?

回答

6

首先,您必須瞭解多重採樣如何工作以及爲何創建它。

我將從抗鋸齒的角度來討論這個問題,因爲這是多采樣直到多采樣紋理在GL3中引入的主要用例。

當某些東西是多重採樣時,這意味着每個採樣點包含多個採樣。如果基元具有相對一致的特徵(例如,在任何地方都具有相同的深度),並且智能GL /硬件實現能夠識別這種情況並通過智能地讀取/寫入共享樣本來減少存儲器帶寬(這類似於顏色,則這些樣本可以彼此相同) /深度緩衝壓縮)。然而,4x MSAA幀緩存所需的存儲成本與4x SSAA相同,因爲GL必須適應最壞的情況,其中每個樣本都是唯一的。

對於像素中的每個樣本,哪些屬性相同?

每個片段可以覆蓋多個採樣點的屬性,例如顏色,紋理座標等而不是調用片段着色器4倍那樣頻繁實現4倍的抗混疊,特技被設計,其中每個屬性將被採樣在片段中心(這是默認值),然後將單個輸出寫入每個覆蓋的樣本位置。在片段的中心不是實際覆蓋區域的一部分的情況下,默認行爲有些缺乏 - 爲此,引入了質心採樣...頂點屬性將被插值在片段內的基元覆蓋區域的中心而不是片段本身的中心。後來,當需要向幀緩衝區寫入顏色時,所有這些採樣都需要進行平均以產生一個像素;然後,我們稱之爲多重樣本解決方案。這適用於某些情況,但不能解決片段着色過程中出現的混疊問題。

在執行片段着色器期間出現紋理,這意味着紋理的採樣頻率保持不變,所以MSAA通常不會幫助紋理別名。因此,雖然超採樣抗混疊提高在幾何邊緣紋理/着色混疊(之類的鏡面高光)兩者走樣,多重採樣一般只降低「鋸齒」。

我在某處讀到顏色和紋理值相同,但像素樣本的深度和stensil值不同。

簡而言之,片段着色器中計算的任何內容對於所有覆蓋樣本都是相同的。任何可以確定的東西之前片段着色(例如深度)可能會有所不同。

評估每個子樣本的片段測試,如深度/模板。但是多采樣深度緩衝區會帶來一些限制。直到D3D 10.1,硬件不需要支持多重採樣深度紋理,因此您不能在片段着色器中採樣多重採樣深度緩衝區。

但是由於片段着色器是針對每個採樣點執行的,所以它們應該是不同的。

有一個稱爲樣本着色的特性,它可以強制MSAA的實現更像SSAA一樣工作,方法是提高柵格化期間生成的陰影和樣本之間的比率。但默認情況下,您所描述的行爲不是多重採樣。

什麼時候在管線中解析了多個樣本,在片段着色器之後?他們是否線性平均?

多重採樣分辨率發生片段着色的,任何時候你有一個多采樣緩衝區的內容寫入一個singlesampled緩衝。這包括諸如glBlitFramebuffer (...)之類的內容。如果使用多重採樣紋理,您也可以自己手動實現多重採樣分辨率in片段着色器。

最後,關於用於多采樣分辨率的過程,這與實例相關,樣本佈局也是如此。如果您打開顯示驅動程序的控制面板並查看大量可用的消除鋸齒選項,則會看到多個選項用於樣本佈局和MSAA解析算法。


我強烈建議你看看this article。雖然它與D3D10 +而不是OpenGL相關,但一般規則適用於這兩種API(D3D9有略微不同的規則),並且圖的質量非常好。

特別是,要特別注意對MSAA光柵化規則的部分爲三角形,其中指出:

對於三角形,覆蓋測試對每個樣本位置(未用於像素中心)中進行。如果覆蓋多個採樣位置,像素着色器將在像素中心處插值屬性運行一次。對通過深度/模板測試的像素中的每個覆蓋樣本位置存儲(複製)結果。