試著做了 Raymarching 的著色器
之前就蠻想試試看了
只是一直沒有理解教學裡面的算法是什麼原理
今天終於做出一點東西了
Raymarching 是一種渲染方式
跟一般 3D 把物體拆成很多三角形依序畫到畫面上的方式很不一樣
Raymarching 的做法是從螢幕上的每一個像素發射出射線
射線會往他看的方向移動
每次移動的時候檢查跟場景裡所有物體表面的最小距離
然後以這個最小距離的長度再往前移動
如果這個最小距離非常接近零 就代表射線碰到物體表面
每一個物體都是用距離場(SDF)的函數來表現
當你輸入一個 3D 座標後 就會返回座標跟該物體表面的最小距離
例如說球體的話是
return length(pos) - radius
雖然用這種方式比較不容易做出複雜的模型
但好處是比較容易做反射、體積相減和 Metaball 之類的效果
渲染出來的畫面也可以同時跟其他渲染方式結合
講這麼多廢話其實我只是想星爆而已
其實我還沒有很懂其他的 SDF 函數
但我發現只要讓球體的半徑隨著 Y 軸數值去做變化
就可以做出有寬度變化的柱體
所以就有了艾恩葛朗特