主頁 >  其他 > 實時光線追蹤(3)Ray Casting

實時光線追蹤(3)Ray Casting

2023-06-20 08:54:56 其他

目錄
  • 硬體光追(Hardware Ray Tracing)
    • 加速結構(Acceleration Structure,AS)
      • AS 策略
    • Ray Tracing Pipeline
      • Ray Generation Shader
      • Intersection Shader
      • Hit Shader
    • Ray Query
  • 軟體光追(Software Ray Tracing)
    • Screen Space Ray Tracing
    • Height Field Ray Tracing
    • Voxel Tracing
      • Voxelization
      • Voxel Ray Marching
      • Voxel Cone Tracing
    • SDF Tracing / Sphere Tracing
      • Global SDF + Mesh SDF
      • AABB Tree + Local Distance Field
      • Enhanced Sphere Tracing
      • Accelerating Sphere Tracing
      • Segment Tracing
      • SDF Cone Tracing
  • 一些實踐
    • Primary Ray
    • Shadow Ray & Visibility Ray
      • 半透明陰影 - ray query
    • Material Ray
    • Low-Accuracy Ray + Short Ray
  • 參考

實時光追(Real-time Ray Tracing)往往是綜合了 sampling、ray casting、denoising 等各方面的方案,本文主要記錄的是 ray casting 這部分,但是術語可能更多仍然稱為 ray tracing,

硬體光追(Hardware Ray Tracing)

ray tracing 最經典的實作莫過于 ray traversal:投射一條 ray 然后遍歷所有 triangles 去做 ray-triangle 相交測驗,并得到對應的 hit point,但是場景中的 triangles 數量往往數量龐大,ray traversal 也變得非常耗時,而后為了加速相交測驗,便引入了加速結構(BVH,八叉樹,k-d樹等),來剪枝掉一些不可能發生相交的 triangles;但即便如此,軟體實作 ray traversal 仍然是件耗時的事,

再后來,Nvidia 推出了 RTX 系列顯卡,開始提供硬體單元來大大加速 ray traversal 這一程序,使得 real-time ray tracing 成為了可能,從此之后,GPU 廠商都逐漸開始普及硬體光追的支持,

加速結構(Acceleration Structure,AS)

硬體光追提供了兩大層級的 AS,我們可以對這兩大層級(BLAS 和 TLAS)進行配置,但不用關心 AS 具體采用哪種空間加速結構或者具體實作,

  • BLAS(Bottom Level Acceleration Structure):底層加速結構,一個 BLAS 對應一個 instance,其葉結點為一個 primitive(一般就是一個 triangle,如果使用自定義圖元則就是一個把該圖元包起來的 AABB box),
  • TLAS(Top Level Acceleration Structure):頂層加速結構,一個 TLAS 對應一個場景,其葉結點為一個 instance,

注:我們在 GPU 里通過 ray traversal 得到 hit point 后,要獲取 hit point 的材質屬性是非常困難的,因為材質函式和引數等都是在 CPU 端的,而粗暴的直接根據 geometry id 和 material id 去 CPU 拉取對應的 shader 和引數無疑是不可行的(通信時間過長),

為了解決這個問題,才有了 shader table 的機制:GPU 里的 shader table 預先存盤著一堆 shader records,每個 record 包含一個或多個 shaders(其實就是 hit group)以及引數;再得到 hit point 后,根據 geometry id 和 material id 去索引到相對應的 shader record,并直接執行對應的 shader,無需通知 CPU,

AS 策略

  • 盡可能將相同性質的多個 mesh 合并到一個 BLAS 中,而不是一個 mesh instance 一個 BLAS,這樣可以減少 BLAS 的數量,從而降低 TLAS 包含的 instances 數量,例如:由多個 mesh 組合的物件(往往需要同時rebuild或者update),可以將這多個 mesh 塞進一個 BLAS 里;所有靜態 mesh 都塞進一個 BLAS 里.....
  • TLAS 的質量遠比 BLAS 要重要:因為所有 ray traversal 都會經過 TLAS 先,因此對于 TLAS,我們更傾向于 rebuild 而不是 update;對于 BLAS,我們更傾向于 update 和壓縮 BLAS,
  • 盡可能減少運行時的 build/update AS 次數:物體有發生變化時,才去觸發 build AS/update AS;對 skinned meshes,可以考慮預先構建多個高質量的 AS,在不同的關鍵姿勢采用不同的 AS,而不是采用一個每幀更新的 AS,
