天天看點

DirectX11筆記(二)--Direct3D初始化1之基本概念紋理( Texture )交換鍊( Swap Chain )深度緩沖( Depth Buffer )紋理資源視圖( Texture Resourse View )多重采樣( Multisampling )特征等級( Feature Level )

  • 紋理 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本身其實是一個效率很高的操作, 因為實際上它隻是改變指針的指向.

DirectX11筆記(二)--Direct3D初始化1之基本概念紋理( Texture )交換鍊( Swap Chain )深度緩沖( Depth Buffer )紋理資源視圖( Texture Resourse View )多重采樣( Multisampling )特征等級( Feature Level )

深度緩沖( 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.

DirectX11筆記(二)--Direct3D初始化1之基本概念紋理( Texture )交換鍊( Swap Chain )深度緩沖( Depth Buffer )紋理資源視圖( Texture Resourse View )多重采樣( Multisampling )特征等級( Feature Level )

  深度緩沖幫助我們找到距離視點最近的像素點. 深度緩沖也是一張貼圖, 它的格式也被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.

繼續閱讀