VR裏面作分屏後處理(Split screen post process UE4)

對於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
相關文章
相關標籤/搜索