DirectX11筆記(二)--Direct3D初始化1之基本概念


紋理( Texture )

  2D紋理是一個數據元素的矩陣,2D紋理的一種使用場景是存儲一張2D圖片每一個像素的顏色,但是他一般都不只有這一種用途。在更高級的技術中,比如法線貼圖(Normal Mapping),他還可以存儲一個3D向量來表示法線信息,而不是存儲顏色。紋理可以做很多事情,這些在以後會繼續討論, 但是需要注意,一個紋理只能按一種格式存儲,這些格式由枚舉值DXGI_FORMAT指定.

交換鏈( Swap Chain )

  爲了避免渲染場景時的閃爍, 最好是將這一幀的所有內容先畫到一張離屏的紋理上( back buffer ), 當一幀結束之後一次渲染到屏幕上, 這樣觀察者就只會看到完整的幀而不是一幀中各個成員的繪製過程. 爲了實現這一過程, 硬件會維護兩個buffer, 分別稱爲front bufferback buffer. front buffer存儲正在畫的幀, back buffer存儲下一幀, 當back buffer準備完畢之後, back buffer和front buffer發生交換, 這個交換操作我們把它叫做presenting. presenting本身其實是一個效率很高的操作, 因爲實際上它只是改變指針的指向.
swap chain

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章