<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WebGPU+光線追蹤Ray Tracing 開發三個月總結

      大家好~這三個月以來,我一直在學習和實現“基于WebGPU的混合光線追蹤實時渲染”的技術,使用了Ray Tracing管線(如.rgen、.rmiss等著色器)。
      現在與大家分享和介紹我目前的學習成果,希望對大家有所幫助!謝謝!

      通過國外的開源項目,可在WebGPU中使用Ray Tracing管線

      這三個月我對Ray Tracing的研究有了質的突破,主要歸功于我發現的WebGPU Node開源項目!
      該作者首先在dawn-ray-tracing開源項目中對“dawn項目:Chrome對WebGPU的實現"進行了擴展,加入了光追的API;
      然后在WebGPU Node開源項目中,底層封裝了Vulkan SDK,上層使用了dawn-ray-tracing項目,提供了WebGPU API,實現了在Nodejs環境中使用WebGPU API和Ray Tracing管線來實現硬件加速的光線追蹤(電腦需要使用nvdia的RTX顯卡)!

      相關介紹參見:
      Real-Time Ray-Tracing in WebGPU

      搭建運行環境

      顯卡需要為GeForce RTX(如RTX 2060s)

      有兩種方法來搭建運行環境:
      1、給Chrome瀏覽器打補丁,使其與下載DXR驅動(DirectX Raytracing)關聯,從而在該瀏覽器中運行
      詳見該作者最近寫的開源項目:chromium-ray-tracing
      (我目前沒有運行成功,不建議使用該方法!)

      2、在這里->Vulkan Beta Driver Downloads 下載并安裝最新的Vulkan Driver(版本應該大于等于Windows 451.74),然后在你項目中安裝webgpu的npm包:“yarn add webgpu@0.1.16”。這樣就可以在nodejs中調用vulkan 1.2版本的Ray Tracing API了!!!(操作系統需要為win10!win7下會有問題!)

      參考示例:webgpu-examples
      使用方法: clone 項目,然后在項目根目錄執行“npm install”,接著在項目根目錄執行“node .\ray-tracing\index.mjs”運行光追示例。

      注意:要在requestAdapter中指定preferredBackend為“Vulkan”(因為如果為D3D12,會有bug),相關代碼為:

        let adapter = await GPU.requestAdapter({
          window,
          preferredBackend: "Vulkan"
        });
      

      應用場景

      考慮到WebGPU還沒有正式發布,并且可能在三年內瀏覽器都不會支持Ray Tracing管線,所以我把渲染放到云端,這樣就可以在云端自行搭建環境(如使用WebGPU Node開源項目),然后通過網絡傳輸將渲染結果傳輸到客戶端,從而在客戶端瀏覽器不支持的情況下仍能顯示光追渲染的畫面。

      因此,我的應用場景為:
      1、云渲染
      2、云游戲

      這兩個應用場景有不同的需求:
      “云渲染”屬于離線渲染,我們關心的是:

      • 畫質要好
      • 渲染時間可以長點

      因此:

      • 每幀可采樣多次,即n spp(n >= 30)
      • 支持多種渲染效果,如“焦射”(causicts)等
      • 全局光照可使用n次bounce(n >= 2)

      “云游戲”屬于實時渲染,我們關心的是:

      • 畫質可以差點
      • 渲染時間要短(每幀30ms以內)

      因此:

      • 每幀只采樣一次,即1 spp
      • 全局光照只使用一次或兩次bounce
      • 對“焦射”(causicts)等場景用性能好的方案達到接近的渲染效果,通過犧牲畫質來減少渲染時間

      介紹我目前的實現方案

      主要技術框架是“實時混合光線追蹤”,主要包含下面的pass:
      1、gbuffer pass
      創建gbuffer
      2、ray tracing pass
      直接從gbuffer中獲取world position、diffuse等數據,用來計算直接光照,從而減少了每個像素發射的光線數量;
      每個像素發射1個shadow ray,用來計算直接光照的陰影;
      如果只用1個bounce來計算全局光照的話,每個像素發射1個indirect ray+1個shadow ray,用來計算間接光照。
      3、denoise pass
      基于BMFR算法來實現降噪,具體可參考本文后面的“實現降噪Denoise”部分。
      4、taa pass
      使用taa來抗鋸齒

      相關代碼可見我的開源項目:
      WebGPU-RTX

      介紹我學習的整個流程,分享相關資料

      了解光線追蹤的相關領域

      我通過下面的文章進行了初步的了解:
      一篇光線追蹤的入門
      光線追蹤與實時渲染的未來
      實時光線追蹤技術:業界發展近況與未來挑戰
      Introduction to NVIDIA RTX and DirectX Ray Tracing
      如何評價微軟的 DXR(DirectX Raytracing)?

      實現第一個光追的Demo

      通過學習下面的資料:
      Ray Tracing in One Weekend
      Ray Tracing: The Next Week
      Ray Tracing in One Weekend和Ray Tracing: The Next Week的詳解
      基于OpenGL的GPU光線追蹤

      我參考資料中的代碼,用WebGL 2實現一個Demo:

      該場景的紅圈中是一個球,附近有一個球形光源和一個矩形光源

      因為沒有進行降噪,所以噪點太多了哈哈!

      相關代碼可見我的開源項目:
      Wonder-RayTrace

      學習和實現Ray Tracing管線

      通過學習NVIDIA Vulkan Ray Tracing Tutorial教程,我用 js語言+WebGPU Node開源項目 基于Ray Tracing管線依次實現了陰影、反射等基礎渲染效果。

      該教程使用了VK_KHR_ray_tracing擴展,而WebGPU Node開源項目也使用了該擴展(Vulkan SDK),因此該教程的shader代碼幾乎可以直接用到該開源項目中。

      教程代碼

      用Reason重寫

      我用Reason語言重寫了示例代碼,提煉了一個基礎架構。

      學習GBuffer+Ray Tracing混合管線

      因為我希望優先減少渲染時間,所以我要通過混合管線來進行實時渲染。

      我通過A Gentle Introduction To DirectX Raytracing教程來學習和實現。

      教程代碼下載

      我學習了該教程的第一篇到第11篇,分別實現了創建GBuffer、使用Lambertian材質渲染、多光源的陰影等內容。

      實現降噪Denoise

      教程的第9篇通過每個像素對每個光源發射一個shadow ray,最后累加并計算平均值,實現了多光源的陰影。

      教程的第11篇對第9篇進行了改進:為了減少每個像素發射的shadow ray的數量,每個像素只隨機向一個光源發射一個shadow ray。
      這樣會導致噪點,如下圖所示:

      我們可以通過累計采樣數來不斷逼近無噪點的圖片(如該教程的第6篇一樣),但這樣需要經過長時間后才會收斂,所以只適合“云渲染”這種離線渲染的應用場景。

      累加一定幀數后,結果如下圖所示:

      實現taa

      降噪算法通常需要先實現“幀間的數據復用”,而TAA抗鋸齒也需要實現“幀間數據復用”的技術;而且降噪算法會使用TAA作為最后一個pass來抗鋸齒。所以我決定先實現taa,將其作為實現降噪算法的鋪墊。

      我參考了下面的資料來實現taa:
      DX12渲染管線(2) - 時間性抗鋸齒(TAA)相關代碼
      Unity Temporal AA的改進與提高相關代碼
      unit Temporal Anti-Aliasing

      實現BMFR降噪算法

      為了能應用于“云游戲”這種實時渲染的應用場景,我們需要快速降噪。因此我實現了BMFR算法來降噪。

      降噪前場景:

      降噪后場景:

      我參考了下面的資料:
      BLOCKWISE MULTI-ORDER FEATURE REGRESSION FOR REAL-TIME PATH TRACING RECONSTRUCTION
      參考代碼

      學習蒙特卡羅積分(monte carlo)的理論

      教程的第11篇隨機向一個光源發射一個shadow ray,這其實已經使用了蒙特卡羅積分的理論。

      我們可以通過下面的資料深入學習該理論,了解概率密度函數(pdf)、重要性采樣等相關概念,為我們后面實現全局光照打下理論基礎:
      【RAY TRACING THE REST OF YOUR LIFE 超詳解】 光線追蹤 3-1 蒙特卡羅 (一)【RAY TRACING THE REST OF YOUR LIFE 超詳解】 光線追蹤 3-7 混合概率密
      光線追蹤器Ray Tracer:進階篇

      實現全局光照

      通過學習教程的第12篇,我實現了one bounce的全局光照。

      更多參考資料:
      Global Illumination and Path Tracing
      Global Illumination and Monte Carlo

      這里我遇到的問題主要是處理indirect specular noise:噪點不穩定,導致降噪后不穩定(高光周圍有明顯波動)。
      我首先以為是pdf寫錯了,結果修改了pdf后還是沒有改進;
      然后希望通過clamp等方法移除這些高光的fireflies噪點,結果影響到了畫質;
      最后采用了“采樣indirect specular/diffuse多次”來穩定噪點。這適用于“云渲染”的離線渲染,但不適用于“云游戲”的實時渲染。

      基于GGX模型,實現disney BRDF

      通過學習教程的第14篇,我引入了pbr材質,實現了GGX模型,加入了多bounce的全局光照。

      我對教程代碼進行了改進:
      在.rgen著色器中使用for循環而不是遞歸來實現的多bounce;
      實現了disney BRDF,在pbr材質中有diffuse、roughness、metallic、specular這幾個參數。

      更多參考資料:
      基于物理著色(二)- Microfacet材質和多層材質
      基于物理著色(三)- Disney和UE4的實現
      基于物理的渲染(PBR)白皮書 | 迪士尼原則的BRDF與BSDF相關總結
      WebGPU-Path-Tracer 實現了disney BRDF

      目前的渲染效果

      我目前的實現需要改進的地方

      在Ray Tracing pass中支持紋理

      使用bindless texture或者virtual texture來實現

      擴展disney BRDF,實現BSDF,支持透明、折射效果

      增加后處理

      如gamma矯正等

      在云端環境下多線程渲染

      云端天然具有并行的優勢,因此可將渲染任務分配到多個顯卡/服務器中執行。

      改進降噪效果

      BMFR對高光specular處理得不好。
      為了應用在“云渲染”中,需要提高畫質。因此可考慮:

      • 改進BMFR對specular的處理
        BMFR論文中已有相關的討論
      • 使用專門對多個spp采樣進行降噪的降噪器來替代BMFR
        因為BMFR主要是針對1 spp采樣,所以需要使用針對蒙托卡羅積分路徑追蹤的降噪器來替代

      改進indirect specular/diffuse noise

      現在我通過增加spp來增加噪點的穩定性,這在“云游戲”中行不通,因為只能有1 spp。因此可考慮:

      posted @ 2020-06-27 18:39  楊元超  閱讀(4551)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 深夜宅男福利免费在线观看| 久久夜色精品国产亚洲a| 亚洲男人成人性天堂网站| 日韩一区二区三区精彩视频| 亚洲一区二区三区在线| 日韩内射美女人妻一区二区三区 | 无码人妻丰满熟妇区bbbbxxxx| 国产成人高清亚洲综合| 精品女同一区二区三区在线| 国产啪视频免费观看视频| 国内精品视频区在线2021 | 国产日韩精品中文字幕| 久久久久国产精品人妻| 东京热人妻无码人av| 午夜A理论片在线播放| 午夜三级成人在线观看| 九九成人免费视频| 亚洲午夜福利AV一区二区无码| 国产成人a在线观看视频免费| 中文字幕在线无码一区二区三区| 国产精品18久久久久久麻辣| 余干县| 精品国产一区二区三区卡| 建宁县| 亚洲a∨国产av综合av| 人妻少妇久久中文字幕| 强开少妇嫩苞又嫩又紧九色| 成人国产精品一区二区网站公司 | 国产av一区二区午夜福利| 成人精品色一区二区三区| 亚洲乱码中文字幕小综合 | 亚洲午夜成人精品电影在线观看| 奈曼旗| 国产精品国产精品一区精品| 国产在线播放专区av| 国产精品 自在自线| 国产精品无码a∨精品| 亚洲AV无码东方伊甸园| a级亚洲片精品久久久久久久| 欧美激情肉欲高潮视频| 亚洲精品一区二区三区色|