PREFER_ FAST_ TRACE PREFER_ FAST_ BUILD ALLOW_ UPDATE Properties Example
1 no yes no 盡可能快速的 build AS,trace 性能會低于 #3 和 #4, 完全動態的幾何物體,如粒子、破壞物、移動劇烈的物體(爆炸)等,這種往往都需要每幀重建 AS,
2 no yes yes build AS 比 #1 稍微慢一些,但允許非常快速的 update, LOD level 低且不那么容易被 ray 命中的動態物體,
3 yes no no trace 性能最好,但 build AS 會比 #1 和 #2 都慢, 靜態物體,
4 yes no yes trace 性能很好,只比 #3 慢一點點,AS 的 update 也只比 #2 慢一些, 重要的角色模型(如玩家主角);LOD level 高且比較容易被相當數量的 rays 命中的動態物體,

Ray Tracing Pipeline

ray tracing pipeline 是與 graphics pipeline,compute pipeline 并列的一種新流水線,主要提供有 ray generation shader,intersection shader,和三種 hit shader 可編程,

Ray Generation Shader

在該 shader 里可以呼叫 TraceRay() 介面來使用 ray tracing pipeline 硬體光追:對 AS 進行 ray-traversal,并根據 intersection 的情況來自動呼叫對應的 hit shader 來完成 hit point 的著色,

TraceRay() 一般不可以在別的 shader 中呼叫,只能在 ray tracing pipeline 的相關 shader(RGS,MS,CHS之類的)中被呼叫,但一般推薦只在 RGS 中呼叫,不推薦遞回呼叫(如 RGS 呼叫 TraceRay() 觸發 CHS,CHS 再呼叫 TraceRay()),因為遞回呼叫往往不如改造成多輪 pass 迭代,

72ce5c5ebdbc4499

Intersection Shader

如果我們需要的不是默認的 ray-triangle intersection,而是 ray 與自定義的圖元(例如可以是 sphere)做 intersection,那么就需要撰寫 intersection shader,不過注意的是,使用 ray-triangle intersection 是最高效的,因為它將使用硬體內置的 intersection 函式,因此除了特別需求之外,我們最好盡量使用 ray-triangle intersection,

Hit Shader

  • any hit shader(AHS):當 hit point 命中的是半透明 triangle 時,來決定是否 ignore 掉本次 hit point,通常用于累積 hit point 的 alpha 值,如果累積 alpha 值較低則選擇 ignore ,否則終止 tracing 提交本次 hit point,
  • closest hit shader(CHS):負責對生成出來的最終 hit point 計算著色結果,通常用于計算 hit point 的 radiance 或 material 等,
  • miss shader(MS):如果沒有生成最終的 hit point,則會運行 MS,通常用于計算天空盒環境光照,或者 visibility ray 中的 shadow factor 等,

Ray Query

ray query 則相當于一個各個 pipeline 都能呼叫的查詢介面(在 CS,PS 乃至于各種 hit shader 等都能呼叫),而不是像 ray tracing pipeline 那樣獨立的一套管線,

通過呼叫 TraceRayInline() 介面來使用 ray query 硬體光追:同樣對 AS 進行 ray traversal,但與 ray tracing pipeline 不同的是,ray query 只會提交 intersection 的資訊(position,primitive id,instance id 等),并不會呼叫任何其它 shader,

traceRayInlineControlFlow

ray query 明顯就是 ray tracing pipeline 的閹割版,或者也可以說是 ray tracing pipeline 的子部件,基本只負責了 ray-traversal 的操作,而 ray tracing pipeline 不僅做了 ray-traversal 的操作,還能自動呼叫合適的 shader 對 hit point 進行著色(一般是用于計算材質),

軟體光追(Software Ray Tracing)

Screen Space Ray Tracing

