D3D12渲染技術之過濾

2021-08-28 12:35:20 字數 2345 閱讀 3431

紋理貼圖的元素是來自連續影象的離散顏色樣本,它們不是帶有區域的矩形。所以問題是:如果我們的紋理座標(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使用的術語。

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

通過從mipmap鏈中選擇最佳紋理級別的細節,可以大大減少縮小量。

一系列mipmap,每個連續的mipmap是每個維度的一半大小,前乙個mipmap級別的詳細資訊低至1×1。

可以使用photoshop dds匯出器外掛程式或使用texconv程式建立mipmap, 這些程式使用下取樣演算法從基本影象資料生成較低的mipmap級別, 有時這些演算法不會保留我們想要的細節,美工必須手動建立/編輯較低的mipmap級別以保留重要的細節。

可以使用的另一種型別的過濾器稱為各向異性過濾, 該濾波器有助於減輕當多邊形的法線向量和相機的外觀向量之間的角度較寬時發生的失真(例如,當多邊形與檢視視窗正交時)。 這種濾波器是最昂貴的,但是可以用於校正失真偽像的成本, 下圖顯示了比較各向異性過濾和線性過濾的螢幕截圖。

板條箱的頂面幾乎與觀察視窗正交, (左)使用線性過濾條件的頂部非常模糊, (右)各向異性過濾在從這個角度渲染板條頂面時做得更好。

D3D12渲染技術之渲染管線

渲染管線指的是通過虛擬相機看到的內容生成2d影象的整個步驟序列,在部落格d3d12渲染技術概述中介紹過渲染管線,本篇部落格具體講解各個模組的作用,先看下圖所示 上圖中input assembler stage表示的是從儲存器讀取幾何資料 頂點和索引 並使用它來組裝幾何圖元 例如,三角形,線條 簡單地...

D3D12渲染技術之紋理案例

我們現在回顧一下將紋理新增到箱子模型上面,就跟以前的部落格中提到的那樣。下面我們詳細介紹如何實現?geometrygenerator createbox生成箱子的紋理座標,以便將整個紋理影象對映到箱子的每個面上。為簡潔起見,我們僅顯示正面,背面和頂面的頂點定義。另請注意,我們省略了頂點建構函式中法線...

D3D12渲染技術之在著色器中取樣

我們直奔主題,紋理物件在hlsl中定義,並使用以下語法分配給紋理暫存器 texture2d gdiffusemap register t0 這個換成在unity引擎或者ue4引擎中就是提供的視覺化操作介面,而在dx中的表示是按照上面的寫法,這樣可以通過引擎對其進行賦值操作。請注意,紋理暫存器使用由t...