0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

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

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

開放式 VDB 是奧斯卡獎(jiǎng)獲獎(jiǎng)的稀疏動(dòng)態(tài)卷的行業(yè)標(biāo)準(zhǔn)庫。在整個(gè)視覺效果行業(yè)中,它被用于模擬和渲染水、火、煙、云和大量其他依賴于稀疏體積數(shù)據(jù)的效果。該庫包括一個(gè)分層的、動(dòng)態(tài)的數(shù)據(jù)結(jié)構(gòu)和一套工具,用于高效地存儲(chǔ)和操作三維網(wǎng)格上離散的稀疏體數(shù)據(jù)。庫由 學(xué)院軟件基金會(huì)( ASWF ) 維護(hù)。有關(guān)詳細(xì)信息,請(qǐng)參見 VDB :具有動(dòng)態(tài)拓?fù)涞母叻直媛氏∈杈?。

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

NanoVDB 簡介

最初在 NVIDIA 開發(fā)的 NanoVDB 庫是一個(gè) ASWF OpenVDB 項(xiàng)目的新增功能 。它提供了一個(gè)與 OpenVDB 的核心數(shù)據(jù)結(jié)構(gòu)完全兼容的簡化表示,具有在 NanoVDB 和 OpenVDB 數(shù)據(jù)結(jié)構(gòu)之間來回轉(zhuǎn)換、創(chuàng)建和可視化數(shù)據(jù)的功能。

poYBAGJqMpWAAPy-AAD5OmBKd9k476.png

圖 1 OpenVDB 和 NanoVDB 數(shù)據(jù)結(jié)構(gòu)的圖示。

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

創(chuàng)建 NanoVDB 網(wǎng)格

盡管 NanoVDB 網(wǎng)格是一種只讀數(shù)據(jù)結(jié)構(gòu),但該庫包含生成或加載數(shù)據(jù)的功能。

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

以下代碼示例從 OpenVDB 文件轉(zhuǎn)換:

以下代碼示例從 OpenVDB 文件轉(zhuǎn)換:

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

雖然從現(xiàn)有的 OpenVDB 數(shù)據(jù)加載是典型的用例,但是附帶的網(wǎng)格生成器工具允許您直接在內(nèi)存中構(gòu)建 NanoVDB 網(wǎng)格。提供了一些簡單原語的函數(shù)來幫助您入門:

// 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 函數(shù)生成小而密集的體積(圖 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);

網(wǎng)格控制柄

網(wǎng)格句柄 是一個(gè)簡單的類,它擁有它分配的緩沖區(qū)的所有權(quán),允許網(wǎng)格的范圍劃分( RAII )。

它還用于封裝不透明的網(wǎng)格數(shù)據(jù)。盡管網(wǎng)格數(shù)據(jù)本身是以數(shù)據(jù)類型(如 浮動(dòng) 為模板的),但句柄提供了一種方便的方法來訪問網(wǎng)格的元數(shù)據(jù),而不必知道網(wǎng)格的數(shù)據(jù)類型 MIG 是什么。這很有用,因?yàn)槟梢约兇鈴木浔_定 GridType 。

下面的代碼示例驗(yàn)證是否有包含級(jí)別集函數(shù)的 32 位浮點(diǎn)網(wǎng)格:

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

網(wǎng)格緩沖區(qū)

NanoVDB 被設(shè)計(jì)成支持許多不同的平臺(tái), CPU , CUDA 甚至圖形 api 。為了實(shí)現(xiàn)這一點(diǎn),數(shù)據(jù)結(jié)構(gòu)被存儲(chǔ)在一個(gè)平坦的連續(xù)內(nèi)存緩沖區(qū)中。

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

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 模板化在緩沖區(qū)類型上,緩沖區(qū)類型是其內(nèi)存分配的包裝器。它默認(rèn)為使用主機(jī)系統(tǒng)內(nèi)存的主機(jī)緩沖區(qū);然而, NanoVDB 還提供了CUDA 緩沖器,以便輕松創(chuàng)建 CUDA 設(shè)備緩沖區(qū)。

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

將數(shù)據(jù)流解釋為納米網(wǎng)格類型后,可以使用這些方法訪問網(wǎng)格中的數(shù)據(jù)。有關(guān)更多詳細(xì)信息,請(qǐng)參閱相關(guān) API 的文檔。本質(zhì)上,它反映了 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);
};

可以構(gòu)造自定義緩沖區(qū)來處理不同的內(nèi)存空間。有關(guān)創(chuàng)建可與圖形 API 交互操作的緩沖區(qū)的示例的更多信息,請(qǐng)參閱存儲(chǔ)庫中的示例。

致使

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

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

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 );
};

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

...
    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 的另一項(xiàng)任務(wù),因?yàn)樗鼈兺ǔP枰行У夭檎覍?shí)體碰撞對(duì)象的有符號(hào)距離值。窄帶電平集表示非常理想,因?yàn)樗鼈冇梅?hào)對(duì)內(nèi)部/外部拓?fù)湫畔ⅲㄅ鲎矙z測所需)進(jìn)行了緊湊編碼。此外,最近點(diǎn)變換(沖突解決所需的)很容易從水平集函數(shù)的梯度計(jì)算。

下面的代碼示例是一個(gè)用于處理沖突的函數(shù)。使用 讀寫器 是很有用的,因?yàn)橛糜跊_突解決的梯度計(jì)算涉及到同一空間附近的多個(gè)提取。

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;
};

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

