這是最近做的一個實驗
因為某些原因,就跳進射線邁進(ray marching)的大坑了
Ray marching是在demoscene領域很紅的繪圖手法
在 http://shadertoy.com 上也很熱門
搭配有號距離場(signed distance field, SDF)和柔化混和
可以繪製出類似用黏土建構的場景效果
使用相關技術的遊戲有Claybook和Dreams
這是我的第一個實驗
https://twitter.com/TheAllenChou/status/1251469038644912128
後來成功將此效果套用到Unity的scene view中
這樣就可以方便用自由視角觀測
https://twitter.com/TheAllenChou/status/1251755478670962695
然後我改用compute shader後製
做到可以利用編輯器內的game object達到即時互動
https://twitter.com/TheAllenChou/status/1252126496799375361
後來試著做出能視覺化效能瓶頸的熱視圖(heat map)
這是視覺化射線邁進次數的熱視圖
https://twitter.com/TheAllenChou/status/1252495311798321153
接下來的計畫是用空間結構階層(bounding volume hierarchy, BVH)
想辦法優化,剔除射線壓根不會碰到的物件所對應的SDF
首戰告敗,因為陷入race condition的陷阱做出了...蜜蜂群XD
https://twitter.com/TheAllenChou/status/1252828873533743104
二度嘗試後成功了
BVH優化在壓力測試中可以有效剔除96%的SDF運算
我並且追加了另外一個熱視圖,以觀測射線實際運算的SDF數量
這是最終的demo + 解釋
https://www.youtube.com/watch?v=2T2FqvtXqLw
原始檔:
https://github.com/TheAllenChou/unity-ray-marching
參考資料:
http://www.michaelwalczyk.com/blog/2017/5/25/ray-marching
http://www.iquilezles.org/www/articles/smin/smin.htm
http://www.iquilezles.org/www/articles/normalsSDF/normalsSDF.htm
https://www.shadertoy.com/
https://box2d.org/files/ErinCatto_DynamicBVH_GDC2019.pdf
https://github.com/erincatto/box2d
以上 :)