关于D3D11,你必须了解的几件事情(三):完结篇
轉載請注明出處為KlayGE游戲引擎,本文地址為http://www.klayge.org/2011/08/26/%e5%85%b3%e4%ba%8ed3d11%ef%bc%8c%e4%bd%a0%e5%bf%85%e9%a1%bb%e4%ba%86%e8%a7%a3%e7%9a%84%e5%87%a0%e4%bb%b6%e4%ba%8b%e6%83%85%ef%bc%88%e4%b8%89%ef%bc%89%ef%bc%9a%e5%ae%8c%e7%bb%93%e7%af%87/
上文介紹了D3D11的兩個重要特性compute shader和multi-threaded,本篇專注于兩個不能在D3D10硬件上使用的、純D3D11的新特性tessellation和BC6H/BC7紋理壓縮。
Tessellation
很 多人會說D3D11增加了tessellation shader這個stage,但真相是增加了hull shader、tessellator和domain shader三個stage。Hull shader的輸入是patch的控制點(三角形、四邊形這樣的圖元,最多有32個控制點),計算出tessellation等級、確定 tessellation的方法等。它的輸出被送給固定單元的tessellation進行細分。Domain shader的輸入是細分后的bary centric坐標、來自hull shader的控制點,它負責計算插值后的頂點坐標。
Tessellation早就存在于一些GPU。 D3D9的API中其實就正式存在一些使用patch的能力。比如NVIDIA的Geforce 2就支持PN-Patch,但在Forceware 29.xx之后(如果我沒記錯的話)就因為效率和使用率問題而禁用了。后來ATI設計的XBox360的GPU里面就有個不可編程的 tessellator,這個架構一直延續到Radeon HD 5000系列為止。和D3D11不同的是,這個tessellator位于VS之前,而不是VS之后。這么做的好處是流水線變簡單了,由VS完成DS的功 能即可。但缺點也很明顯——性能會受到嚴重影響:
tessellation等級必須在另一個pass計算
本來應該在per vertex上做的事情(比如乘上wvp)變成要在細分插值后的頂點上作,顯著地增加了計算量;要么就還要一個pass來做這件事情
所以D3D11用這種設計對性能提升很有幫助的。
NVIDIA Direct3D SDK 11里特別提供了一個名為Tessellation Pattern Viewer的工具,用來查看在不同參數下,三角形和四邊形被tessellate后的拓撲。
Tessellation Pattern
BC6H/BC7
D3D11 增加了BC6H和BC7兩種紋理壓縮格式,分別擅長HDR壓縮和高質量LDR壓縮,都能達到8bpp。BC6H和BC7的原理類似,但比原先的BC1-5 復雜了非常多。所以壓縮的運算量也大了巨多。比如512×512的原始圖片,用D3DX里面提供的BC6H或BC7壓縮,需要10分鐘左右。解決方法是用 DX SDK提供的BC6HBC7EncoderDecoder11這個例子來進行GPU加速壓縮,只要幾秒鐘即可。更新的版本可以從這里下載到。
下圖是用BC6H來壓縮一張HDR圖片的結果。左邊是原圖(給定曝光度),中間是誤差絕對值,右邊是壓縮后的圖。
BC6H壓縮的結果
下圖是一個BC3(也就是DXT5)和BC7的壓縮誤差比較。左邊是原圖,中間是誤差絕對值,右邊是壓縮后的圖。很明顯可以看出,BC7的誤差遠小于BC3,尤其是在邊界的地方。
BC3和BC7的比較
介紹了這些D3D11的“基本”概念后,本系列就此打住。希望能給對D3D11一知半解的人有所幫助。
KlayGE游戲引擎
總結
以上是生活随笔為你收集整理的关于D3D11,你必须了解的几件事情(三):完结篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 胜蓝股份和泰达什么关系 经营范围不同并无
- 下一篇: 夫君子之行的意思