SSRT 可能是大家都比較熟悉的軟體光追方式,它主要就是將螢屏所看到的表面幾何資訊當成一個場景,利用螢屏的 depth texture 來做 ray marching:每次 marching 一步后就可以檢測當前點的 z 值與在 depth texture 中對應的 depth 哪個更小,如果 depth 更小則說明 marching 碰到了螢屏中的 pixel,就可以訪問對應的螢屏資訊作為 hit point 的屬性,

而在實踐中,還可以借助 hi-z(depth texture 的 mipmap)來優化 marching 性能,因為 mip 層級高的 depth texture 相當于為更高層級的 bounding volume 表示,這樣就可以實作大步的 marching,

顯而易見的問題是:如果 marching 最終走出了螢屏外,那么 SSRT 將無能為力去處理(因為只記錄了螢屏上的資訊),并且 SSRT 的命中判斷是保守的:即 SSRT 產生 hit 了則 ground truth ray tracing 必定會產生 hit,但 SSRT miss 了但 ground truth ray tracing 不一定會 miss,

以上內容均在我以前的博文(基于螢屏空間的實時全域光照(Real-time Global Illumination Based On Screen Space) - KillerAery - 博客園 (cnblogs.com) )也有大概介紹,

此外,SSRT 還有一個效果問題:由于相交檢測是簡單的深度比較,這就相當于把攝像機所看到的 depth texture 都當成了完全實心的場景,但是這樣在一些 case 下是不正確的(特別是一個小物體放進攝像機的近處,然后遮擋了大部分場景),

image-20230607205437069

為了改進這一點,在 marching 的時候我們不能簡單地認為 depth texture 的 depth 值小于 z 值就是發生碰撞了,而是同時還要額外檢測 z 和 depth 的相差值 delta,如果大于一定閾值 \(\epsilon\)\(\epsilon\) 可以與 depth 相關),我們是無法斷定是否發生碰撞的(因為不知道這個 pixel 的 “深度柱” 是實心的還是空心的),應當選擇放棄本次 SSRT(視為 SSRT miss),

image-20230612232005610

Height Field Ray Tracing

HFRT(height field ray tracing) 中的 height field 基本是用來描述大地地形的,而地形往往是表面平滑的且實心的,不會像 screen space depth texture 那樣可能有鏤空問題或者表面突變問題,

與 SSRT 相同的是,HFRT 的命中判斷也是保守的:即 HFRT 產生 hit 了則 ground truth ray tracing 必定會產生 hit,但 HFRT miss 了但 ground truth ray tracing 不一定會 miss,

與 SSRT 不同的是:

  • HFRT 的 ray tracing 方式類似 relief map(浮雕貼圖),即一般采用 ray marching + 二分找零點,效率往往更高:

    1. 先用 marching 走固定的大步長,直到遇到更低的地形,
    img
    1. 再用二分法找到交點,一般是小于一定閾值便認為成功命中,結束演算法:
    img

depth texture 無法保證其表示的表面是連續的,從而也不能轉換成找零點問題,

  • height field 基本只有高度資訊,而不像 SSRT 那樣擁有豐富的幾何、材質和顏色資訊(螢屏上的 G-Buffer 等),因此往往僅用于判斷 ray 是否被命中地形物體以及命中點的位置和法線,

Voxel Tracing

Voxelization

voxelization 涉及的內容太多(投影、孔洞問題等),存盤的結構也由很多種(3d texture clipmap,sparse octree 等),由于本文主要涉及 ray tracing 本身,因此不多展開,

其實是懶得寫了XD,以后再補,

img

Voxel Ray Marching

最簡單的方法便讓 marching 步長固定為一個 voxel 的邊長,每 marching 一步就采樣當前位置所在的 voxel 并且累加 alpha 值(不透明物體占據 voxel 時alpha 值為 1,半透明物體占據 voxel 時 alpha 值為0到1間的某個值,不存在物體在 voxel 的位置時則 alpha 值為 0),如果累積的 alpha 值仍然小于一定閾值則繼續 marching:

image-20230614173521038

但是由于 voxel 并不像球那樣中心點到表面都一樣的距離,在斜方向的情況下很容易出現 marching 后仍然停留在同一個 voxel 從而產生重復采樣,

image-20230614173543062

