▲米卡莎的腿
由於交錯位置不夠精確,反射的腿部斷成好幾截。
圖中也可看出,沒出現在畫面中的部分也不會出現在反射中。
圖中也可看出,沒出現在畫面中的部分也不會出現在反射中。
目前要得到高品質的反射處理還是得靠ray tracing,但硬體仍舊沒有進步到能即時完成計算,於是程式設計師不得不使用偷吃步的方法。例如已存在許久的平面反射法:繪製光滑地板或牆壁的時候,先使用鏡像位置的攝影機將整個場景重新繪製一遍,然後將得出的影像投影回地板或牆上。缺點是重繪場景的成本太過昂貴,無法讓每個表面都擁有反射。另一種至今仍常用的方法是cubemap,可是一個cubemap只能用於一個特定地點。
到了2010年,Beyond 3D論壇中首次有人提出在screen space計算反射,隨後這技術出現在Crysis 2 DX11 patch內而廣為人知。方法是沿著反射向量以固定距離前進,藉由檢查深度值來尋找射線與場景產生交錯的位置,轉換回螢幕座標後就可檢索出反射光的顏色。此技術的優點是任意表面都可擁有反射效果,但缺點是假如反射向量是朝著攝影機而來,射線與場景的交錯位置將位於場景的背面,背面由於不會被繪出,因而無法取得反射光的顏色。另外假使射線超出螢幕範圍,也會無法計算與場景的交錯位置。對即將進入無效狀況的反射光做fade out,可以稍微改善畫面上的瑕疵。
此技術的效能取決於射線前進的次數,物體的距離越遠,就需要更多次的計算。如果為了減少次數而加大每次前進的距離,射線就有可能會跳過某些場景細節。到這裡事情還沒結束,因為上述計算得到的交錯位置不夠精確,若要避免產生階梯狀的瑕疵,
要得到漂亮的反射還有一段路要走,未完待續…