色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何在光線跟蹤和碰撞檢測上下文中使用NanoVDB 庫的示例

星星科技指導員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-28 14:22 ? 次閱讀

開放式 VDB 是奧斯卡獎獲獎的稀疏動態卷的行業標準庫。在整個視覺效果行業中,它被用于模擬和渲染水、火、煙、云和大量其他依賴于稀疏體積數據的效果。該庫包括一個分層的、動態的數據結構和一套工具,用于高效地存儲和操作三維網格上離散的稀疏體數據。庫由 學院軟件基金會( ASWF ) 維護。有關詳細信息,請參見 VDB :具有動態拓撲的高分辨率稀疏卷 。

盡管 OpenVDB 提供了性能優勢,但它的設計并沒有考慮到 GPUs 。它對幾個外部庫的依賴使得利用 GPUs 上的 VDB 數據變得很麻煩,這正是本文主題的動機。我們將向您介紹 NanoVDB 庫,并提供一些如何在光線跟蹤和碰撞檢測上下文中使用它的示例。

NanoVDB 簡介

最初在 NVIDIA 開發的 NanoVDB 庫是一個 ASWF OpenVDB 項目的新增功能 。它提供了一個與 OpenVDB 的核心數據結構完全兼容的簡化表示,具有在 NanoVDB 和 OpenVDB 數據結構之間來回轉換、創建和可視化數據的功能。

poYBAGJqMpWAAPy-AAD5OmBKd9k476.png

圖 1 OpenVDB 和 NanoVDB 數據結構的圖示。

NanoVDB 采用了 VDB 樹結構的壓縮、線性化、只讀表示(圖 1 ),這使得它適合于樹層次結構的快速傳輸和快速、無指針遍歷。為了提高效率,數據流經過調整,可以在 GPUs 和 CPU 上使用。

創建 NanoVDB 網格

盡管 NanoVDB 網格是一種只讀數據結構,但該庫包含生成或加載數據的功能。

所有的 OpenVDB 網格類 – LevelSets 、 FogVolumes 、 PointIndexGrids 和 PointDataGrids ——都支持 NanoVDB 表示,并且可以直接從 OpenVDB 文件(即 。 vdb 系統 文件)加載。還可以將數據加載或保存到 NanoVDB 自己的文件格式中或從中保存,該格式本質上是其內存流的一個轉儲,其中包含用于高效檢查的附加元數據。

以下代碼示例從 OpenVDB 文件轉換:

以下代碼示例從 OpenVDB 文件轉換:

openvdb::io::File file(fileName);
auto vdbGrid = file.readGrid(gridName);
auto handle = nanovdb::openToNanoVDB(vdbGrid);

雖然從現有的 OpenVDB 數據加載是典型的用例,但是附帶的網格生成器工具允許您直接在內存中構建 NanoVDB 網格。提供了一些簡單原語的函數來幫助您入門:

// generate a sparse narrow-band level set (i.e. truncated signed distance field) representation of a sphere.
auto handle = nanovdb::createLevelSetSphere(50, nanovdb::Vec3f(0));

下面的示例顯示了如何使用 lambda 函數生成小而密集的體積(圖 2 ):

nanovdb::GridBuilder builder(0);
auto op = [](const nanovdb::Coord& ijk) -> float { return menger(nanovdb::Vec3f(ijk) * 0.01f);
};
builder(op, nanovdb::CoordBBox(nanovdb::Coord(-100), nanovdb::Coord(100)));
// create a FogVolume grid called "menger" with voxel-size 1
auto handle = builder.getHandle<>(1.0, nanovdb::Vec3d(0), "menger", nanovdb::GridClass::FogVolume);

網格控制柄

網格句柄 是一個簡單的類,它擁有它分配的緩沖區的所有權,允許網格的范圍劃分( RAII )。

它還用于封裝不透明的網格數據。盡管網格數據本身是以數據類型(如 浮動 為模板的),但句柄提供了一種方便的方法來訪問網格的元數據,而不必知道網格的數據類型 MIG 是什么。這很有用,因為您可以純粹從句柄確定 GridType 。

