对于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