• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 3 月 19 日下午 2 點,鎖定 NVIDIA AI 網絡中文專場。立即注冊觀看
    內容創建/渲染

    Differential Slang:應用實例

    ?

    Differential Slang 可以輕松地與現有的代碼庫集成,從 Python、PyTorch、CUDA 到 HLSL,以幫助執行多個計算機圖形任務,并實現新的數據驅動和神經研究。在這篇文章中,我們介紹了幾個使用可微分 Slang 的代碼示例,以展示不同渲染應用程序的潛在用途和集成的容易性。

    這是關于可區分俚語系列的一部分。要獲取更多關于 Slang 語言中的差分編程和自動梯度計算的信息,請參閱Differential Slang:一種用于學習渲染器的著色語言

    示例應用程序:基于外觀的 BRDF 優化

    計算機圖形學中的基本構建塊之一是 BRDF 紋理圖,它表示材料的多種特性,并描述光如何與渲染表面相互作用。藝術家創作和預覽紋理,但隨后渲染算法會自動轉換紋理,例如過濾、混合 BRDF 屬性或創建 mipmaps。

    渲染是高度非線性的,因此紋理貼圖上的線性操作不會產生正確的線性變化外觀。為了在 mipmap 鏈創建等應用程序中保持外觀,提出了各種模型。這些模型是近似的,通常只為特定的 BRDF 創建;在呈現更改時必須設計新的。

    我們建議使用可微分渲染和數據驅動方法來構建外觀保持 mipmap,而不是細化這些模型。想要了解更多信息和代碼示例,請訪問 /shader-slang GitHub

    Three columns of images showing the differences in rendering results of a surface with a brick-and-grass material.
    圖 1。反向渲染可以對材質進行外觀保留縮小:(左)天真地向下采樣的材質;(中)使用 Slang 優化的低分辨率材料;(右)參考。

    在圖 1 中,左列顯示了使用天真的下采樣材質渲染的曲面。中間一列顯示了使用低分辨率材質渲染的同一曲面,該材質是通過使用 Slang 的自動微分功能實現的優化算法獲得的。右列顯示了使用參考材質而不進行下采樣的渲染結果。使用優化材質的渲染比使用天真的下采樣材質保留了更多的細節,并且匹配得更接近參考材質。

    為了展示 Slang 的靈活性和與多個現有框架的兼容性,我們在 PyTorch 中編寫了優化循環 Jupyter 筆記本,輕松實現了代碼的可視化、交互式調試和 Markdown 文檔。著色代碼是用 Slang 編寫的,這對圖形程序員來說很熟悉。Easy Slang、Python、PyTorch 和 Jupyter 的互操作性使您能夠選擇用于數據驅動圖形開發的最佳語言組合。

    示例應用程序:紋理壓縮

    紋理壓縮是一項優化任務,它可以顯著減少紋理文件大小和內存使用,同時努力保持圖像質量。有許多紋理壓縮方法和許多不同的壓縮器可用,其中最流行的是硬件塊壓縮(BC)。我們展示了如何使用梯度下降,通過 Slang 自動微分功能,為 BC7 模式 6 紋理壓縮自動找到接近最優的解決方案。

    通過使用梯度下降,我們不需要顯式地編寫壓縮代碼。Slang 通過模式 6 解碼器的后向微分自動生成 BC7 塊顏色插值的梯度:

    [Differentiable]
    float4 decodeTexel() {
    return weight * maxEndPoint + (1 - weight) * minEndPoint;
    }

    為了便于壓縮,我們提供了一個有效的初始猜測,將端點初始化為包圍塊的顏色空間框的角,并將插值權重設置為 0.5。我們對 BC7 量化進行建模,并迭代調整每個 4×4 塊的端點和權重,確保原始紋理與其壓縮版本之間的差異最小。

    這種簡單的方法實現了高壓縮質量,為了獲得最佳計算性能,我們將前向(解碼)和后向(編碼)過程合并到一個計算著色器中。每個線程在 BC7 塊上獨立工作,通過將所有數據保留在寄存器中并避免累積梯度的原子操作來提高效率。在 NVIDIA RTX 4090 上,這種方法每秒可以壓縮 400 個 4k 紋理,壓縮速度達到 6.5 GTexel/s。

    這個示例是使用 Slang 和 Falcor 渲染基礎設施的 Python 接口編寫的。想要了解更多信息和代碼示例,請訪問 NVIDIAGameWorks/Falcor GitHub

    應用示例:NVDIFFREC

    Figure shows that the pipeline takes as input 2D images of an ancient artifact, and a randomly initialized soup of triangles, and outputs a triangle mesh whose shape and material matches the input images.
    圖 2:反向渲染管道nvdiffrec,用 Slang 重寫,以與手工區分的 CUDA 內核相同的性能運行

    Nvdiffrec 是一個用于優化關節形狀、材質和照明的大型反向渲染庫。Nvdiffrec 可以從一系列 2D 觀測中重建各種場景屬性,并可用于各種反向渲染和外觀重建應用。

    Nvdiffrec 是一個用于關節形狀、材質和照明優化的大型反向渲染庫。Nvdiffrec 根據一系列 2D 觀測重建各種場景屬性,并可用于各種反向渲染和外觀重建應用。

    最初,Nvdiffrec 的性能關鍵操作是使用 PyTorch 擴展來加速的,PyTorch 是用手工區分的 CUDA 內核構建的。CUDA 內核執行以下任務:

    • 損失計算(log-sRGB 映射和曲寬縮小)
    • 切線空間法線映射
    • 頂點變換(頂點數組與一批 4×4 矩陣的乘積)
    • 立方體貼圖預過濾(用于分割和著色模型)

    Slang 生成自動區分的 CUDA 內核,實現與手寫、手動區分的 CUDA 代碼相同的性能。這大大減少了代碼行的數量,同時保持與其他 CUDA 內核的兼容性和互操作性。Slang 使代碼更易于維護、擴展和連接到現有的渲染管道和著色模型。

    想要了解更多關于 nvdiffrec 的 Slang 版本的信息,請訪問 /NVlabs/nvdiffrec GitHub

    示例應用程序:可微分路徑跟蹤器

    我們將傳統的實時路徑跟蹤器轉換為可微分路徑跟蹤器,重用了超過 5K 行的 Slang 代碼。以下是 Slang 中兩個不同的反向路徑跟蹤示例:

    結論

    想要了解更多信息,請參閱 SLANG.D:快速、模塊化和可微分著色器編程 論文,并開始探索可微分渲染 Slang

    ?

    0

    標簽

    人人超碰97caoporen国产