在虛幻UE4中不同VR頭盔的FOV和分屏處理

2021-07-27 00:04:52 字數 2278 閱讀 6089

對於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為例子。他的投影矩陣是:

[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

做區分:

把左右眼拉伸好的影象連線到if節點的兩個輸出即可。

附錄:各個頭盔的fov計算

/*ue4 reported values from projection matrices

dk2

[0.92991    0         0   0]

[0          0.75097   0   0]

[???        ???       0   1]

[0          0         10  0]

複製**

cv1[1.190342   0         0   0]

[0          0.999788  0   0]

[-0.148592  0.110690  0   1]

[0          0         10  0]

複製**

vive

[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

複製**

dk20.92991        94.159880

0.75097        106.189099

複製**

vive

0.756892    105.756425

0.681268    111.469296

複製**

cv11.190342    80.066880

0.9997888    90.012102

複製**

本文**:

52vr

.com

虛幻4

關於UE4中VR專案優化小記

1 資訊日誌 提供場景內的各種資訊,window developer tools messagelog 2 輸出日誌 內容更詳細,window developer tools outputlog 3 視口選項 顯示fps 每秒鐘的幀數 顯示資料stat unit 判斷遊戲中影響效能的主要原因存在於g...

UE4 虛幻4的網路適合開發什麼遊戲

使用虛幻4開發網路遊戲的兩種方式 一 虛幻4只做客戶端,伺服器端獨立開發,適用於任何網路遊戲 二 使用虛幻4同時開發客戶端和伺服器 使用虛幻4內建的伺服器 適用於一部分網路遊戲。如果使用虛幻4作為遊戲客戶端,最好也是要虛幻4的內建伺服器 這樣可以解決很多問題,同時節省很多巨大的工作量 自己開發伺服器...

UE4在VR模式下去掉兩側黑邊

正常用vr模式開啟以後,就會成這樣 紅框部分就是我所說的黑邊 通過改變 可以實現如下效果 在steamvrrender.cpp裡的rendertexture renderthread函式修改 修改為 void fsteamvrhmd rendertexture renderthread frhico...