Ray Tracing,Ray Casting,Path Tracing,Ray Marching 的区别?
鏈接:https://www.zhihu.com/question/29863225/answer/70728387
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
既然都是Ray開頭的,這些概念中最大的區別就是射線,具體地可以說是射線的起止點不同。
1)Ray tracing是我們常說的光線追蹤,利用光路可逆原理,從攝像機位置出發,向成像屏幕上的像素點引若干條射線,初始射線始于攝像機,終止于光線第一次與表面的交點,同樣,前面的答案里有人也提了,Ray tracing是一個遞歸的過程,射線開始于攝像機,遇到表面反彈(bounce),再引出若干條次級光線,至于path tracing,可以認為是一種具體的光線追蹤做法:在光線遇到表面需要反彈時,以表面法線為中心做一個半球,向半球上若干方向引若干條射線,再遞歸計算每條光線對該表面點的光照貢獻,具體引多少射線,每條射線的貢獻如何計算,則又根據path tracing的方法不同而有所區別。
2)Ray casting是體渲染(Volumetric rendering)的一種比較簡單的實現方法,體渲染是說我給你一個體數據(3D紋理),你如何把它在2D平面上的投影繪制出來的問題,常用的方法有錯切形變法,光線投射法,紋理映射法等。Ray casting的光線是從攝像機出發,向3D體紋理引射線,但是這只確定的光線的方向,實際上光線的起始位置是光線與體紋理的正面交點,終止位置是體紋理的背面交點。另外可能有人把Volumetric rendering和Voxelization混為一談,其實兩者是不同的東西,雖然他們都和體數據相關,但前者一般不關心體數據的來源(一般是掃描之類的方法獲取的真實數據),只是考慮在有了體數據的情況下以何種模型來渲染體數據(譬如吸收模型,單散射模型,多散射模型),同時一般來說體渲染使用的體素的大小是均勻的;而后者(Voxelization)更關心的是如何將數據表示為體素,進而使用體素的表達形式實現其他的功能(碰撞檢測,布爾操作,occlusion culling,GI等),生成的體素未必是均勻的。
3)Ray marching是所謂的光線行進,它只是一種通用的模擬方法,所以它的光線的起點和終點不能一概而論,但是它的射線和Ray casting的射線有一個共同點,就是它沿著起點開始,每隔一定間隔就停下來做一次計算,再繼續前行。具體算什么要看實現的是什么功能。至于這個間隔,有時可以是固定的,有時則是不固定的。舉幾個比較常用的例子:(1)視差貼圖(POM),它在使用Ray marching的時候,起始點是視線和模型表面的交點(但有了POM的微表面后它其實不是真正看到的點),終點是在引入了表面的視差后真正的視線交點。它有固定步長的實現和二分查找的變步長實現。(2)屏幕空間反射(SSR),它的光線起始點是shading pass當前計算的表面像素的位置,方向是視線沿著表面法線的反射方向,終點是反射光線與屏幕空間中像素的交點。(3)體積光渲染(或者類似的participating media rendering):對于單散射模型來說,它的光線起始點是攝像機,終點是與視線相交的表面點,一般來說是固定步長的。
Ray casting 是其他三個的第一步,根據 相機/眼睛 和屏幕的位置關系計算出ray的起始點和方向。所以,舉例渲染一張800*600的圖圖,第一步經過ray casting,就產生了 800*600個蓄勢待發,等著戳向場景的ray~~
Ray Tracing: 灰常Naive的render方法,剛剛那群蓄勢待發的ray們狂奔向三維場景里的物體,戳到物體的ray就直接在其相應pixel上涂上顏色(當然要根據material和lighting算算先啦)
Path Tracing: 比ray tracing 稍微復雜點兒,更加physically based。狂奔的ray們戳到物體后不像ray tracing 一樣立即結束工作,而是根據物體材質彈彈彈~bounce bounce bounce 。ray們一路彈彈彈,累積戳到的所有物體的顏色,直到戳到light,或者ray精疲力盡走不動道兒了(reach depth)。
Ray Marching: 多用在volumetric rendering (就是云彩之類的東西)。Ray Marching 里的ray 不像前兩種那樣沖動,而是step by step的往前走,邊走邊累積顏色~。推薦個很好玩噠ray marching 網站 Shadertoy BETA
總結
以上是生活随笔為你收集整理的Ray Tracing,Ray Casting,Path Tracing,Ray Marching 的区别?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RayTracking 光线跟踪算法
- 下一篇: CUDA学习2