下面的代碼示例驗證是否有包含級別集函數的 32 位浮點網格:

const nanovdb::GridMetaData* metadata = handle.gridMetaData();
if (!metadata->isLevelSet() || !metadata->gridType() == GridType::Float) throw std::runtime_error("Not the right stuff!");

網格緩沖區

NanoVDB 被設計成支持許多不同的平臺, CPU , CUDA 甚至圖形 api 。為了實現這一點,數據結構被存儲在一個平坦的連續內存緩沖區中。

使這個緩沖區駐留在 CUDA 設備上很簡單。為了完全控制,您可以使用 CUDA api 分配設備內存,然后將句柄的數據上載到其中。

void* d_gridData;
cudaMalloc(&d_gridData, handle.size());
cudaMemcpy(d_gridData, handle.data(), handle.size(), cudaMemcpyHostToDevice);
const nanovdb::FloatGrid* d_grid = reinterpret_cast(d_gridData);

NanoVDB 的 GridHandle 模板化在緩沖區類型上,緩沖區類型是其內存分配的包裝器。它默認為使用主機系統內存的主機緩沖區;然而, NanoVDB 還提供了CUDA 緩沖器,以便輕松創建 CUDA 設備緩沖區。

auto handle = nanovdb::openToNanoVDB<nanovdb::CudaDeviceBuffer>(vdbGrid);
handle->deviceUpload();
const nanovdb::FloatGrid* grid = handle->deviceGrid();

將數據流解釋為納米網格類型后,可以使用這些方法訪問網格中的數據。有關更多詳細信息,請參閱相關 API 的文檔。本質上,它反映了 OpenVDB 中只讀方法的基本子集。

auto hostOrDeviceOp = [grid] __host__ __device__ (nanovdb::Coord ijk) -> float {
  // Note that ReadAccessor (see below) should be used for performance.
  return grid->tree().getValue(ijk);
};

可以構造自定義緩沖區來處理不同的內存空間。有關創建可與圖形 API 交互操作的緩沖區的示例的更多信息,請參閱存儲庫中的示例。

致使

由于 NanoVDB 網格提供了一個緊湊的只讀 VDB 樹,因此它們很適合渲染任務。光線將 VDB 網格跟蹤到圖像中。使用每線程一條光線,并使用一個自定義的 雷吉諾 functor 生成光線,該函數接受像素偏移并創建世界空間光線。完整的代碼在存儲庫示例中可用。

考慮到沿射線采樣具有空間相干性這一事實,可以使用 讀寫器 來加速采樣。當光線向前移動時,這會緩存樹遍歷堆棧,從而允許自底向上的樹遍歷,這比傳統的自上而下遍歷要快得多,后者涉及相對較慢的無界根節點。

auto renderTransmittanceOp = [image, grid, w, h, rayGenOp, imageOp, dt] __host__ __device__ (int i) {
    nanovdb::Ray wRay = rayGenOp(i, w, h);
    // transform the ray to the grid's index-space...
    nanovdb::Ray iRay = wRay.worldToIndexF(*grid);
    // clip to bounds.
    if (iRay.clip(grid->tree().bbox()) == false) {
        imageOp(image, i, w, h, 1.0f);
        return;
    }
    // get an accessor.
    auto acc = grid->tree().getAccessor();
    // integrate along ray interval...
    float transmittance = 1.0f;
    for (float t = iRay.t0(); t < iRay.t1(); t+=dt) {
        float sigma = acc.getValue(nanovdb::Coord::Floor(iRay(t)));
        transmittance *= 1.0f - sigma * dt;
    }
    imageOp(image, i, w, h, transmittance );
};

由于光線與水平集網格相交是一項常見任務, NanoVDB 實現了一個零交叉功能,并使用分層 DDA ( HDDA )作為沿光線的根搜索的一部分來清空空間跳躍(圖 5 )。有關 HDDA 的更多信息,請參閱 OpenVDB 中高效光線行進的分層數字微分分析儀 。下面是代碼示例:

