- 紋理 Texture
- 交換鍊 Swap Chain
- 深度緩沖 Depth Buffer
- 紋理資源視圖 Texture Resourse View
- 多重采樣 Multisampling
- 特征等級 Feature Level
紋理( Texture )
2D紋理是一個資料元素的矩陣,2D紋理的一種使用場景是存儲一張2D圖檔每一個像素的顔色,但是他一般都不隻有這一種用途。在更進階的技術中,比如法線貼圖(Normal Mapping),他還可以存儲一個3D向量來表示法線資訊,而不是存儲顔色。紋理可以做很多事情,這些在以後會繼續讨論, 但是需要注意,一個紋理隻能按一種格式存儲,這些格式由枚舉值DXGI_FORMAT指定.
交換鍊( Swap Chain )
為了避免渲染場景時的閃爍, 最好是将這一幀的所有内容先畫到一張離屏的紋理上( back buffer ), 當一幀結束之後一次渲染到螢幕上, 這樣觀察者就隻會看到完整的幀而不是一幀中各個成員的繪制過程. 為了實作這一過程, 硬體會維護兩個buffer, 分别稱為front buffer和back buffer. front buffer存儲正在畫的幀, back buffer存儲下一幀, 當back buffer準備完畢之後, back buffer和front buffer發生交換, 這個交換操作我們把它叫做presenting. presenting本身其實是一個效率很高的操作, 因為實際上它隻是改變指針的指向.
深度緩沖( Depth Buffer )
深度緩沖便是紋理不存儲圖檔資料的一種典型應用. 它存儲了每一個像素的深度資訊, 範圍是0.0~1.0, 分别表示從最近到最遠. 它的每一像素和back buffer是嚴格一一對應的.
假設我們要按照圓柱體, 球體, 圓錐體的順序進行渲染下圖的場景. 深度緩沖的工作模式是: (back buffer一般會事先被清空, 深度緩沖全部是1.0表示最遠)d3 < d = 1.0 深度測試通過, P = P3, d = d3; d1 < d 深度測試通過, P = P1, d = d1; d2 > d 深度測試失敗不做處理. 最終我們得到像素P的顔色為P1.
深度緩沖幫助我們找到距離視點最近的像素點. 深度緩沖也是一張貼圖, 它的格式也被DXGI_FORMAT指定, 注意一個應用可以不使用模闆緩沖( stencil buffer ), 但使用時一般會和深度緩沖結合使用, 稱為深度模闆緩沖. 在一張32bits的紋理中, 深度緩沖占24bits, 模闆緩沖占8bits.
紋理資源視圖( Texture Resourse View )
紋理可以通過設定特定的标記綁定到渲染管線的不同階段, 比如作為render target和shader resource. 資源本身不會直接綁定到不同的階段, 綁定到對應階段的是資源視圖. Direct3D要求我們在初始化階段建立紋理資源視圖, 如果要把一張紋理用作render target和shader resource便需要建立ID3D11RenderTargetView和ID3D11ShaderResourceView. 為了給資源建立特定的視圖, 我們需要在建立資源時為資源綁定特定的标記. 比如為沒有指定D3D11_BIND_DEPTH_STENCIL标記的資源建立ID3D11DepthStencilView視圖将會報錯.
紋理資源視圖一般被用于以下兩點:
告訴Direct3D如何使用這個資源
當資源格式在建立時是無類型格式時, 在建立資源視圖時就必須指定其類型. 是以對于無類型格式的紋理, 它的元素可能被視為浮點數或者整數.
多重采樣( Multisampling )
由于像素并不是絕對小的點, 是以在渲染斜線的時候必然出現階梯狀的鋸齒, 這種缺陷會随着螢幕分辨率的提高減弱, 但通常不能無節制的提高分辨率, 是以我們會采取一些方法進行抗鋸齒操作. 超級采樣( Supersampling )便是其中的一種, 他使用兩個四倍于原back buffer的紋理作為back buffer和depth buffer, 在送出back buffer之前, 用四個像素的平局值來計算一個像素. 實際上這是在軟體層面提高分辨率.
但是超級采樣是極其昂貴的操作, 他相比原來使用了4倍的記憶體, pixel 處理也是4倍. 對此, Direct3D使用了一種相對妥協的方法: 多重采樣抗鋸齒. 假設我們使用4倍多重采樣抗鋸齒, 多重采樣的還是需要4倍螢幕分辨率大小的紋理, 但是他不對每一個像素進行計算, 多重采樣相較于超級采樣節省在先進行位置判斷, 這省去了對圖形内部不會産生鋸齒的像素的重複計算. 他隻在邊緣進行了類似于超級采樣的處理, 減少了抗鋸齒的消耗. 但需要注意的是多重采樣并沒有提升圖形内部的畫質, 超級采樣依舊具有更好的效果, 隻不過他也需要更強大的硬體支援.
特征等級( Feature Level )
特征等級實際上就是Direct3D提供的一個枚舉變量, 他嚴格的表示了目前的API等級, 我們在程式設計時應該注意設定特征等級, 一種好的做法是維護一個特征等級數組, API等級由高到低存儲, 在使用者的裝置無法支援高版本API時能自動降低到低版本API.