日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

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

星星科技指導(dǎo)員 ? 來源:NVIDIA ? 作者:NVIDIA ? 2022-04-28 14:22 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

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

NanoVDB 簡介

最初在 NVIDIA 開發(fā)的 NanoVDB 庫是一個 ASWF OpenVDB 項目的新增功能 。它提供了一個與 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)存流的一個轉(zhuǎn)儲,其中包含用于高效檢查的附加元數(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)格句柄 是一個簡單的類,它擁有它分配的緩沖區(qū)的所有權(quán),允許網(wǎng)格的范圍劃分( RAII )。

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

下面的代碼示例驗證是否有包含級別集函數(shù)的 32 位浮點網(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è)計成支持許多不同的平臺, CPU , CUDA 甚至圖形 api 。為了實現(xiàn)這一點,數(shù)據(jù)結(jié)構(gòu)被存儲在一個平坦的連續(xù)內(nèi)存緩沖區(qū)中。

使這個緩沖區(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)存分配的包裝器。它默認為使用主機系統(tǒng)內(nèi)存的主機緩沖區(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)更多詳細信息,請參閱相關(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ū)的示例的更多信息,請參閱存儲庫中的示例。

致使

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

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

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)格相交是一項常見任務(wù), NanoVDB 實現(xiàn)了一個零交叉功能,并使用分層 DDA ( HDDA )作為沿光線的根搜索的一部分來清空空間跳躍(圖 5 )。有關(guān) HDDA 的更多信息,請參閱 OpenVDB 中高效光線行進的分層數(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 的另一項任務(wù),因為它們通常需要有效地查找實體碰撞對象的有符號距離值。窄帶電平集表示非常理想,因為它們用符號對內(nèi)部/外部拓撲信息(碰撞檢測所需)進行了緊湊編碼。此外,最近點變換(沖突解決所需的)很容易從水平集函數(shù)的梯度計算。

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

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 被開發(fā)成在主機和設(shè)備上同樣運行良好。使用 modernCUDA 中的擴展 lambda 支持,您可以輕松地在兩個平臺上運行相同的代碼。

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

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

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

結(jié)論

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

關(guān)于作者

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

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

審核編輯:郭婷

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

    關(guān)注

    14

    文章

    5696

    瀏覽量

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

    關(guān)注

    28

    文章

    5283

    瀏覽量

    136097
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    何在S32K146中使用CAN2.0B協(xié)議的示例項目

    hi, 我們正在項目中使用s32k146,希望在我們的板子上使用CAN2.0B協(xié)議,但無法配置設(shè)置。因此,請?zhí)峁┮粋€CAN2.0B協(xié)議的示例項目。
    發(fā)表于 04-17 08:31

    安信可AI語音模組支持MCP模型上下文協(xié)議

    安信可 PalChat 系列(V1/V2)支持 MCP(模型上下文協(xié)議),工程師只需寫幾十行 C 代碼,就能讓 AI 模型直接控制硬件設(shè)備。V1 基于 Ai-WB2-12F,適合快速驗證;V2
    的頭像 發(fā)表于 04-15 09:54 ?511次閱讀

    奧迪威電池包碰撞檢測方案:通過觸覺表面?zhèn)鞲袑崿F(xiàn)主動安全

    電池包碰撞檢測方案代表了從反應(yīng)式到主動式電池安全管理的重大飛躍。通過提供一個持續(xù)的觸覺感知層,它為駕駛安全和電池系統(tǒng)完整性增加了一道不可或缺的保障。這項技術(shù)對于提升電動汽車的信任度、可靠性和整體安全范式至關(guān)重要。
    的頭像 發(fā)表于 02-25 11:16 ?359次閱讀
    奧迪威電池包<b class='flag-5'>碰撞檢測</b>方案:通過觸覺表面?zhèn)鞲袑崿F(xiàn)主動安全

    NVIDIA BlueField-4為推理上下文記憶存儲平臺提供強大支持

    隨著代理式 AI 工作流將上下文窗口擴展到數(shù)百萬個 token,并將模型規(guī)模擴展到數(shù)百萬億個參數(shù),AI 原生企業(yè)正面臨著越來越多的擴展挑戰(zhàn)。這些系統(tǒng)目前依賴于智能體長期記憶來存儲跨多輪、工具和會話持續(xù)保存的上下文,以便智能體能夠基于先前的推理進行構(gòu)建,而不是每次請求都從頭
    的頭像 發(fā)表于 02-02 10:29 ?1322次閱讀
    NVIDIA BlueField-4為推理<b class='flag-5'>上下文</b>記憶存儲平臺提供強大支持

    大語言模型如何處理上下文窗口中的輸入

    本博客介紹了五個基本概念,闡述了大語言模型如何處理上下文窗口中的輸入。通過明確的例子和實踐中獲得的見解,本文介紹了多個與上下文窗口有關(guān)的基本概念,如詞元化、序列長度和注意力等。
    的頭像 發(fā)表于 12-03 13:48 ?783次閱讀
    大語言模型如何處理<b class='flag-5'>上下文</b>窗口中的輸入

    執(zhí)行脫離上下文的威脅分析與風險評估

    作為WITTENSTEIN high integrity system(WHIS)公司的核心產(chǎn)品,SAFERTOS專為安全關(guān)鍵型嵌入式系統(tǒng)設(shè)計,使其成為確保聯(lián)網(wǎng)車輛環(huán)境可靠防護的理想選擇。在本文中
    的頭像 發(fā)表于 11-28 09:11 ?657次閱讀
    執(zhí)行脫離<b class='flag-5'>上下文</b>的威脅分析與風險評估

    在CW32F030 MCU上設(shè)置外部中斷和RTC喚醒條件的示例

    (void) { // 在這里添加進入DeepSleep模式前的準備工作,比如保存上下文、禁用不必要的時鐘等 // 請求進入DeepSleep模式(具體實現(xiàn)可能依賴于你的MCU和HAL
    發(fā)表于 11-25 08:00

    請問riscv中斷還需要軟件保存上下文和恢復(fù)嗎?

    以下是我拷貝的文檔里的說明,這個中斷處理還需要軟件來寫上下文保存和恢復(fù),在使用ARM核的單片機都不需要考慮這些的,使用過的小伙伴能解答嗎? 3.8. 進出中斷的上下文保存和恢復(fù) RISC-V架構(gòu)
    發(fā)表于 10-20 09:56

    HTTP開發(fā)必備:核心與httpplus擴展應(yīng)用示例全攻略

    HTTP開發(fā)的必備參考!本文匯總核心基礎(chǔ)操作與httpplus擴展高級特性,通過示例解析,讓你快速上手各類HTTP開發(fā)需求。
    的頭像 發(fā)表于 09-20 15:19 ?3336次閱讀
    HTTP開發(fā)必備:核心<b class='flag-5'>庫</b>與httpplus擴展<b class='flag-5'>庫</b>應(yīng)用<b class='flag-5'>示例</b>全攻略

    HarmonyOSAI編程智能問答

    多線程? 指定上下文問答 在對話框中輸入@符號,或點擊上方@Add Context按鈕,可指定對單個或多個代碼文件進行分析。點擊圖標開啟光標上下文功能,該功能可識別光標位置和選中的代碼片段,讓CodeGenie分析指定文件和選中的代碼片段。 本文主要從參考引用自Har
    發(fā)表于 09-03 16:17

    HarmonyOSAI編程編輯區(qū)代碼續(xù)寫

    利用AI大模型分析并理解開發(fā)者在代碼編輯區(qū)的上下文信息或自然語言描述信息,智能生成符合上下文的ArkTS或C++代碼片段。 使用約束 建議在編輯區(qū)內(nèi)已有較豐富上下文,能夠使模型對編程場景有一定
    發(fā)表于 08-21 15:43

    HarmonyOS AI輔助編程工具(CodeGenie)智能問答

    DeepSeek-R1智能體,快速體驗智能問答能力。 一、對話示例 在對話區(qū)域輸入需要查詢的問題,開始問答。示例如下: ArkTS如何實現(xiàn)多線程? 二、指定上下文問答 在對話框中輸入@符號,或點擊上方@Add
    發(fā)表于 08-15 11:07

    鴻蒙NEXT-API19獲取上下文,在class中和ability中獲取上下文,API遷移示例-解決無法在EntryAbility中無法使用最新版

    摘要:隨著鴻蒙系統(tǒng)API升級至16版本(modelVersion5.1.1),多項API已廢棄。獲取上下文需使用UIContext,具體方法包括:在組件中使用getUIContext(),在類中使
    的頭像 發(fā)表于 07-01 10:57 ?918次閱讀
    鴻蒙NEXT-API19獲取<b class='flag-5'>上下文</b>,在class中和ability中獲取<b class='flag-5'>上下文</b>,API遷移<b class='flag-5'>示例</b>-解決無法在EntryAbility中無法使用最新版

    Transformer架構(gòu)中編碼器的工作流程

    編碼器是Transformer體系結(jié)構(gòu)的基本組件。編碼器的主要功能是將輸入標記轉(zhuǎn)換為上下文表示。與早期獨立處理token的模型不同,Transformer編碼器根據(jù)整個序列捕獲每個token的上下文
    的頭像 發(fā)表于 06-10 14:27 ?1233次閱讀
    Transformer架構(gòu)中編碼器的工作流程

    UIAbility組件基本用法說明

    UIAbility組件基本用法 UIAbility組件的基本用法包括:指定UIAbility的啟動頁面以及獲取UIAbility的上下文UIAbilityContext。 指定UIAbility
    發(fā)表于 05-16 06:32
    东平县| 当雄县| 瓦房店市| 抚远县| 外汇| 柘城县| 留坝县| 张家港市| 盐亭县| 民权县| 昌都县| 平邑县| 东辽县| 百色市| 如东县| 长治市| 中阳县| 石泉县| 萝北县| 永仁县| 文安县| 淮阳县| 桓台县| 湖州市| 神木县| 会泽县| 镇雄县| 横峰县| 安阳市| 宝应县| 广河县| 湖南省| 芮城县| 镇平县| 盱眙县| 永修县| 梧州市| 长顺县| 迁西县| 大同市| 临海市|