開放世界,大地形的繪製可以說一向是遊戲渲染開發的難點,其難度大概在三個方面:提交繪製,LOD控制與流式載入。繪製提交表現在當地形較大較複雜時,常需要使用數個Pass繪製同一片地形,這就導致Drawcall爆炸,造成的CPU消耗難以控制。遠處的物體本身難以看清,然而造成的頂點繪製消耗依然高昂,因此Level Of Detail和Streaming Load,秉承看不見的就模糊,然後卸載掉的概念,對於開放地形的繪製也是必須的。

在之前的GPU Drivne Rendering Pipeline中,我們已經實現了高效的繪製,徹底解放了CPU,在GDC 2015 Ubisoft的分享中,也指出GPU RP在繪製大地形時的性能提升:

然而GPU RP的實現方法卻著實有種拆了東牆補西牆的思想,將內存的使用轉到顯存,然後將CPU的工作轉移到GPU,這就又有幾個新的問題暴露出來:首先PCIE的性能短板,PCIE的IO性能可能只有顯存的1/10,這意味著之前不需要考慮的內存短板(因為一般大多數都是硬碟或CPU是短板),也在我們的考慮範圍內。同時GPU的數據結構與邏輯處理方法更加單一,只能使用線性的數據結構與統一併行調用的函數,這就需要在上層邏輯做許多複雜的工作來完成對資源的卸載,處理等。

因此在這一系列文章中,我們將著手研究基於GPU Driven RP的大地形繪製,管理等。

文章的進度會分以下幾部分進行,長時間不定時更新(除非難度太高,信心爆炸,一般不會棄坑):

  1. 開放大地形的繪製方法
  2. 顯存內資源的載入與卸載
  3. 資源的序列化與反序列化
  4. 場景自動化分塊工具
  5. 開放世界自動化生成工具

目前Unity3D缺乏有效的開放世界與大地形的實現方案,這一系列嘗試希望可以打破這個僵局,做到從零到一,並爭取將這套方案完整實現並投入到生產中。

推薦閱讀:

相关文章