基準(zhǔn)

NanoVDB 被開發(fā)成在主機(jī)和設(shè)備上同樣運(yùn)行良好。使用 modernCUDA 中的擴(kuò)展 lambda 支持,您可以輕松地在兩個(gè)平臺(tái)上運(yùn)行相同的代碼。

本節(jié)包括比較英特爾線程構(gòu)建塊和 CPU CUDA 上光線跟蹤和碰撞檢測性能的基準(zhǔn)測試。計(jì)時(shí)以毫秒為單位,與 NVIDIA NVIDIA 8000 相比,是在 Xeon E5-2696 v4 x2 –( 88 個(gè) CPU 線程)上生成的。使用的 FogVolume 是兔子云, LevelSet 是 dragon 數(shù)據(jù)集。兩者都可以從 OpenVDB 網(wǎng)站下載。渲染的分辨率為 1024×1024 。這次碰撞試驗(yàn)?zāi)M了一億顆彈道粒子。

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

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

結(jié)論

NanoVDB 是一個(gè)小而強(qiáng)大的庫,它通過使用 GPUs 來加速某些 OpenVDB 應(yīng)用程序。開源存儲(chǔ)庫現(xiàn)在可用了!要下載源代碼、構(gòu)建示例

關(guān)于作者

Wil Braithwaite 在倫敦和洛杉磯的工作室工作了 15 年的視覺特效。他的職位包括研究、技術(shù)指導(dǎo)、合成、 CG 監(jiān)督和 MOCAP 監(jiān)督。他開創(chuàng)了圖形硬件在 VFX 管道中的應(yīng)用,在 NVIDIA 擔(dān)任高級(jí)應(yīng)用工程師,專門從事咨詢、培訓(xùn)和使用 NVIDIA 技術(shù)協(xié)助 VFX 工作室項(xiàng)目的開發(fā)。

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

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    4855

    瀏覽量

    102711
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4673

    瀏覽量

    128594
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    SystemView上下文統(tǒng)計(jì)窗口識(shí)別阻塞原因

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

    何在FreeRTOS操作系統(tǒng)上跑RT-Thread?

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

    何在IDF框架中使用自定義的靜態(tài)和動(dòng)態(tài)?

    基于商業(yè)需要,我們需要在 ESP-IDF v4.0-rc 這個(gè)版本的IDF中開發(fā)與使用自定義,有如下問題請(qǐng)協(xié)助: 1如何利用IDF框架編寫自定義靜態(tài)和動(dòng)態(tài)? 2如何在IDF框架
    發(fā)表于 06-25 07:57

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

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

    編寫一個(gè)任務(wù)調(diào)度程序,在上下文切換后遇到了一些問題求解

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

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

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

    請(qǐng)問risc-v中斷還需要軟件保存上下文和恢復(fù)嗎?

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

    何在測試中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大會(huì) 上分享了他如何在測試中使用 ChatGPT。
    的頭像 發(fā)表于 02-20 13:57 ?711次閱讀

    何在ModustoolBox中使用XMC4000系列

    我發(fā)現(xiàn) BSP Assistant 只能用于 XMC7000 系列,但我使用的是 XMC4000 系列。 如何在 ModustoolBox 中使用 XMC4000 系列?
    發(fā)表于 01-24 06:16

    TC39x如何在用戶模式下訪問外圍設(shè)備?

    你好, 我已經(jīng)在 TC39x 中啟用了用戶模式 1,并希望在用戶模式下允許訪問一些外圍設(shè)備和功能。 我主要想在用戶模式下使用 cpu endinit(在啟用和禁用看門狗的上下文中)。
    發(fā)表于 01-22 06:52

    ISR的上下文保存和恢復(fù)是如何完成的?

    函數(shù):ifxCPU_enableInterrupts ();如果我讓更高優(yōu)先級(jí)的 ISR 中斷優(yōu)先級(jí)較低的 ISR,那么 ISR 的上下文保存和恢復(fù)是如何完成的?
    發(fā)表于 01-22 06:28

    何在Linux中使用htop命令

    本文介紹如何在 Linux 中使用 htop 命令。
    的頭像 發(fā)表于 12-04 14:45 ?1831次閱讀
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中使</b>用htop命令

    FreeRTOS系列技術(shù)文章:上下文切換

    嵌入式實(shí)時(shí)操作系統(tǒng)(RTOS)中的上下文切換是指保存和恢復(fù)任務(wù)的狀態(tài),以使調(diào)度程序能夠切換到另一個(gè)任務(wù),從而促進(jìn)多任務(wù)處理。
    的頭像 發(fā)表于 11-21 15:48 ?1081次閱讀

    全新近似注意力機(jī)制HyperAttention:對(duì)長上下文友好、LLM推理提速50%

    本文介紹了一項(xiàng)近似注意力機(jī)制新研究,耶魯大學(xué)、谷歌研究院等機(jī)構(gòu)提出了 HyperAttention,使 ChatGLM2 在 32k 上下文長度上的推理時(shí)間快了 50%。 Transformer
    的頭像 發(fā)表于 11-20 09:15 ?548次閱讀
    全新近似注意力機(jī)制HyperAttention:對(duì)長<b class='flag-5'>上下文</b>友好、LLM推理提速50%