如何實現魚眼效果?

如何渲染出魚眼效果?

真實的世界裡,到底會不會出現這種效果?


用光柵化渲染的話,可以渲染半個 cube map (1 張正面、上下左右各半張),表示半個全景。然後畫個全屏 quad,用魚眼的函數採樣該 cube map。


ray tracing里比較好做,發射射線的時候換個公式

遊戲那種實時渲染會麻煩一點,不過可以暴力做一個差不多的效果(但是沒有太多物理意義了...


這部分可能和攝影關聯度更多,不確定我了解的內容是否完全正確,試答一下。

首先魚眼鏡頭應該是和鏡頭本身的廣角率相關,所謂廣角率意味著站在同樣遠處所能看到的視野範圍的大小,這個角度越大,視野範圍也就越大,相應的就會產生魚眼鏡頭這樣的效果。

在CV領域這類效果被稱作透視畸變,是會影響到圖像中像素的位置等信息(比如原本是一條直線,由於透視畸變可能會變成曲線),進而影響到圖像識別的過程。常見的畸變分為兩種,包括徑向畸變切向畸變,魚眼鏡頭的效果應該是屬於徑向畸變,具體成因及解釋可以閱讀《學習openCV》這本機器視覺領域的經典著作。鏡頭畸變一個典型的案例就是攝像機標定,用過ARToolkit就知道,要讓攝像機能夠識別出場景內的的mark,首先需要拿一個chess board在正常光照情況下用多個視角去標定當前攝像頭,這個標定的過程是為了獲取攝像機的內部參數,其中一個很重要的參數就是鏡頭畸變係數。這部分細節可以參考經典的論文:A Flexible New Technique forCamera Calibration,我們常常也把這套標定演算法叫張正友演算法。相應的,去除鏡頭畸變影響的方法就叫做畸變校正。在openCV裡面有專門的方法支持。

說過了畸變校正,另外一個重要的應用應該是最近很火熱的VR,VR成像設備一般為了較大的視野範圍,都需要廣角率比較大的透鏡,相應的也就會導致徑向畸變的發生,因此在渲染VR內容的時候,也就需要將渲染好的圖像做一個畸變校正,再把矯正後的圖片輸出到VR顯示設備。這樣就導致了其實很多繪製區域是多餘的或者像素的密度先天的不均勻(經過畸變校正圖像邊緣的像素被壓在了一起,導致了無意義的多餘繪製),這部分最新的GTX1080有硬體級的解決方案,可看這篇:

GTX1080 is Here! - Behind the Pixels - 知乎專欄

要實現鏡頭畸變和矯正的效果,可以參考這裡的公式:

Distortion (optics)


張學友演算法!!


推薦閱讀:

在 OpenGL 中應用查找表(LUT)技術時,如何避免紋理數據自動歸一化導致的圖像異常?
不同GLSL版本之間的區別?
OpenGL ES2 對象樹繪製與 VBO組織問題?
現代OpenGL是怎麼繪製曲面的?
請問OpenGL的的頂點數據中position必須與color一一對應嗎?

TAG:OpenGL | 計算機圖形學 | 3D引擎 |