1. 程式人生 > >一些關於API層面的優化的VR渲染優化方法

一些關於API層面的優化的VR渲染優化方法

VR渲染需要左右眼兩幅不同的畫面,現在的大部分引擎都是暴力的直接渲染兩遍,這樣做想想效能也很難達到75FPS(或90FPS)

以Oculus DK2為例,[email protected],加上Super Sampling就變成了(UE4預設135%)[email protected]

如果是Oculus的消費者版本和HTC Vive,解析度和重新整理率更是提升到了[email protected], 推薦配置是GTX980

以140%的Super Sampling為標準的話,只是Color Buffer每秒的資料量就有2160x1200x1.4x1.4x90x4 byte ≈ 1.7GB

這還沒算Post Processing裡的N多張Render Target和Deferred Rendering的GBuffer、Light Buffer

效能永遠是VR渲染的最具有挑戰的部分,本著能省一點是一點的思路,VR的渲染優化我總結了這麼一些:

雖然VR渲染需要左右兩幅畫面, 但是有很多效果是不需要畫兩次的:

  • Shadow Map
  • 部分的Reflection
  • Occlusion Query
  • 大多數Post Processing

API層面的優化, 有這麼幾個思路:

  • 如果實現了多執行緒的渲染,一般會有一個Command Buffer,直接分別以不同的View提交兩次
  • 針對每個物體分別提交兩次, 相比上面這個State切換開銷會節省一些
  • 使用Geometry Shader直接把Mesh分成左右眼的,drawcall不會翻倍了。但是坑爹的GS效能不咋地
  • 使用Instancing一次drawcall繪製兩個Viewport, 跟GS類似,但效能大約是GS的3倍
這只是減少一些API呼叫、State切換還有Vertex處理的消耗,那瓶頸最大的Pixel處理的消耗怎麼減少呢?

Valve使用一個Stencil Mesh, 剔除了17%的畫素


NVIDIA的GameWorks也提供了一種方法, 叫Multi-Resolution Shading,大概的思路就是邊緣的畫素經過變形後會損失一些,另外人眼對視線中心的畫素更敏感,所以周圍一圈可以降低解析度來渲染。通過這種方式可以節省25%到50的畫素


硬體方面,NVIDIA和AMD都推出了雙GPU渲染的支援,即每塊GPU渲染一隻眼睛的畫面。嗯,這一定是個陰謀,他們肯定在偷著樂:這下顯示卡不愁賣了


SONY的PS VR在PS4的機能下實現了120FPS。聽起來不可思議,實際是60FPS通過reproject插值出中間幀,跟Killzone的Temporal Reprojection 和Oculus的Timewrap差不多原理

參考資料:

http://blog.csdn.net/xoyojank/article/details/48719617