追光者 NVIDIA Geforce RTX 2080 Ti圖靈架構淺析
作者:陳寅初
曾幾何時,人們為了在屏幕上能實時顯示幾個有深度感的方塊而歡呼雀躍,1993 年經典遊戲 DOOM 問世的時候,遊戲業界媒體發表了大量圍繞該遊戲的報道,除了通關攻略外,對遊戲開發人員、遊戲技術都進行了全方位的報道,原因無他——這是當時第一個能在個人電腦上以實時三維方式渲染的第一人稱網路遊戲,在遊戲圖形史上的地位舉足輕重。
自此以後,圍繞電腦實時三維渲染圖形的技術和應用開始鋪天蓋地的湧現,CPU 方面首先發力,擁有更強浮點性能以及 SIMD 的 Pentium II 問世,不過 CPU 畢竟主要負責邏輯代碼的處理,遊戲只是眾多任務之一。
因此為了實現更快的實時渲染性能,人們又推出了專門針對遊戲圖形加速晶元,3Dfx、NVIDIA、ATi、S3 等等眾多(還有許多現在已經消失的)顯卡廠商都在此時興風作浪。最終,經過激烈的市場競爭,到了 2002 年的時候,隨著 NVIDIA 收購 3dfx,顯卡競爭廠商也就剩下兩家:NVIDIA 以及 2005 年被 AMD 收購的 ATi。
受制於晶元面積的緣故,人們往圖形晶元堆放的功能並非一步到位,對速度追求的優先度總是優先於功能。
例如早期的遊戲圖形晶元也就是實現了三角形設置、貼圖、顏色混合這三個功能,在這之後才是逐漸加上頂點變換(例如 NVIDIA Celsius攝氏,Celsius是架構代號,代表晶元是全球第一枚 GPU NV10,例如採用 NV10 的 GeForce 256)、多採樣抗鋸齒(例如 NVIDIA Kelvin開爾文)、可編程著色器(例如 NVIDIA Kelvin開爾文)、高級語言通用計算(NVIDIA Tesla特斯拉)、統一架構(NVIDIA Tesla特斯拉)、曲面計算(NVIDIA Fermi費米)等特性。
不過在 GPU 功能、性能不斷提升的日子裡,業界一直伴隨著一種聲音:什麼時候可以實現光線追蹤渲染呢?
現在的遊戲絕大多數都是採用名為光柵渲染的技術,而光線追蹤則和光柵渲染有不少區別,在過去它都是離線渲染才會使用的渲染技術,不過到了今年,NVIDIA 公司卻公布了首款具備專門光線追蹤硬體加速的微架構——圖靈Turing,這標誌著沿用了 20 多年的遊戲渲染技術終於迎來了首次真正意義上的革命,人們得以嘗試基於物理的實時渲染加速。
看到這裡,相信有些人已經有點看不下去了,因為上面引出一堆諸如光柵化渲染、光線追蹤的學術名詞。好在這些東西解釋起來其實並不是很複雜,接下來我會嘗試用最短的篇幅來介紹,務求大家看完後能知道基於圖靈架構的顯卡是否就是自己要買的那塊顯卡。
光的起源:光柵化與光線追蹤
PC 上比較著名的早期三維遊戲《德軍總部 3D(Wolfenstein 3D)》使用的是名為光線投射(Ray Casting)技術實現的,它的原理是在某種幾何尺度限制的前提下進行光線投射和追蹤。例如,顯示器的解析度是 320×200 個像素的話,光線投射器只追蹤 320 條光線(因為水平像素解析度只有 320 個)。
在大多數情況下,這種渲染方式的方程並不準確(例如不進行場景光線遞歸),渲染品質不是很真實(稍微湊近看到的都是斑塊),但是速度比較快。除了德軍總部 3D 外,Raven 公司的 Shadow Caster、Bethesda 公司的 Arena、前面提到的 id Software 的 Doom 以及盧卡斯公司的 Dark Forces 都採用了 Ray Casting 技術。
光柵化渲染
現在的遊戲都採用了名為光柵化(rasterization)的方式進行渲染,在光柵化渲染流水線上,同一時間內都是在畫一個三角形。
這個三角形需要先經過計算確定其大小和位置,然後到了光柵器上,由光柵器計算出有哪些像素被其覆蓋以及在被覆蓋像素上的投影面積。
光柵化渲染的好處是快速,例如渲染大場景的時候,因為理論上每次渲染的時候內存里只要存放一個三角形的信息即可,三角形的屬性維護可以在寄存器或者高速緩存里進行,這樣能減少內存傳輸;只需要渲染被當前三角形覆蓋的像素即可,如果配合一些隱面消除技術,還可以減少需要渲染的三角形數量。
問題是,光柵化每次都只渲染一個三角形,很多效果其實至少需要兩個三角形才能實現,例如把三角形的陰影投射到另一個三角形上、三角形和另一個三角形的倒影、場景中所有三角形的光照反射等等。
光柵化渲染要實現複雜特效來模擬真實世界需要用上許多技巧,而這些技巧有時候會彼此之間存在衝突,需要另外的技巧來避免,這使得光柵化渲染在實現高級特效的時候會相當複雜,使得渲染器的編寫、維護成本日益高昂。
光線追蹤渲染
這張卡片上的代碼可以以光線追蹤的渲染方式畫出下面的效果:
這裡插播一個視頻,也許能讓你對實時光線追蹤能達到的效果有更直觀的了解。
光線追蹤的方式可以分為正向光線追蹤(從場景里的光源發射光線)和逆向光線追蹤(從觀察者或者說眼部、攝像機燈發射光線)。
現在人們一般所指的光線追蹤演算法,都是採用逆向光線追蹤方式,讓光線從「眼部(或者說』相機』)」發射,穿過屏幕上像素柵格進入場景中,直至找到最近的物體,確定與物體的交匯點,這個動作被稱作求交。
「眼部」發出的第一條射線被稱作主射線(primary ray)
光線追蹤的第一次求交和德軍總部 3D 採用的光線投射渲染方式是一樣的,但是光線投射不會做接下來的反射、折射等光線遞歸處理。
此時,這條光線可能會被物體吸收、折射、反射,也可能會落入到陰影(交匯點和光源之間存在遮擋物)中,根據物料和光照的等條件,交匯點會被著色器畫上相應的顏色。對於存在折射、反射、陰影的情況,需要再從交匯點發射光線,直到遇到吸收表面、或者抵達場景極深處,完成遞歸。
光線追蹤求交後,出現需要遍歷場景其餘三角形而發射的射線被稱作次生射線(Secondary Ray),包括反射射線、折射射線、陰影射線。
此時,該像素的顏色最終確定下來了。
比較有趣的是,雖然我們現在覺得正向光線追蹤是最自然的光照原理,但是從誕生時間上來說,逆向光線追蹤理論誕生得最早,它可以追溯到公元前五世紀古希臘哲學家恩培多克勒提出的古怪理論。
和當時的許多希臘人一樣,恩培多克勒認為萬物都是由火、空氣、泥土、水構成的,但是他相信希臘愛神阿芙洛狄蒂將人類的眼球獨立於四種元素之外,並在其中點燃了火光,這些火光從眼部射出,使得人們有了視覺。
而正向光線追蹤是到了公元 11 世紀左右才由阿拉伯科學家海什木提出,他認為我們之所以能看到物體,是因為來自太陽的光線:以直線方式行進的微小顆粒流從物體反射到我們眼中。
由於場景中的光源發出的絕大部分光線不會在觀察者看到的光線中占很大比例,因此逆向光線追蹤在效率上要比正向光線追蹤高很多倍。
光線追蹤的目的是要構建出整個場景的可視信息以及光照條件,藉此計算出光線和場景中物體相交時光線的反射、折射、吸收、遮擋信息,但是一般來說,它並不怎麼考慮漫反射的情況,而且物體表面的屬性相對單一。
對於漫反射,人們也會使用輻射度演算法實現,當然,這和光線追蹤並不矛盾,輻射度可以在光柵化和光線追蹤渲染流水線中應用,例如 EA 的遊戲戰地三就用了輻射度來模擬全局光照。
相對於光柵化渲染速度快但是複雜的特點而言,光線追蹤則剛好相反,它的渲染演算法比較簡單,但是要實現逼真的效果,是需要大量的計算才能實現,與光線追蹤的技巧主要是如何實現節省計算資源和減少內存存取上。
上面兩張圖分別是在 DirectX 12 中的光柵化渲染流水線(簡化)和光線追蹤流水線,你可以看出兩者在輸入、前端處理、中段渲染上是很不一樣的。
我們在這裡說了一大堆看上去比較理論的東西,目的是為了下面的圖靈架構介紹可以更簡單明了,因為像光柵化這樣的渲染框架其實對於許多人來說也是不清楚的,更不要說又冒出了個光線追蹤出來,而光線追蹤中能加速的部分正是圖靈架構的重大革命。
※發布會還沒開,OPPO就著急把R17的售價公布了
※倍耐力有個新夢想 給客廳放個死貴的輪胎音箱
TAG:愛活網 |