在虚幻UE4中不同VR头盔的FOV和分屏处理

作者:Wentao_Wang
对于VR渲染来说后期处理是一个很重要的过程,但是由于VR渲染分左右眼,所以很多基于图片的后处理过程是不能简单适用,例如在VR中做一个扭曲,鲜血,或者雾气等等的特效等等,那么如何在VR中做分屏幕的后处理并且保证效果正确呢。
其实VR里后处理特效主要就是解决两个问题:
1.图像的畸变
这本质上就是因为VR头显渲染的是左右眼两个rendertarget,而不同的VR头显根据投影矩阵不同投影出来的FOV自然也是不一样,对于后处理使用的贴图来说,如果原来是按照屏幕的FOV制作的,比如1920*1080等,那么现在现在就需要按照HMD的FOV去对纹理贴图做拉伸畸变,所以我们需要一个这样的功能,在UE4里这个可以用RemapUVrange这个material function 做如下的实现:

这个材质函数能够在水平方向保持对称的对纹理进行拉伸。
那么接下来我们就是根据各个头显的projection matrix算出我们的纹理要拉伸的比例,也就是材质里面的Horizontal/Vertical fraction 
以Vive为例子。他的投影矩阵是:
  1. [0.756892   0         0   0]

  2. [0          0.681268  0   0]

  3. [-0.056316  0.003274  0   1]

  4. [0          0         10  0]
复制代码

所以我们要拉伸的数值是0.25/0.756892和 0.25/0.681268
2.左右眼
VR里的后处理都是要对左右眼同时做处理,那么如何区分左右眼呢:UE4可以利用ScreenTextureUV
做区分:

把左右眼拉伸好的图像连接到if节点的两个输出即可。
附录:各个头盔的FOV计算
/*UE4 Reported Values from Projection Matrices
DK2
  1. [0.92991    0         0   0]

  2. [0          0.75097   0   0]

  3. [???        ???       0   1]

  4. [0          0         10  0]
复制代码

CV1
  1. [1.190342   0         0   0]

  2. [0          0.999788  0   0]

  3. [-0.148592  0.110690  0   1]

  4. [0          0         10  0]
复制代码

Vive
  1. [0.756892   0         0   0]

  2. [0          0.681268  0   0]

  3. [-0.056316  0.003274  0   1]

  4. [0          0         10  0]
复制代码

投影矩阵公式
  1. [s    0       0     0 ]

  2. [0    s       0     0 ]

  3. [0    0  -f/(f-n)   -1]

  4. [0    0  -fn/(f-n)  0 ]
复制代码

其中
  1. s=1/(tan((fov/2)*pi/180))
复制代码

fov计算
  1. fov = arctan(1/s)*360/pi
复制代码

结果:
hmd
  1. hs  hfov

  2. vs  vfov
复制代码

dk2
  1. 0.92991        94.159880

  2. 0.75097        106.189099
复制代码

vive
  1. 0.756892    105.756425

  2. 0.681268    111.469296
复制代码

cv1
  1. 1.190342    80.066880

  2. 0.9997888    90.012102
复制代码



本文转自:52VR.com  虚幻4 http://www.52vr.com/thread-31271-1-1.html

你可能感兴趣的:(开发引擎相关)