當然,可以通過判斷當前 voxel 是否和上一個 voxel 一樣來決定是否放棄本次采樣并繼續 marching;但更好的 marching 方式應當是使用直線繪制演算法中的 DDA (Digital Differential Analyzer) 演算法來決定步長:將 ray 方向分別映射到 x,y,z 三個軸,取最大值的軸作為主步進軸;每次 marching 必須要滿足在這個主步進軸走 1 個單位距離(即 1 個 voxel 邊長),而另外兩個軸對應的步進距離也能通過比例算出:

// 僅偽代碼,不做邊界檢查
vector3 voxelMarchingStep_DDA(vector3 origin, vector3 end)
{
    vector3 offset = end - origin;
    vector3 dir = normalize(offset);
    float maxScalar = max(max(abs(dir.x), abs(dir.y)), abs(dir.z));
    vector3 step = dir / maxScalar * voxelSize;
    return step;
}

如果有層次結構的 voxel(如含 mipmap 的 3d texture),還可以采用 HDDA(Hierarchical Digital Differential Analyzer)演算法:大概思想就是先在高層級的 voxels 上進行 marching 和采樣,如果發現存在非空 voxel,再降級到底層級的 voxel 進行 marching 和 采樣,

The ray uses the hierarchical VDB tree to achieve empty-space skipping.

Voxel Cone Tracing

將一堆從相同 origin 點出發的 rays 近似成一個 cone 的形式,

類似 voxel ray tracing,voxel cone tracing 累積的 alpha 值小于一定閾值則繼續 marching;不同的是隨著 marching 越來越遠離 origin 點,cone 的直徑也越來越大,而 voxel cone tracing 聰明地對 voxels 的 3d texture 生成預過濾的 mipmap:在 cone 半徑小的時候在 mipmap level 低的 voxel texture 去采樣,在 cone 半徑大時候在 mipmap level 高的 voxel texture 去采樣,

當然,本身 voxels 便是不準確的場景表達,而預過濾的 texture 更進一步會導致高頻資訊的丟失,尤其是 mipmap level 高時,因此 voxel cone tracing 往往僅適用于搜集不那么準確的光照,

image-20230614162805373

以下是一些 voxel cone tracing 的數學關系,

一次 marching 步長 \(step\) 取決于 cone 的直徑 \(d\)

\[step = max(d, voxelSize(level)) \]

當前應該去哪個 mipmap level 采樣 voxel 也需要取決于直徑 \(d\)

\[level = \log_2(\frac{d}{voxelSize(maxLevel)}) \]

而直徑 \(d\) 又取決于 marching 總共走過的距離 \(t\) 和 cone 的張角 \(ψ\)

\[d = 2 * t * tan\frac{ψ}{2} \]

image-20230615162413673

SDF Tracing / Sphere Tracing

所謂的 SDF tracing(或者更正式的叫法為 sphere tracing),其實就是基于 SDF 的 ray marching,其基本原理非常簡潔,也非常聰明:從點 \(x_{0}\) 開始投射一條 ray,然后進行若干次 marching,每次 marching 的起點為上一次 marching 的終點,而 marching 的步長取為起點 \(x_{n}\) 的 SDF 值 \(f(x_n)\)

SDF 代表著離該點最近的幾何表面有多遠,也就是說在 SDF 值范圍內,這個 ray 絕對不會與任何幾何表面相交,

當然 \(f(x_n)\) 在有限步數下無法收斂到剛好為 0,實作中往往用一個小的閾值 $\epsilon $ 來做命中判斷,

image-20230608095341907

在實踐中,最常用 3D texture 來存盤 SDF,也就是說 SDF 是以均勻網格的形式存盤的,每個 cell 存盤一個 SDF 值,容易想到,對整個場景構建高精度的 SDF 將會耗費巨量帶寬和存盤空間,并且在實時渲染領域往往是不可以承擔的,

Global SDF + Mesh SDF

UE5 Lumen 為了解決場景的 SDF 表示問題,為每個 mesh 單獨預生成了一個高精度的 sdf(稱之為 mesh sdf),然后將場景中每個 mesh sdf 實時合成一個低精度的場景 sdf(稱之為 global sdf),

這樣就可以先在 global sdf 進行低精度的 sdf tracing,當 marching 到存在 mesh sdf 的區域時,就可以訪問對應的 mesh sdf 進行高精度的 sdf tracing,

