Ray Tracer -- 邱嘉興
Two extra shots
Abstract

Implement ray-tracing in Unity3D

Authors
Chia-Hsing Chiu
Abstract

Implement ray-tracing in Unity3D

Technical introduction
  1. Generate the tracing rays from the camera: 使用Unity中相機Script的ScreenPointToRay方法
  2. Use the intersection mechanism in Engine for ray-object intersection computation: 利用Physics.RayCast方法來進行交點偵測
  3. Implement the Whitted illumination model: 主要參考https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-overview/light-transport-ray-tracing-whitted 這個網站的實作方式。當射線和物體有交點時會根據物體的性質進行反射、混合反射及折射、或是直接計算該點的顏色。在計算一個點的顏色時是根據Phong shading,並且會從該點往光源打一條shadow ray判斷該點是否有被遮擋住,如果被遮擋住則不計算該光源的貢獻。
  4. Phong interpolation of normals on triangle meshes: 透過RayCastHit我們可以直接拿到交點在三角形mesh上的barycentric coordinate,然後將三個頂點的normal進行內插即可。
  5. Anti-aliasing:
    1. Standard supersampling: 對每一個pixel都打超過多條的射線(4, 9, 16, uniform distributed)之後取平均。
    2. Adaptive supersampling: 只針對變化較大的區域進行複數取樣。我會先對每個pixel取樣一次,然後比較各個pixel和周遭的pixel有沒有差很多,如果有差很多則將該pixel切成四個小區塊,然後比較每個區塊的對角兩個取樣點有沒有差很多,如果有差很多則將該區塊再切成四個小區塊,一直持續下去直到碰到停止條件(深度)
  6. Beer’s law: 光在折射時會根據距離衰減(被物體吸收),公式為,和分別代表光被吸收前和吸收後的紅色channel,代表折射光的行進距離,代表紅色channel的吸收率。綠色及藍色的channel亦同。另外影子的部分我也有使用beer’s law,但是shadow ray的部分我沒有計算折射。
  7. Fresnel reflection model: 利用Schlick’s approximation來計算,公式為,其中
  8. Area light, soft shadow: 在area light上面取複數sample點,對所有sample點都打出shadow ray判斷某個點在影子中的比例。

參考資料:

  1. https://www.scratchapixel.com/lessons/3d-basic-rendering/ray-tracing-overview/light-transport-ray-tracing-whitted
  2. https://www.cs.cornell.edu/courses/cs4620/2012fa/lectures/36raytracing.pdf