對於VR渲染來講後期處理是一個很重要的過程,可是因爲VR渲染分左右眼,因此不少基於圖片的後處理過程是不能簡單適用,例如在VR中作一個扭曲,鮮血,或者霧氣等等的特效等等,那麼如何在VR中作分屏幕的後處理而且保證效果正確呢。函數
其實VR裏後處理特效主要就是解決兩個問題:spa
1.圖像的畸變
這本質上就是由於VR頭顯渲染的是左右眼兩個rendertarget,而不一樣的VR頭顯根據投影矩陣不一樣投影出來的FOV天然也是不同,對於後處理使用的貼圖來講,若是原來是按照屏幕的FOV製做的,好比1920*1080等,那麼如今如今就須要按照HMD的FOV去對紋理貼圖作拉伸畸變,因此咱們須要一個這樣的功能,在UE4裏這個能夠用RemapUVrange這個material function 作以下的實現:
code
這個材質函數可以在水平方向保持對稱的對紋理進行拉伸。
那麼接下來咱們就是根據各個頭顯的projection matrix算出咱們的紋理要拉伸的比例,也就是材質裏面的Horizontal/Vertical fraction
以Vive爲例子。他的投影矩陣是:blog
[0.756892 0 0 0] [0 0.681268 0 0] [-0.056316 0.003274 0 1] [0 0 10 0]
因此咱們要拉伸的數值是0.25/0.756892和 0.25/0.681268圖片
2.左右眼
VR裏的後處理都是要對左右眼同時作處理,那麼如何區分左右眼呢:UE4能夠利用ScreenTextureUV
作區分:
get
把左右眼拉伸好的圖像鏈接到if節點的兩個輸出便可。it
附錄:各個頭盔的FOV計算
/*UE4 Reported Values from Projection Matrices
DK2io
[0.92991 0 0 0] [0 0.75097 0 0] [??? ??? 0 1] [0 0 10 0]
CV1function
[1.190342 0 0 0] [0 0.999788 0 0] [-0.148592 0.110690 0 1] [0 0 10 0]
Viveclass
[0.756892 0 0 0] [0 0.681268 0 0] [-0.056316 0.003274 0 1] [0 0 10 0]
投影矩陣公式
[s 0 0 0 ] [0 s 0 0 ] [0 0 -f/(f-n) -1] [0 0 -fn/(f-n) 0 ]
其中
s=1/(tan((fov/2)*pi/180))
fov計算
fov = arctan(1/s)*360/pi
結果:
hmd
hs hfov vs vfov
dk2
0.92991 94.159880 0.75097 106.189099
vive
0.756892 105.756425 0.681268 111.469296
cv1
1.190342 80.066880 0.9997888 90.012102