...
    auto acc = grid->tree().getAccessor();
    // intersect with zero level-set...
    float iT0;
    nanovdb::Coord ijk;
    float v;
    if (nanovdb::ZeroCrossing(iRay, acc, ijk, v, iT0)) { 
        // convert intersection distance (iT0) to world-space
        float wT0 = iT0 * grid->voxelSize();
        imageOp(image, i, w, h, wT0);
    } else {
        imageOp(image, i, w, h, 0.0f);
    }
...

碰撞檢測

碰撞檢測和解決是 NanoVDB 的另一項任務,因為它們通常需要有效地查找實體碰撞對象的有符號距離值。窄帶電平集表示非常理想,因為它們用符號對內部/外部拓撲信息(碰撞檢測所需)進行了緊湊編碼。此外,最近點變換(沖突解決所需的)很容易從水平集函數的梯度計算。

下面的代碼示例是一個用于處理沖突的函數。使用 讀寫器 是很有用的,因為用于沖突解決的梯度計算涉及到同一空間附近的多個提取。

auto collisionOp = [grid, positions, velocities, dt] __host__ __device__ (int i) {
    nanovdb::Vec3f wPos = positions[i];
    nanovdb::Vec3f wVel = velocities[i];
    nanovdb::Vec3f wNextPos = wPos + wVel * dt;
    // transform the position to a custom space...
    nanovdb::Vec3f iNextPos = grid.worldToIndexF(wNextPos);
    // the grid index coordinate.
    nanovdb::Coord ijk = nanovdb::Coord::Floor(iNextPos);
    // get an accessor.
    auto acc = grid->tree().getAccessor();
    if (tree.isActive(ijk)) { // are you inside the narrow band?
        float wDistance = acc.getValue(ijk);
        if (wDistance <= 0) { // are you inside the levelset?
            // get the normal for collision resolution.
            nanovdb::Vec3f normal(wDistance);
            ijk[0] += 1;
            normal[0] += acc.getValue(ijk);
            ijk[0] -= 1;
            ijk[1] += 1;
            normal[1] += acc.getValue(ijk);
            ijk[1] -= 1;
            ijk[2] += 1;
            normal[2] += acc.getValue(ijk);
            normal.normalize();
            
            // handle collision response with the surface.
            collisionResponse(wPos, wNextPos, normal, wDistance, wNextPos, wNextVel);
        }
    }
    positions[i] = wNextPos;
    velocities[i] = wNextVel;
};

同樣,完整的代碼可以在存儲庫中找到。

基準

NanoVDB 被開發成在主機和設備上同樣運行良好。使用 modernCUDA 中的擴展 lambda 支持,您可以輕松地在兩個平臺上運行相同的代碼。

本節包括比較英特爾線程構建塊和 CPU CUDA 上光線跟蹤和碰撞檢測性能的基準測試。計時以毫秒為單位,與 NVIDIA NVIDIA 8000 相比,是在 Xeon E5-2696 v4 x2 –( 88 個 CPU 線程)上生成的。使用的 FogVolume 是兔子云, LevelSet 是 dragon 數據集。兩者都可以從 OpenVDB 網站下載。渲染的分辨率為 1024×1024 。這次碰撞試驗模擬了一億顆彈道粒子。

雖然基準測試(圖 6 和下表)顯示了 NanoVDB 高效表示加速 CPU 上 OpenVDB 的好處,但它真正突出了使用 GPU 對 VDB 數據進行只讀訪問以進行碰撞檢測和光線跟蹤的好處。

圖 6 Intel TBB 與 CUDA 的比較(越小越好)。

結論

NanoVDB 是一個小而強大的庫,它通過使用 GPUs 來加速某些 OpenVDB 應用程序。開源存儲庫現在可用了!要下載源代碼、構建示例

關于作者

Wil Braithwaite 在倫敦和洛杉磯的工作室工作了 15 年的視覺特效。他的職位包括研究、技術指導、合成、 CG 監督和 MOCAP 監督。他開創了圖形硬件在 VFX 管道中的應用,在 NVIDIA 擔任高級應用工程師,專門從事咨詢、培訓和使用 NVIDIA 技術協助 VFX 工作室項目的開發。

