作者:Wentao_Wang
对于VR渲染来说后期处理是一个很重要的过程,但是由于VR渲染分左右眼,所以很多基于图片的后处理过程是不能简单适用,例如在VR中做一个扭曲,鲜血,或者雾气等等的特效等等,那么如何在VR中做分屏幕的后处理并且保证效果正确呢。
其实VR里后处理特效主要就是解决两个问题:
1.图像的畸变
这本质上就是因为VR头显渲染的是左右眼两个rendertarget,而不同的VR头显根据投影矩阵不同投影出来的FOV自然也是不一样,对于后处理使用的贴图来说,如果原来是按照屏幕的FOV制作的,比如1920*1080等,那么现在现在就需要按照HMD的FOV去对纹理贴图做拉伸畸变,所以我们需要一个这样的功能,在UE4里这个可以用RemapUVrange这个material function 做如下的实现:
这本质上就是因为VR头显渲染的是左右眼两个rendertarget,而不同的VR头显根据投影矩阵不同投影出来的FOV自然也是不一样,对于后处理使用的贴图来说,如果原来是按照屏幕的FOV制作的,比如1920*1080等,那么现在现在就需要按照HMD的FOV去对纹理贴图做拉伸畸变,所以我们需要一个这样的功能,在UE4里这个可以用RemapUVrange这个material function 做如下的实现:
这个材质函数能够在水平方向保持对称的对纹理进行拉伸。
那么接下来我们就是根据各个头显的projection matrix算出我们的纹理要拉伸的比例,也就是材质里面的Horizontal/Vertical fraction
以Vive为例子。他的投影矩阵是:
那么接下来我们就是根据各个头显的projection matrix算出我们的纹理要拉伸的比例,也就是材质里面的Horizontal/Vertical fraction
以Vive为例子。他的投影矩阵是:
所以我们要拉伸的数值是0.25/0.756892和 0.25/0.681268
2.左右眼
VR里的后处理都是要对左右眼同时做处理,那么如何区分左右眼呢:UE4可以利用ScreenTextureUV
做区分:
VR里的后处理都是要对左右眼同时做处理,那么如何区分左右眼呢:UE4可以利用ScreenTextureUV
做区分:
把左右眼拉伸好的图像连接到if节点的两个输出即可。
附录:各个头盔的FOV计算
/*UE4 Reported Values from Projection Matrices
DK2
/*UE4 Reported Values from Projection Matrices
DK2
CV1
投影矩阵公式
其中
fov计算
结果:
hmd
dk2
vive
cv1