Sparse Virtual Texture (虛擬貼圖技術)
Virtual texture 技術用於解決3D場景中大量貼圖而記憶體有限的情況,它的思想可以參考虛擬記憶體。
虛擬記憶體技術中,實體記憶體是有限的,但是虛擬記憶體可以遠遠大於實體記憶體,虛擬記憶體被抽象成一個個page即分頁檔案,page可以真實的載入到實體記憶體中,也可以存在與磁碟檔案上,定址時採用的記憶體地址採用一個表來對映到具體的的記憶體位置,如果對映到實體記憶體裡,即hit,如果在磁碟的page上,將其載入實體記憶體,對於當前不使用的記憶體可能會被儲存回磁碟。
虛擬貼圖技術同樣,它的基本思想是這樣的:
所有程式用到的貼圖會程式處理被pack到幾張非常大的虛擬貼圖上,模型的uv也被轉為虛擬貼圖上的uv,這些虛擬貼圖尺寸通常非常大,無法全部載入記憶體。每個虛擬貼圖會被劃分為很多n*n的小塊,每個小塊稱為一個page檔案存在磁碟上, 虛擬貼圖會對應一張indirection texture,這張圖是載入記憶體的,indirection
真實貼圖最開始可能是空的,噹噹前畫面需要訪問某個虛擬貼圖上的某個page的時候,通過indirection texture找到它在物理貼圖上的位置,如果物理貼圖上不存在,就查詢到它對應的磁碟上的page檔案,將其載入物理貼圖的對應區域。shader在渲染的時候,結合indirection texture去訪問物理貼圖來取樣。上面的這個虛擬貼圖,indirection map ,物理貼圖之間的關係如下
這裡面還存在一些問題,首先如何知道需要load到實體記憶體裡哪些page,通常的做法是預先用一個很簡單的shader先渲染一遍,將場景物件的page id渲染到rt上,然後load那些page。程式通常可以通過當前需要渲染的page id對應到虛擬貼圖的uv,再轉換到indirection texture的座標上。
此外對於虛擬貼圖也要處理mipmap,對於虛擬貼圖也同時存在它的多個mipmap的虛擬貼圖和indirection texture。load 物理貼圖的時候同時要load 這些mipmap。
虛擬貼圖減少了記憶體佔用,但是對於io是一個挑戰,尤其在快速轉動視角,飛行等快速切換渲染物體的情況下,很多時候載入貼圖的時間會成為瓶頸,這是在實現中一個很大的問題。一些優化方法包括每次對page優先載入mipmap最低一層的,最後載入高層的,這樣當所需的mip沒有載入好的時候,可以向使用最低的那個mipmap,然後待載入好之後再展示細節更高的。
這裡有一些參考資料
cryengine4在大terrain上使用的虛擬貼圖策略,gdc2015的文章
http://twvideo01.ubm-us.net/o1/vault/gdc2015/presentations/Chen_Ka_AdaptiveVirtualTexture.pdf
幾個paper
https://silverspaceship.com/src/svt/
http://www.mrelusive.com/publications/papers/Software-Virtual-Textures.pdf