Ken Museth 是模擬技術的高級主管,并于 2020 年初加入 NVIDIA ,當時他發起了 NanoVDB 的開發。他以前在開發虛擬現實技術的時候,一直致力于虛擬現實的開發。他是 VDB 的創建者和 OpenVDB 的首席架構師,也是其技術指導委員會的主席。此外,肯在 SpaceX 公司工作了六年,對新的猛禽火箭發動機進行大規模流體動力學模擬。在 2017 年加入 Weta 之前,他在夢工廠動畫和數字領域工作了 10 年,在此之前,他曾在加州理工學院和林科平大學擔任研究員和全職教授。他擁有哥本哈根大學量子動力學博士學位,并獲得電影藝術與科學學院頒發的技術成就獎??鲜?SIGGRAPH 2020 技術論文委員會成員。

審核編輯:郭婷

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • NVIDIA
    +關注

    關注

    14

    文章

    5075

    瀏覽量

    103529
  • gpu
    gpu
    +關注

    關注

    28

    文章

    4768

    瀏覽量

    129217
收藏 人收藏

    評論

    相關推薦

    dbForge Studio for PostgreSQL:PostgreSQL數據多功能集成開發環境

    數據模式和表數據的比較和同步 高效便捷地生成針對特定列的智能測試數據 支持14種格式的數據導入和導出 數據透視表中的數據匯總和值得關注的數據報告 多功能數據檢索、存儲和管理 從命令行自動化重復操作 dbForge Studio的重要功能 SQL編碼輔助 Studio的集成編碼輔助工具包括
    的頭像 發表于 01-16 17:26 ?95次閱讀

    GitHub Copilot與Bitbucket、Jira、Confluence集成使用指南

    如何通過Atlassian Rovo for GitHub Copilot插件,幫助您在編輯器中直接獲取Atlassian工具的上下文信息。
    的頭像 發表于 12-03 14:37 ?267次閱讀
    GitHub Copilot與Bitbucket、Jira、Confluence集成使用指南

    Wi-Fi資產跟蹤應用示例概述

    SiliconLabs(亦稱“芯科科技”)近期在GitHub資源中發布了一個基于最新SiWx917 Wi-Fi SoC的Wi-Fi資產跟蹤(Asset Tracking)應用示例。此應用程序演示如何將SiWG917模塊配置為A
    的頭像 發表于 11-08 14:47 ?390次閱讀

    3D霍爾傳感器在掃地機器人中用于碰撞檢測

    電子發燒友網站提供《3D霍爾傳感器在掃地機器人中用于碰撞檢測.pdf》資料免費下載
    發表于 09-06 10:26 ?0次下載
    3D霍爾傳感器在掃地機器人中用于<b class='flag-5'>碰撞檢測</b>

    SystemView上下文統計窗口識別阻塞原因

    SystemView工具可以記錄嵌入式系統的運行時行為,實現可視化的深入分析。在新發布的v3.54版本中,增加了一項新功能:上下文統計窗口,提供了對任務運行時統計信息的深入分析,使用戶能夠徹底檢查每個任務,幫助開發人員識別阻塞原因。
    的頭像 發表于 08-20 11:31 ?469次閱讀

    何在FreeRTOS操作系統上跑RT-Thread?

    我現在有個項目用的MCU 內核是很小眾的,芯片廠家僅支持freertos,我現在想把rt-thread弄上去跑,不知道該怎么實現開關中斷以及上下文切換等,能提供幫助嗎? 底層繼續使用freertos,我在應用中使用rt-thread
    發表于 07-09 08:30

    何在IDF框架中使用自定義的靜態和動態

    基于商業需要,我們需要在 ESP-IDF v4.0-rc 這個版本的IDF中開發與使用自定義,有如下問題請協助: 1如何利用IDF框架編寫自定義靜態和動態? 2如何在IDF框架
    發表于 06-25 07:57

    鴻蒙Ability Kit(程序框架服務)【應用上下文Context】

    [Context]是應用中對象的上下文,其提供了應用的一些基礎信息,例如resourceManager(資源管理)、applicationInfo(當前應用信息)、dir(應用文件路徑)、area
    的頭像 發表于 06-06 09:22 ?534次閱讀
    鴻蒙Ability Kit(程序框架服務)【應用<b class='flag-5'>上下文</b>Context】

    編寫一個任務調度程序,在上下文切換后遇到了一些問題求解

    大家好, 我正在編寫一個任務調度程序,在上下文切換后遇到了一些問題。 為下一個任務恢復上下文后: __builtin_tricore_mtcr_by_name(\"pcxi\"
    發表于 05-22 07:50

    JPEG LS算法局部梯度值計算原理

    如果同一個上下文中對少量元素進行編碼,通常無法獲得足夠的上下文編碼信息。但是如果對大量元素進行編碼又會帶來存儲空間變大的問題。因此要對局部梯度值進行量化處理。
    的頭像 發表于 04-25 10:46 ?525次閱讀
    JPEG LS算法局部梯度值計算原理

    工業計算機是什么?如何在不同行業中使用?

    工業電腦是專為在工業環境中使用而設計的計算機。它們可用于各個行業,包括制造、運 輸和能源。它們通常比普通計算機更強大,并且能夠在大多數計算機無法運行的環境中運行。在本文中,我們將更深入地了解什么是工業計算機以及它們如何在不同行業
    的頭像 發表于 04-01 15:45 ?877次閱讀
    工業計算機是什么?如<b class='flag-5'>何在</b>不同行業<b class='flag-5'>中使</b>用?

    Linux內存故障追蹤的實用技術指南

    使用kprobe跟蹤swap_readpage()內核函數,這會在觸發換頁所在的進程上下文中進行,可以跟蹤觸發換頁操作的進程的信息。展示了哪個進程正在從換頁設備中換入頁,前提是系統中有正在使用的換頁設備。
    發表于 04-01 14:27 ?673次閱讀
    Linux內存故障追蹤的實用技術指南

    TC397收到EVAL_6EDL7141_TRAP_1SH 3上下文管理EVAL_6EDL7141_TRAP_1SH錯誤怎么解決?

    我收到EVAL_6EDL7141_TRAP_1SH 3 類(TIN4-Free 上下文列表下溢)上下文管理EVAL_6EDL7141_TRAP_1SH錯誤。 請告訴我解決這個問題的辦法。
    發表于 03-06 08:00

    請問risc-v中斷還需要軟件保存上下文和恢復嗎?

    risc-v中斷還需要軟件保存上下文和恢復嗎?
    發表于 02-26 07:40

    何在測試中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大會 上分享了他如何在測試中使用 ChatGPT。
    的頭像 發表于 02-20 13:57 ?792次閱讀
    主站蜘蛛池模板: 亚洲AV无码乱码在线观看浪潮 | 人人妻免费线 | 男女高潮又爽又黄又无遮挡 | 亚洲精品成人A8198A片漫画 | 97视频在线免费播放 | 十大禁止安装的黄台有风险 | 国产成人在线观看网站 | 三级黄色网 | 日久精品不卡一区二区 | 国外成人电台 | 印度老妇女bbbxxx | z0000性欧美 YY8848高清私人影院 | 干性感美女 | 色内射无码AV | 日本熟妇乱人伦A片精品软件 | 国产一区二区青青精品久久 | 亚洲精品欧美精品中文字幕 | 久久黄视频 | 亚洲精品天堂在线观看 | 国产午夜亚洲精品区 | 寂寞护士中文字幕 mp4 | 精品国产午夜福利在线观看蜜月 | 草莓国产视频免费观看 | 国产高清视频在线观看97 | 免费视频精品38 | 久久亚洲AV成人无码动态图 | 特大黑人娇小亚洲女mp4 | 久久 这里只精品 免费 | 免费乱理伦片在线观看夜 | 一品道门免费视频韩国 | 973午夜伦伦电影论片 | 4480YY旧里番在线播放 | 99久久久久精品国产免费麻豆 | 成人在线视频免费 | 久久大香萑太香蕉av | 欧美视频精品一区二区三区 | 超碰在线97久久视频观看 | 我解开了岳的乳第一个女人 | 久久久中日AB精品综合 | 妺妺窝人体色777777野大粗 | 在线观看黄色小说 |