Quantcast
Channel: 電腦王
Viewing all articles
Browse latest Browse all 6446

Microsoft 發表 DirectX 12 Raytracing API 功能集 DXR,標準化光追蹤步驟

$
0
0
近日於美國加州舊金山舉辦的 Game Developers Conference,Microsoft 宣布於自家的 DirectX 12 當中加入 Raytracing(DXR)API 選用功能集,將光追蹤技術標準化以便在不同廠商的硬體上執行,可望帶來更為逼真的 3D 遊戲畫面體驗。

Microsoft 於近日舉辦的 GDC 2018 會議當中宣布,將替自家多媒體與遊戲 DirectX 12 API 增加 Raytracing(DXR)選用功能集,提供統一的光追蹤技法介面,軟體開發人員只需要按照此 API 標準撰寫程式碼,便可在 AMD、NVIDIA 或是其它的繪圖顯示卡得到想要呈現的畫面,不必針對不同硬體著色器開發。

若要瞭解光追蹤的成像原理,我們先來理解目前絕大部分 3D 遊戲畫面是如何繪製的。由於即時遊戲畫面需要每秒提供 30 張~60 張以上的畫面更新速率,因而需要 1 種相當有效率且易於平行運算的作業方式,Rasterization 光柵化就是目前 3D 遊戲的基礎。

光柵化簡而言之就是把 3D 虛擬空間裡的所有物件,剃除視角以外的物件,也把被其它物件遮擋,物件背面部分全部刪除減少實際運算量(Z-buffer Culling),再壓縮至 1 張平面,而這平面就是你我所能看見的螢幕,接著再依據每個像素進行相關的貼圖、上色、打光作業。雖然這種方式能夠大量減少運算工作,同時產生不錯的畫面品質,卻也因為少了一些物件以及光線之間的交互作用,看起來與真實世界總有不小的差距。

之後加入許多增進畫面品質的運算技巧,譬如 Bump Mapping 凹圖貼圖、Normal Mapping 法線貼圖、Parallax Mapping 視差貼圖、Global Illumination 全域照明、Ambient Occlusion 環境遮蔽等,都是為了加強畫面的品質與真實性。


▲光柵化逐步剃除物件的步驟,由上而下分別為無剃除、剔除視錐以外物件、刪去視角以外部分、刪去背部看不見部分、刪去被其它物件遮蔽部分。


▲三角形光柵化的效果。

Raytracing 光追蹤則是模擬真實世界光線運作方式,包含光在物體表面的折射、散射、繞射,或是穿過物體的透射,同時考慮到光在各個物體之間的交互作用,也就是計算場景的光場,最終以平面方式呈現在螢幕。為了減少運算量,實際上運算步驟並不從光源開始,而是由攝影機視角反向射出數條虛擬光線,追蹤這些虛擬光線的路徑。


▲光追蹤可以計算物件與物件之間的光線交互作用。

因為內部原理與實際環境相當類似,光追蹤可以產生相當逼真的畫面效果,無需其它特殊的運算技巧。但是相對於光柵化還是需要相當大的運算資源,因此 3D 遊戲絕大部分依然選用光柵作為產生畫面的手段,光追蹤則是應用在動畫、電影特效等沒有時間限制的領域。部分遊戲貼圖材質也會先行以光追蹤技法處理,預先改變顏色後再貼上物件,產生較為逼真的結果。

DirectX 12 在此時加入 Raytracing(DXR)選用功能集,主要還是著眼於未來發展,DXR 採用 DirectCompute 實作,因此目前市面上支援 DirectX 12 的繪圖顯示卡都能夠支援。目前 NVIDIA 已經宣布未來 Volta 架構的顯示卡將以軟體(RTX)與硬體加速方式處理 DXR,先前的顯示卡世代則是採用純軟體方式;而 AMD 方面則是宣稱目前正與 Microsoft 合作,未來將推出支援的驅動程式版本,不確定是否包含硬體加速部分。

即便市場上這 2 家獨大的娛樂用顯示卡廠商推出硬體加速版本,光追蹤在幾年內依然不會替代傳統光柵化的畫面運算方式,由於運算量驚人,未來數年應該是以輔助角色登場,譬如先行以光柵產生基礎畫面,再以小範圍光追蹤結果替畫面加上光影效果。目前已有 Unreal Engine、Unity、Frostibite 等遊戲引擎,以及 EA、Remedy、4A Games 等遊戲廠商將加入這項功能,


▲光追蹤運算量相當龐大,讀者可以自行下載 CINEBENCH R15體驗看看就能理解。

 

資料來源

Announcing Microsoft DirectX Raytracing!

延伸閱讀

加入電腦王Facebook粉絲團

Viewing all articles
Browse latest Browse all 6446

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>