global sdf 可視化:

ScreenShot00010

mesh sdf 可視化:

ScreenShot00011

AABB Tree + Local Distance Field

源于 AMD 的方案(Real-time Sparse Distance Fields for Games | GDC2023),由于篇幅有限,這里只講個大概,實際上還有更多細節和優化策略,感興趣的建議看參考的原文,

為每個 mesh 預生成 mesh sdf 會限制 mesh 的動態性(不允許動態拉伸或者頂點偏移等),而 AMD 給出的方案則是實時根據區域區域的 triangles 去生成 local DF,并將這些 local DF 以 3-level AABB Tree 的形式組織起來(一個 local DF 就是一個葉結點),

其具體流程如下:

  1. 對場景中各種 mesh 進行體素化(voxelization),并將 triangle ID 添加到對應 voxel 的 triangle list,

image-20230615132714370

  1. 對每個非空的 voxel 創建一個對應的 brick,一個 brick 就是一個所謂的 local DF,包含 8x8 個 brixels(brixel 存盤了 DF 值),

  1. 對每個 brick,遍歷對應 voxel 的 triangle list:

    • 計算出 brick 內的 AABB box(紅線框),
    • 先對與 triangles 有相交的 brixels 填充 DF 值(其實就是離最近三角形的距離),

    image-20230615141750625

    • 而沒有相交的 brixels 在隨后使用 Eikonal / Jump flooding 演算法來填充 DF 值,

    image-20230615141806327

    • 對于邊界的 brixels,則參與所有鄰接 bricks 的計算,

      image-20230615142459885

  2. 對計算出來的 AABB boxes 構建出一棵 3-level AABB tree,以供后續 sdf tracing 查詢使用,

image-20230615141525864

Enhanced Sphere Tracing

傳統 sphere tracing 演算法中,在點 \(x_n\) 的 ray marching 步長應取為 SDF 值 \(f(x_{n})\),而這種 marching 其實是保守的,

實際上我們可以采用更激進的步長倍數 \(\alpha\) ,只要 \(x_n\) 的SDF 值加激進 marching 后到達 \(x_{n+1}\) 后的 SDF 值 \(f(x_{n+1})\) 大于本次激進 marching 的步長 \(\alpha f(x_n)\)(即 \(f(x_n) + f(x_{n+1}) > \alpha f(x_{n})\),在幾何上實際就是表現為兩個 sphere 相交),那么就說明 ray 可以安全通過本次激進 marching,否則應當退回到點 \(x_n\) 的位置重新進行保守的 marching,

image-20230608095319941

當然,過于激進的步長倍數會導致過多的回退,而過保守的步長倍數則不會帶來效率的提升,因此應該針對自己的場景調整 \(\alpha\) 引數(引入一些動態調整 \(\alpha\) 的方法,如下面的 accelerating sphere tracing),而原 paper 的作者推薦大約 \(\alpha = 1.2\) 倍步長為性能最佳,

Accelerating Sphere Tracing

更進一步的激進策略是:永遠假設前兩次 marching 所形成的 sphere 都相切于同一平面,那么下一次可以嘗試 marching 這樣一個 sphere:與該平面相切,也剛好與上一次的 marching sphere 相切;如果嘗試失敗則回退至保守 marching,

image-20230608100803076

那這個嘗試 marching 的具體步長應該是多少呢?

由相似三角形易得 \(\frac{d_i}{r_i+r_{i+1}}=\frac{r_{i-1}-r_i}{r_i-r_{i+1}}\)

那么嘗試的步長應為:

\[d_{i+1}=r_{i+1}+r_i=r_i \cdot \frac{2 d_i}{d_i+r_{i-1}-r_i} \]

這種策略比 enhanced sphere tracing 回退次數減少了許多,有更好的加速效果,

Segment Tracing

一堆數學定義(如 Lipschitz),還要假設場景是 \(C^2\) 連續(如果有棱角基本就容易出問題),并且不一定有優化(甚至可能是負優化,因為需額外多次采樣 SDF 來求導),不推薦用,

image-20230614142513042

