2020年2月4日 星期二

今晚來點 Raymarching (1)

  • 前言

幾個月前,聽到公司同事談論到在2020年 mobile 的效能將強大到能夠支援 Raymarching,

這句話讓一個走向墮落的工程師,明明一把年紀了,卻又不自覺地燃燒起來,

決定要先一步走在時代的前端,即使那時候已經在賣雞排了。 HA!HA!!HA!!!

(´;ω;`)


回歸主題,這一次的內容是討論如何在 Unity 上,使用 Raymarching 的技術來做出特殊效果,

環境限制在PC平台上,不做效能優化,只作為學習的一個環節。

本篇先簡單介紹什麼是 Raymarching ,Unity 上的實作和應用會在其他篇作闡述。

  • Raymarching ?

什麼是 Raymarching ? 在講 Raymarching 之前必須要先談到  Ray tracing,

Ray tracing 顧名思義就是射線追蹤,在講明白一點,就是跟著射線走,

把射線走過的軌跡記錄下來,作為繪圖的依據。

(在這裡,射線可以有很多種解釋,太陽的光線和眼睛的視線都算是射線)

Ray tracing 就是根據這個原則所發展的技術總稱。

Raymarching 則是 Ray tracing 原則下的一個分支技術。


Raymarching 可以想像成從攝影機,在其可視範圍內,發射出無數條像雷射般的射線。

當這條射線撞到障礙物時,就把障礙物的資料回傳到螢幕對應的位置上。

感覺上可以用下圖解釋


紅色的射線有撞到藍色的物體,會停止前進,並把藍色畫到螢幕上。

反之,若沒有撞到任何物體,則不會在螢幕上出現任何顏色。


大原則就講到這裡,將下來開始去思考如何實現。

在實現 Raymarching 上,首先要考慮如何判斷射線衝突,

在本文章是使用 Sphere Tracing 的方式去實現 Raymarching (註1)。


  •  Sphere Tracing

Sphere Tracing 的示意圖,可以用下圖來解釋


首先,要注意的是紅色的箭頭,紅色箭頭代表著離起點最近障礙物的最短距離。

射線的起點在攝影機,離起點最近的障礙物是綠色球

因此,先求出起點和綠色球的最短距離(也就是紅色箭頭),

之後讓起點朝射線方向前進,前進的距離就是起點和綠色球的最短距離。
(射線方向並不會受到任何影響而轉向)


之後,重複相同步驟,當移動距離小於一個定值,就判定發生衝突,
並回傳衝突障礙物資料作為繪圖來源。

如上圖,起點位置最後會非常接近藍色球,所以結果會在螢幕對應位置上畫出藍色

因為射線移動軌跡上是呈現很多個半徑不同同心圓,所以又稱 Sphere Tracing。


到了這裡,可以整理出要實現 Sphere Tracing 必須要有:
  1. 所有的射線資料
  2. 所有障礙物的資料(包含位置、形狀、顏色等...)
詳細的作法將於下一篇說明。


  • 註解
  1. Sphere Tracing 是實現 Raymarching 的一個手段, 而 Raymarching 是 Ray tracing 原則下的一個技術。看起來很複雜,其實只要想成 Ray tracing(=概念),Raymarching(=技術),Sphere Tracing(=方法)

沒有留言:

張貼留言