1. 程式人生 > >D3D12渲染技術之過濾

D3D12渲染技術之過濾

紋理貼圖的元素是來自連續影象的離散顏色樣本,它們不是帶有區域的矩形。所以問題是:如果我們的紋理座標(u,v)與其中一個紋理畫素點不一致,會發生什麼?這可能發生以下情況。假設放大場景中的牆壁,使牆壁覆蓋整個螢幕,例如,假設顯示器解析度為1024×1024,牆壁的紋理解析度為256×256,這說明紋理放大 - 我們試圖用幾個紋理畫素覆蓋整個螢幕畫素,在我們的例子中,每個紋理畫素點之間有四個畫素,當頂點紋理座標在三角形上插值時,每個畫素將被賦予一對唯一的紋理座標。因此,紋理座標的畫素如果與紋理畫素點不一致,給定紋理畫素處的顏色,我們可以使用插值來近似紋理畫素之間的顏色。插值圖形硬體支援兩種方法:常量插值和線性插值,實際上,幾乎總是使用線性插值。
下圖說明了1D中的這些方法:假設我們有一個具有256個樣本的1D紋理和一個插值紋理座標u = 0.126484375。 該歸一化紋理座標指的是0.126484375×256 = 32.38紋理畫素, 當然,這個值位於我們的兩個紋理畫素樣本之間,因此我們必須使用插值來近似它。
在這裡插入圖片描述

在這裡插入圖片描述
(a)給定紋理畫素點,我們構造一個分段常數函式來逼近紋理畫素點之間的值; 這被稱為最近鄰點取樣,因為使用了最近的紋理畫素點的值。
(b)給定紋理畫素點,我們構造一個分段線性函式來逼近紋理畫素點之間的值。

二維線性插值稱為雙線性插值,如下圖所示, 給定四個紋理畫素之間的一對紋理座標,我們在u方向上進行兩次1D線性插值,然後在v方向上進行一次1D插值。
在這裡插入圖片描述
上圖中, 這裡我們有四個紋素點:cij,ci,j + 1,ci + 1,j和ci + 1,j + 1.,我們想要使用插值逼近位於這四個紋理畫素點之間的c的顏色;在這個例子中,c位於cij右邊0.75個單位,cij下面0.38個單位。 我們首先在前兩種顏色之間進行一維線性插值以獲得cT。 同樣,我們在底部兩種顏色之間進行一維線性插值以獲得cB。 最後,我們在cT和cB之間進行一維線性插值得到c。
再看下圖顯示了常量插值和線性插值之間的差異,常量插值具有建立塊狀影象的特徵, 線性插值更平滑,但仍然看起來不像我們有真實資料(例如,更高解析度的紋理)而不是通過插值得到的資料。
在這裡插入圖片描述


我們放大具有板條紋理的立方體, 在左側,我們使用常數插值,這會導致塊狀外觀,因為插值函式具有不連續性,這使得變化突然而不是平滑。 在右側,我們使用線性濾波,由於插值函式的連續性,導致更平滑的影象。

關於這個討論需要注意的一點是,在3D程式中,虛擬相機可以自由移動, 從某些距離看,紋理看起來很棒,但是當眼睛離它們太近時會開始出現鋸齒。 有些遊戲會限制虛擬相機接近表面的距離,以避免出現鋸齒。

在紋理化中,使用常量插值來尋找紋素之間的紋理座標的紋理值也稱為點過濾, 並且使用線性插值來查詢紋理畫素之間的紋理座標的紋理值也稱為線性過濾, 點和線性過濾是Direct3D使用的術語。

縮小

前面介紹了放大,下面介紹縮小,在縮小時,太多的紋理畫素被對映到太少的畫素。例如,考慮以下情況,我們有一個256×256的牆
,看著牆壁的眼睛一直向後移動,使牆壁越來越小,直到它只覆蓋螢幕上的64×64畫素,所以現在我們有256×256紋素被對映到64×64螢幕畫素。在這種情況下,畫素的紋理座標通常仍然不與紋理貼圖的任何紋理畫素相吻合,因此恆定和線性插值濾鏡仍然適用於縮小情況。但是,縮小可以做更多的事情,直觀地說,應該採用256×256紋素的一種平均取樣來將其降低到64×64,mipmapping技術以一些額外的記憶體為代價提供了有效的近似。在初始化時,通過對影象進行下采樣以建立mipmap鏈來生成較小版本的紋理(請參見下圖)。因此,平均是針對mipmap大小預先計算的,在執行時,圖形硬體將根據程式設計師指定的mipmap設定執行兩項不同的操作:
1、選擇並使用與投影螢幕解析度最匹配的mipmap級別進行紋理處理,根據需要應用常量或線性插值, 這稱為mipmap的點過濾,因為它類似於常量插值 - 只需選擇最近的mipmap級別並將其用於紋理。

2、選擇最接近投影螢幕解析度的兩個最接近的mipmap級別進行紋理處理(一個大於螢幕解析度,一個小於螢幕解析度)。 接下來,對這兩個mipmap級別應用常量或線性過濾,以為每個級別生成紋理顏色。 最後,在這兩個紋理顏色結果之間進行插值, 這稱為mipmap的線性過濾,因為它類似於線性插值 - 在兩個最近的mipmap級別之間進行線性插值。

通過從mipmap鏈中選擇最佳紋理級別的細節,可以大大減少縮小量。
在這裡插入圖片描述
一系列mipmap,每個連續的mipmap是每個維度的一半大小,前一個mipmap級別的詳細資訊低至1×1。
可以使用Photoshop DDS匯出器外掛或使用texconv程式建立mipmap, 這些程式使用下采樣演算法從基本影象資料生成較低的mipmap級別, 有時這些演算法不會保留我們想要的細節,美工必須手動建立/編輯較低的mipmap級別以保留重要的細節。

各向異性過濾

可以使用的另一種型別的過濾器稱為各向異性過濾, 該濾波器有助於減輕當多邊形的法線向量和相機的外觀向量之間的角度較寬時發生的失真(例如,當多邊形與檢視視窗正交時)。 這種濾波器是最昂貴的,但是可以用於校正失真偽像的成本, 下圖顯示了比較各向異性過濾和線性過濾的螢幕截圖。
在這裡插入圖片描述
板條箱的頂面幾乎與觀察視窗正交, (左)使用線性過濾條件的頂部非常模糊, (右)各向異性過濾在從這個角度渲染板條頂面時做得更好。