實在好奇,也可以這樣感性地理解:segment tracing 實際上就是在 ray 的方向分成一段段線段(segment),然后算 segment 的頂點和末尾點的 SDF 一階導,并由此推算出這段 segment 附近的大概安全區域(SDF 一階導相當于往最近表面的反方向,由兩個導數資訊就可以推算出大概的表面資訊),并算出 ray 如果要經過這塊區域,其最遠的安全步長是多少,

image-20230614151523419

SDF Cone Tracing

如果有多條從相同起點出發且出射方向相近的 rays,可以將它們合并成一個 cone,先進行 SDF cone tracing,hit 到物體時再分裂成原始的多條 rays 并分別進行 SDF ray tracing,

image-20230613155723937

SDF cone tracing 的程序基本和 sphere tracing 差不多,只是步長不一樣:第 n 次 marching 不是走到 \(x_{n} + f(x_{n})\) 的位置(對應下圖 \(P'\) 的位置),而是走到 \((x_n+f(x_n))* A\) 的位置(對應下圖 \(P''\) 的位置),

這是因為 ray tracing 本質上是一個點在 marching 而 cone tracing 是一個半徑逐漸變大的球在 marching,\(P''\) 是能保證這個球絕對安全的最遠位置,

image-20230614144339451

可以看到 SDF cone tracing 的 marching 往往是比 SDF ray tracing(sphere tracing)要短的,會導致更多步長,但如果 rays 共享 cone tracing 從而減少的總步長次數大于 cone tracing 帶來的額外步長次數,那么這個策略便能有很大用處(尤其對于一堆集中方向的 glossy/specular rays),

一些實踐

ray tracing pipeline 算是最理想的 ray casting 方法,它能獲得 hit point 的材質,并且得益于硬體加速,其性能也并不亞于軟體光追,因此基于 ray tracing pipeline 往往就可以設計出一套相當理想的實時光追演算法,然而在硬體不支持或部分支持(僅支持 ray query)的大部分平臺,如移動端,nintendo switch等,無論是 ray query 還是軟體光追都不能直接獲得 hit point 材質,因此往往還需要設計一套低精度的 material cache,

下面的實踐主要是圍繞 ray query 和軟體光追來介紹,基本不介紹 ray tracing pipeline(因為它可以直接簡單粗暴的做好),

Primary Ray

可以通過傳統的光柵化流程去做,而不是真的往螢屏投射 primary ray,

Shadow Ray & Visibility Ray

我們在常常需要計算某些著色點受到的直接光照,就往往需要從該點往光源投射 shadow ray 來檢測是否被遮擋,我們可以通過一套類似流水線的流程去處理 shadow ray:

  1. 若光源自帶 shadow map 且著色點在 shadow map 范圍內的,可以優先使用 shadow map 來進行遮擋測驗,而非投射一條 shadow ray,
  2. 若光源沒有 shadow map,亦或者著色點不在 shadow map 的范圍內,則可以使用性能開銷低的軟體光追方案:
    • 針對螢屏范圍內的著色點,可以嘗試進行 screen space ray tracing,若命中則視為被遮擋,
    • 如果場景含有 height field,可以嘗試進行 height field ray tracing,若命中則視為被遮擋,
  3. 若以上流程均未命中,則使用離屏的光追方案來做最后的遮擋測驗(命中為被遮擋,不命中為不被遮擋):
    • 其它軟體光追,
    • 硬體光追:ray query,

半透明陰影 - ray query

當陰影需要考慮半透明物體(例如樹葉)時,意味著我們的 shadow ray tracing 不能只考慮是否被遮擋,還得考慮遮擋物體的 opacity,并且這一次 ray tracing 還可能將發生多次 intersection,

當我們通過 ray query 去做半透明陰影時(需要設定 RayFlags 為 NoOpaque),每當產生 intersection 時,需要中斷回傳到我們自定義的程式,該程式需要計算出交點 uv 坐標采樣 alpha mask texture,并累積 alpha 值,若低于 opacity 閾值就繼續進行 ray tracing,

image-20230530235548429

一個優化方式是:我們可以進行多次非透明的 ray query(需要設定 RayFlags 為 Opaque):每次 ray query 產生 intersection 就 commit,然后做 alpha 相關測驗(和上面一樣),如果還需要繼續 ray tracing,那就更新發射點位置為 intersection 的位置并進行新一次的 ray query,

image-20230530235603533

這個優化方式的性能往往能提升2倍甚至更多的性能,一方面是 RayFlags 設定成 Opaque 后 ray query 的流程會簡化很多,另一方面是因為 ray query 是特定的硬體流程,中斷回傳會導致額外的 latency,因此盡量讓 ray query always commit,

Material Ray

而除了計算直接光照以外,我們還往往需要計算著色點受到的間接光照,這時候往往需要投射 material ray,獲取 hit point 的材質資訊以計算 radiance:

對于硬體光追 ray tracing pipeline 來說,material ray 是容易實作的:直接通過 closest hit shader 來計算出 hit point 的材質資訊,并之后通過 payload 來獲取材質資訊即可,

  1. 若著色點位于螢屏范圍內,可以優先嘗試 screen space ray tracing,若命中則可以獲取螢屏上的 normal, albedo, color 等材質資訊,
  2. 若著色點不在螢屏范圍內亦或者 SSRT 沒命中,則可以使用 visibility ray + material cache:由于缺少 closest hit shader,我們只能通過投射 visibility ray 得到一個 hit point 的 position,而得不到幾何資訊或者材質資訊,但是我們可以借助 material cache(例如:lumen 里的 mesh card;voxels 等)來獲取 hit point 的材質資訊,

注:幾何資訊有部分還是可以強行獲得的,如通過 SDF 梯度算 normal ,或者 triangle id 獲取 3 個 vertex 從而算出 face normal 等,

Low-Accuracy Ray + Short Ray

參考

  • DirectX Raytracing (DXR) Functional Spec | DirectX-Specs (microsoft.github.io)
  • Vulkan ray tracing 與 rasterization 管線對比 - 知乎 (zhihu.com)
  • [Lumen Siggraph 2022 realtimerendering.com](https://advances.realtimerendering.com/s2022/SIGGRAPH2022-Advances-Lumen-Wright et al.pdf)
  • Relief texture mapping | 2000
  • Interactive indirect illumination using voxel cone tracing | Symposium on Interactive 3D Graphics and Games 2011
  • Hierarchical Digital Differential Analyzer for Efficient Ray-Marching in OpenVDB | SIGGRAPH 2014
  • Real-time Sparse Distance Fields for Games | GDC-2023
  • Enhanced Sphere Tracing | STAG 2014
  • Accelerating Sphere Tracing | EUROGRAPHICS 2018
  • Segment Tracing Using Local Lipschitz Bounds | 2020
  • Rendering (Signed) Distance Function - 知乎 (zhihu.com)
  • GPU-based clay simulation and ray-tracing tech in Claybook Sebastian Aaltonen Co-founder of Second Order | GDC2018

作者:KillerAery 出處:http://www.cnblogs.com/KillerAery/

本文著作權歸作者和博客園共有,未經作者同意不可擅自轉載,否則保留追究法律責任的權利,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/555592.html

標籤:其他

上一篇:API網關-APISIX簡介

下一篇:返回列表

標籤雲
其他(161313) Python(38242) JavaScript(25505) Java(18249) C(15237) 區塊鏈(8271) C#(7972) AI(7469) 爪哇(7425) MySQL(7258) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5875) 数组(5741) R(5409) Linux(5347) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4603) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2436) ASP.NET(2404) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1984) HtmlCss(1968) 功能(1967) Web開發(1951) C++(1942) python-3.x(1918) 弹簧靴(1913) xml(1889) PostgreSQL(1881) .NETCore(1863) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 實時光線追蹤(3)Ray Casting

    [toc] 實時光追(Real-time Ray Tracing)往往是綜合了 sampling、ray casting、denoising 等各方面的方案,本文主要記錄的是 ray casting 這部分,但是術語可能更多仍然稱為 ray tracing。 # 硬體光追(Hardware Ray ......

    uj5u.com 2023-06-20 08:54:56 more
  • API網關-APISIX簡介

    本文分享自天翼云開發者社區《API網關-APISIX簡介》,作者:w****n Apache APISIX 是一個動態、實時、高性能的云原生 API 網關,提供了負載均衡、動態上游、灰度發布、服務熔斷、身份認證、可觀測性等豐富的流量管理功能。APISIX 構建于nginx+ngx_lua的技識訓礎之 ......

    uj5u.com 2023-06-20 08:54:28 more
  • 華為云鄧明昆:云原生時代,以開源賦能數字化轉型

    摘要:云原生技術以“極致彈性、分布式、松耦合、高韌性”等特征,可有效幫助企業實作基礎架構升級,業務快速創新。 近日,以“開源賦能,貧訓未來”為主題的開放原子全球開源峰會在北京亦創國際會展中心順利舉行。其中,由華為云承辦的以“探索云原生技術發展與應用實踐,賦能企業數字化轉型”為主題的2023開放原子全 ......

    uj5u.com 2023-06-20 08:54:16 more
  • 一個資深測驗工程師面試一來就問我這些題目

    德瑪作為一個已經作業有10年經驗的測驗工程師,其間也輾轉了幾個大的互聯網公司,雖然確實缺少了一些穩定性,但同時也積累了一些面試的經驗,不才分享一些給大家。那么主要是針對測驗工程師的一些總結,對于其他的工種,我可能會在別的文章中去總結一些面試技巧,本文會著重于測驗工程師的面經。 ......

    uj5u.com 2023-06-20 08:54:11 more
  • ModelBox實戰開發:RK3568實作攝像頭虛擬背景

    摘要:本文將使用ModelBox端云協同AI開發套件(RK3568)實作攝像頭虛擬背景AI應用的開發。 本文分享自華為云社區《ModelBox開發案例 - RK3568實作攝像頭虛擬背景【玩轉華為云】》,作者:AI練習生 。 本文將使用ModelBox端云協同AI開發套件(RK3568)實作攝像頭虛 ......

    uj5u.com 2023-06-20 08:53:30 more
  • 黃金票據權限維持

    # 黃金票據權限維持 [TOC] ## 一、Krbtgt賬戶介紹 krbtgt用戶,是系統在創建域時自動生成的一個帳號,其作用是密鑰分發中心的服務賬號,其密碼是系統隨機生成 的,無法登錄主機。 ## 二、黃金票據原理 TGT=Krbtgt的NTLM哈希加密 1、Kerberos中的TGT和Logon ......

    uj5u.com 2023-06-20 08:53:18 more
  • Grafana 系列-GaC-2-Grafana Terraform Provider 基礎

    ## 系列文章 * [Grafana 系列文章](https://ewhisper.cn/tags/Grafana/) * [Terraform 系列文章](https://ewhisper.cn/tags/Terraform/) ## 概述 [前文](https://ewhisper.cn/pos ......

    uj5u.com 2023-06-20 08:53:14 more
  • 詳解4種模型壓縮技術、模型蒸餾演算法

    摘要:本文主要為大家講解關于深度學習中幾種模型壓縮技術、模型蒸餾演算法:Patient-KD、DistilBERT、DynaBERT、TinyBERT。 本文分享自華為云社區《深度學習實踐篇[17]:模型壓縮技術、模型蒸餾演算法:Patient-KD、DistilBERT、DynaBERT、TinyBE ......

    uj5u.com 2023-06-20 08:52:34 more
  • Gamma:強大的AI制作PPT神器,用完再也回不去了!

    看過許多 AI 制作 PPT 軟體,最侄訓是被 Gamma 驚艷到。 Gamma 是一款基于人工智能技術的 PPT 制作工具,可以幫助用戶輕松制作高質量的 PPT 演示文稿。 # 痛點解決 相比傳統制作 PPT 方式,Gamma 可以解決哪些如下 7 個痛點: ## 一句話生成 PPT 傳統制作 P ......

    uj5u.com 2023-06-20 08:51:09 more
  • 好用網址分享-77ai導航與77搜索導航

    AI(人工智能)技術正在改變我們的生活方式和作業方式,越來越多的人開始關注和使用AI相關的網站和應用程式。在這篇文章中,我將為大家介紹一些常用的AI網址導航,幫助您更好地了解和使用AI技術。 **AI Hub** AI Hub是由Google Cloud推出的一個開放平臺,旨在幫助企業和開發者快速構 ......

    uj5u.com 2023-06-20 08:50:42 more